2017-02-15 92 views
0

问题是解决了这个神奇的条件:Javascript idiosyncrasy:valueOf澄清if语句?

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; 
    } 
}; 

有人能澄清这个片段是如何工作的?我以为两者都是一样的。

+0

这两个例子都可以正常工作,但它们甚至都不是相同的,所以如果第二个不起作用,那么您可能会错误地使用它,但是因为您没有真正向我们展示您打算如何使用它,甚至要求一个适当的问题,这很难回答? – adeneo

+0

@adeneo对于第二个魔法对象它不符合条件..所以问题是为什么它不? –

回答

0

这两个片段都使用JavaScript的'kinda-magic'一面:当对象用于仅适用于基元的表达式时(例如与数字进行比较),通过ToPrimitive()操作将其转换为基元 - 要么与valueOf()toString()对象本身的方法,具体取决于表达式的特性(更多详细信息here)。

(magic < 1 && magic > 1)(magic < 1 && magic > 1)表达式这样的投射发生(至少)两次,这就是两个片段之间的区别。在第一个中,val的值每次增加2 valueOf()被调用。这很容易检查,顺便说一句,用的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; 
} 

......它的工作原理与第一个完全相同。