将value值转换为字符串⽅法以及原理详解
这三种将value转换为字符串的⽅法是:
1. String()
2. “” + value
3. String(value)
第⼀种⽅法不推荐
因为null和undefined去调⽤toString⽅法会报错
第⼆种和第三种⽅法的效果基本⼀样
“” + value这种⽅法熟悉使⽤的⼈很容易理解,⽽且⽅便,但是它的可读性是很差的,不利于代码的维护。
String(value):这种⽅法可读性更好,唯⼀的问题是,这种函数调⽤可能会迷惑⼈。因为String同时也是⼀个构造函数,但是它作为普通函数和作为构造函数时的表现完全不同。
String('abc') === new String('abc');
> false
typeof String('abc');
> 'string'
typeof new String('abc');
> 'object'
String('abc') instanceof String;
> false
new String('abc') instanceof String;
> true
String作为⼀个普通函数会产⽣⼀个字符串(原始值)
String作为⼀个构造函数时会产⽣⼀个String对象的实例
“”+value 和 String(value)的细微差别
这两种⽅法都是使⽤引擎内部的ToString()操作将原始值转换为字符串。
“内部操作”的意思是:这个操作函数是在ECMAScript5.1中定义的,但是ES语⾔本⾝并不能访问到它,下⾯的表格解释了ToString()是如何转换原始值的。string转date的方法
将原始值转换为字符串
参数结果
undefined“undefined”
null“null”
布尔值“true”或”false”
数字数字作为字符串
字符串⽆需转换
将对象转换为字符串
这两种⽅法都将对象值先转化为原始值,然后再将原始值转化为字符串。
但是在这个过程之中
+使⽤的是内部的ToPrimitive(Number)操作(除⾮被转化的对象是date对象),
⽽String()⽤的是ToPrimitive(String)。
ToPrimitive(Number):将⼀个对象转换为原始值,⾸先调⽤obj.valueOf()。如果返回值是⼀个原始值,则返回这个原始值,如果不是,再调⽤String()。如果返回的值是原始值,则返回这样原始值,否则,抛出TypeError异常。
ToPrimitive(String):和上⾯的⽅法类似,只是先调⽤String()⽅法。
通过案例查看
var obj = {
valueOf:function(){
console.log('valueOf');
return {};//不是原始值,继续执⾏
},
toString:function(){
console.log('toString');
return {};//不是原始值,继续执⾏
}
}
// 运⾏
> "" + obj
valueOf
toString
TypeError: Cannot convert object to primitive value
> String(obj)
toString
valueOf
TypeError: Cannot convert object to primitive value
通常结果总相同
上⾯讲的区别,在实际情况中⼏乎不太可能遇到,因为:⼤部分的对象都使⽤了默认的valueOf()⽅法,返回的值总是这个对象本⾝。
> var x = {}
> x.valueoOf() === x
true
因此,ToPrimitive(Number)通常会跳过valueOf⽅法返回toString()⽅法的返回值,这就表现的和ToPrimitive(String)完全⼀样,但是,如果这个对象是Boolean,Number或者String的对象实例,那么它的valueOf()会返回⼀个原始值(被这个对象包装前的原始值),那么这两种操作就会按照如下步骤执⾏:
- ToPrimitive(Number)返回了对象的valueOf()⽅法的返回值(被包装前的原始值)再经过ToString()操作后的结果
- ToPrimitive(String)返回了对象的toString()⽅法的返回值(在该对象被包装前的原始值上进⾏ToString()操作的返回值)。
就这样,他们还是返回了相同的结果,只是转换的途径不同。
结论
你应该选择哪种⽅式来将其他类型的值转换为字符串呢?
如果你能确保这个值永远不会是null或者undefined,则可以⽤String()来转换,否则,”“+value和String(value)选择哪⼀个都可以,看个⼈喜好,个⼈认为String(value)更明确⼀点。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论