js中,进行强制类型转换时,对象的toString和valueOf方法被调用的顺序

以下所有的讨论都要满足一个条件,就是用户自己不自定义对象的toString方法和valueOf方法。
先预定义三个变量a,b,c。并修改它们的toString和valueOf方法

var a = new Number(123);
a.toString = function(){
    console.log('call a.toString');
    return new Number(123).toString();
};
a.valueOf = function(){
    console.log('call a.valueOf');
    return new Number(123).valueOf();
};

var b = new String('b-string');
b.toString = function(){
    console.log('call b.toString');
    return new String('b-string').toString();
};
b.valueOf = function(){
    console.log('call b.valueOf');
    return new String('b-string').valueOf();
};

var c = {}
c.toString = function(){
    console.log('call c.toString');
    return {}.toString();
};
c.valueOf = function(){
    console.log('call c.valueOf');
    return {}.valueOf();
};

当使用Number()进行强制类型转换时

var res = Number(a);//call a.valueOf
console.log(a);//123
var res = Number(b);//call b.valueOf
console.log(b);//NaN
var res = Number(c);/*call c.valueOf
                      call c.toString
*/            
console.log(c);//NaN

上面的代码说明,当使用Number()进行强制类型转换时,当参数为new Number()或者new String()时,调用valueOf函数;当参数为{ }时,先调用valueOf函数,再调用toString函数。


当使用String()进行强制类型转换时

var res = String(a);//call a.toString
console.log(res);//123
var res = String(b);//call b.toString
console.log(res);//b-string
var res = String(c);//call c.toString
console.log(res);//[object Object]

上面的代码说明,当使用String()进行强制类型转换时,对于new Number(),new String()和{ },都调用toString函数。

猜你喜欢

转载自blog.csdn.net/weixin_33845477/article/details/90771895