在某个操作或者运算需要字符串的时候,会触发 Object 的 String 转换,举个栗子:
var obj = {name: ‘Coco’};
var str = ‘123’ + obj;
console.log(str); // 123[object Object]
转换规则:
1.如果 toString 方法存在并且返回原始类型,返回 toString 的结果。
2.如果 toString 方法不存在或者返回的不是“原始类型”,调用 valueOf 方法,如果 valueOf 方法存在,并且返回“原始类型”数据,返回 valueOf 的结果。
3.其他情况,抛出错误。
上面的例子实际上是:
var obj = {name: ‘Coco’};
var str = ‘123’ + obj.toString();
其中, obj.toString() 的值为 “[object Object]” 。
假设是数组:
var arr = [1, 2];
var str = ‘123’ + arr;
console.log(str); // 1231,2
上面 + arr 其实是调用了 + arr.toString() 。
但是,我们可以自己改写对象的 toString , valueOf 方法:
var obj = {
toString: function() {
console.log(‘调用了 obj.toString’);
return ‘111’;
}
}
alert(obj);
// 调用了 obj.toString
// 111
上面 alert(obj) ,obj 会自动调用自己的 obj.toString() 方法转化为原始类型,如果我们不重写它的 toString 方法,将输出 [object Object] ,这里我们重写了 toString ,而且返回了一个原始类型字符串 111 ,所以最终 alert 出了 111。
上面的转化规则写了, toString 方法需要存在并且返回原始类型,那么如果返回的不是一个原始类型,则会去继续寻找对象的 valueOf 方法:
下面我们尝试证明如果 toString() 方法不可用的时候系统会调用 valueOf() 方法,下面我们改写对象的 valueOf :
var obj = {
toString: function() {
console.log(‘调用了 obj.toString’);
return {};
},
valueOf: function() {
console.log(‘调用了 obj.valueOf’)
return ‘110’;
}
}
alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// 110
从结果可以看到,当 toString 不可用的时候,系统会再尝试 valueOf 方法,如果 valueOf 方法存在,并且返回原始类型(String、Number、Boolean)数据,返回 valueOf 的结果。
那么如果, toString 和 valueOf 返回的都不是原始类型呢?看下面这个例子:
var obj = {
toString: function() {
console.log(‘调用了 obj.toString’);
return {};
},
valueOf: function() {
console.log(‘调用了 obj.valueOf’)
return {};
}
}
alert(obj);
// 调用了 obj.toString
// 调用了 obj.valueOf
// Uncaught TypeError: Cannot convert object to primitive value
可以发现,如果 toString 和 valueOf 方法均不可用的情况下,系统会直接返回一个错误。
转载请注明来源网站:blog.ytso.com谢谢!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14956.html