关于JS对象的toString()方法
2019-08-20 本文已影响0人
明里人
借鉴与老师写的一篇文章,原文地址:https://www.jianshu.com/p/25001441ffba
变量a在什么情况下会满足这三个条件,打印出1?
var a = ?
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
解题:
var a = {
i: 1,
toString: function() {
return a.i ++;
}
}
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
思路:
1、JavaScript对象在与 字符串拼接或者比较 时,首先会通过valueOf()方法获取其原始值。原始值就是其本身。
var a = {};
console.log(a.valueOf()); // {}
console.log(a === a.valueOf()); // true
2、如果valueOf值为对象,则会去调用对象的toString()方法。若该对象内部没有重写实现该方法,会调用对象共有的toString()方法,返回"[object Object]"。
var a = {};
console.log(a.toString()); // [object Object] 类型为string
console.log(a.toString() + 1); // [object Object]1 返回结果为字符串,拼接1
console.log(a + 1 === a.toString() + 1); // true;
3、如果对象下有重写toString()方法,会执行该方法:
var a = {
toString() {
return 1;
}
}
console.log(a.toString()); // 1
console.log(a.toString() - 1); // 0
console.log(a - 1 === a.toString() - 1); // true 进行比较对象a会执行valueOf()和toString()方法。
4、以上可以看出对象每进行一次比较或拼接都会执行toString()方法。
var num =1;
var a = {
toString(){
return ++num;
}
};
console.log(a + "");// 2
console.log(a + "");// 3
console.log(a + 1);// 5
console.log(a == 5);// true
5、最终实现结果:
// 使用 toString 实现:
var a = {
i: 1,
toString: function() {
return a.i ++;
}
}
// a == 1 比较时,a对象会调用toString()方法,返回结果与1进行比较。
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
// 使用 valueOf 实现:
let a = {
i: 0,
valueOf: function() {
return ++ a.i;
}
}
if (a == '1' && a == '2' && a == '3') {
console.log(typeof obj); // object
}
注意:不论是 toString 方法或者是 valueOf 方法实现, 都不可以使用全等去判断a,因为此时a的类型为对象。