一般我们都是使用toString()来将数据转换为字符串的,但其实toString()和valueOf()都是用来获取值的,那它们有什么区别呢?我们通过下面这个例子来理解一下。
首先,有下面这样一个对象o:
var o = {
a: 1,
valueOf: function () {
console.log("aaa");
return ++this.a;
},
toString: function () {
console.log("bbb");
return "3";
},
};
1、如果我们直接打印对象o
console.log(o);
结果是
看起来和普通的对象没有区别。
2、如果我们执行下面的操作:
console.log(o==2);
console.log(o==3);
console.log(o==4);
结果会是先后打印3次 “aaa” 和 true ,
这说明这三次的打印过程中,都执行了对象o的valueOf方法。
3、如果我们进行下面的运算:
console.log(o + 1);
结果会是先打印 “aaa” ,再打印 3 。
这说明打印过程中执行了对象o的valueOf方法。
如果我们进行的运算是:
console.log(o + "1");
结果会是先打印 “aaa” ,再打印 “21” 。
这也说明打印过程中执行了对象o的valueOf方法。
为什么会出现上面的结果呢?
其实这里toString()和valueOf()的调用规则如下:
1、强制转换数值时调用valueOf()
2、强制转换字符时调用toString()
3、隐式转换时调用valueOf(),返回valueOf()方法return的值
当我们使用==、+等运算符时其实都是在进行运算,而运算,这时就会调用的时候就会进行隐式转换,从而调用对象o的valueOf方法。
而强制转换我们分别执行下面的语句,根据相应的打印结果就可以证明了。
console.log(String(o)); //先打印"bbb",再打印"3"
console.log(Number(o)); //先打印"aaa",再打印2