问题在于解决这个神奇的条件:
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 :(得分:1)
这两个片段都使用了“有点魔法”这些片段。 JavaScript的一面:当在表达式中使用对象仅对基元有意义(例如与数字进行比较)时,通过ToPrimitive()操作将其转换为基元 - 使用valueOf()
或toString()
对象本身的方法,取决于表达的特殊性(更多细节here)。
在(magic < 1 && magic > 1)
表达式中,此类强制转换(至少)发生两次,这是两个片段之间的差异。在第一个中,每次调用 val
时valueOf()
的值增加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;
}
......它与第一个完全相同。