0
var x = 1;
var obj = {
  valueOf: function() {
    x = 2;
    return 0;
  }
};
console.log(x); //1
console.log(obj.valueOf()); //0
console.log(obj); //Object
console.log(obj == 0,x); // true 2

1问:为什么都是输出x,两者值不同?
2问:obj出来的是个Object,为什么和0比较会true?
3问:接上问,出现true,是因为==的类型转换吗?那我把obj里的valueOf改成其它对象名,为什么就变成false了(如下)?

var x = 1;
var obj = {
  asd: function() {
    x = 2;
    return 0;
  }
};
console.log(x); //1
console.log(obj.asd()); //0
console.log(obj); //Object
console.log(obj == 0,x); // false 2
Yittang 264
2017-11-08 提问

查看全部 4 个回答

8

已采纳
  1. 执行valueOf的时候,里面的x = 2把外部的x值给改了。
  2. 类型不同做比较的过程中调用了valueOf,而你给当前对象添加了valueOf,就不会调用原型链上的valueOf了,所以拿到了0。这个可以搜下相等比较的相关问题。
  3. 同2。

相等比较的东西仅供参考,因为我记不清了,可能有错误。

var a = {}
a.valueOf = function () {console.log('valueOf');return 1}
a.toString = function () {console.log('toString')}
a == 1
// 可看到打印出了
// valueOf
// 如果将valueOf方法改为
a.valueOf = function () {console.log('valueOf');return a}
// 即返回一个非基本数据类型,会看到
// valueOf
// toString

也就是会先调用valueOf,如果拿到的不是基本数据类型(这一点不太确定)还会再调用toString
好像Date类型的数据调用的顺序也不一样,你再自己查查相等判断的规则吧。

推广链接