我如何获得num的值?

时间:2019-09-26 14:46:16

标签: javascript

我收到了以下代码:

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!');
}

2 个答案:

答案 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并调用它
  • 如果未找到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!');
}