Javascript idiosyncrasy:valueOf在if语句中的澄清?

时间:2017-02-15 08:50:16

标签: javascript

问题在于解决这个神奇的条件:

var magic = ???;

if(magic < 1 && magic > 1){
    console.log('Inside')
}

//magic solution 1 - WORKS

var magic = (function(){ 
    var val = -2; 

    return { 
        valueOf(){ 
            return val = val + 2; 
        } 
    } 
})();

// magic solution 2 - DOESN'T WORK

var magic = { 
    val: -2, 
    valueOf: function(){ 
        return this.val + 2; 
    } 
}; 

有人可以澄清这段代码的工作原理吗?我以为两者都是一样的。

1 个答案:

答案 0 :(得分:1)

这两个片段都使用了“有点魔法”这些片段。 JavaScript的一面:当在表达式中使用对象仅对基元有意义(例如与数字进行比较)时,通过ToPrimitive()操作将其转换为基元 - 使用valueOf()toString()对象本身的方法,取决于表达的特殊性(更多细节here)。

(magic < 1 && magic > 1)表达式中,此类强制转换(至少)发生两次,这是两个片段之间的差异。在第一个中,每次调用 valvalueOf()的值增加2 。使用console.log():

可以很容易地检查,顺便说一句
return { 
  valueOf(){
    val = val + 2;
    console.log(`And now it's ${val}`);
    return val; 
  } 
}

...给出以下输出:

  

现在它已经是0   而现在它是2   内部

然而,第二个代码段仅提供this.val + 2的结果,但从不修改this.val,结果始终为0.如果以这种方式编写:

valueOf: function(){
  return this.val += 2;
} 

......它与第一个完全相同。