我收到了以下代码:
if (num == 100 && num== 200 && num==300) {
console.log('it works!');
}
该条件必须为真,以便显示“它有效!”在控制台中。
我在这里获得了这些代码,非常想知道它是如何工作的。另外,valueOf和toString有什么区别?
任何解释将不胜感激。 谢谢!
const num = {
value: 0,
valueOf: function() {
this.value += 100;
return this.value;
}
}
if (num == 100 && num== 200 && num==300) {
console.log('it works!');
}
-
const num = {
value: 0,
toString: function() {
this.value += 100;
return this.value;
}
}
if (num == 100 && num== 200 && num==300) {
console.log('it works!');
}
答案 0 :(得分:1)
这有点棘手...。但是
if (num == 100 && num== 200 && num==300)
每次进行比较时,此行将评估'num'。
现在这些行:
value: 0,
toString: function() { // valueOf is the 'same' almost
this.value += 100;
return this.value;
}
使用值属性和方法定义对象。 每次要比较您的对象时,由于它不是值类型,因此引擎将查找“ valueOf”方法,如果找不到,它将尝试调用该对象的“ toString”方法。这是作为开发人员在幕后进行的。
现在,由于您的求值器函数和toString实际上每次在if语句中看到num时,实际上会将对象的“实际”值增加100,因此将其递增100。因此,在检查第一个语句时,num得到其值field +=100
,进行比较并通过。
接下来,当num == 200
的时间再次增加100(在评估期间),然后才将控制返回到比较执行,因此,当需要比较值时,也是如此。
第三次是相同的概念。
希望你明白我的意思。
TLDR:由于num不是“值类型”,所以比较器将查找valueOf或toString(取决于它在语句中尝试匹配的类型),并且您的评估器在后台增加值! >
答案 1 :(得分:1)
如果将两个函数都添加到const中,您将看到仅调用valueOf
。如果删除valueOf
,则会调用toString
。这意味着,每次您尝试将对象num
与某个值进行比较时,javascript都会尝试
valueOf
并调用它toString
方法,然后将其与标量值进行比较const num = {
value: 0,
valueOf: function () {
console.log('Called valueOf');
this.value += 100;
return this.value;
},
toString: function () {
console.log('Called toString');
this.value += 100;
return this.value;
}
}
if (num == 100 && num == 200 && num == 300) {
console.log('it works!');
}