对象的算术运算

时间:2017-11-08 14:47:20

标签: javascript

我正在研究一个现有的库,我对在对象上使用算术运算感到困惑。

用于算术运算的对象如下所示:

{
  _high: 0,
  _low: 256,
  remainder: { _low: 0, high: 0, remainder: null }
}

他们的使用方式如下:

const id = {
  _high: 0,
  _low: 256,
  remainder: { _low: 0, high: 0, remainder: null }
};

while (id > 0) {
  const remainder = Math.floor(id % 14);
}

问题:

如果在对象上应用模数等算术运算或将其与数字进行比较,会发生什么?

如果可能,请将给定的代码段重写为使用对象属性的内容。

2 个答案:

答案 0 :(得分:4)

You Don't Know JS: types & grammar, chapter 4

  

对象(和数组)将首先转换为它们的原始值等价物,并且根据刚刚提到的ToNumber规则将结果值(如果是基元但不是数字)强制转换为数字。

     

要转换为此原始值等效,ToPrimitive抽象操作(ES5规范,第9.1节)将查询有问题的值(使用内部DefaultValue操作-ES5规范,第8.12.8节)以查看它是否具有valueOf () 方法。如果valueOf()可用并返回原始值,则该值用于强制。如果不是,toString()将提供强制的值(如果存在)。

     

如果两个操作都不能提供原始值,则抛出TypeError。


所以,我假设你的对象有一个valueOf方法返回一个数字,所以在你对对象执行的两个算术运算中,调用该方法将对象强制转换为数字,结果值是在操作中实际使用的。

<小时/> 此外,您的示例非常无用,因为它不包含基础valueOf方法,当我们尝试执行id + 10之类的操作时,我们得到[object Object]10,为什么会这样?默认valueOf无法提供原语,因此会查询toString,返回[object Object],然后该原始值与10连接,从而生成{{} 1}}。

为了更好地理解这一点,请看一下这些例子:

1.

[object Object]10


2。

const id = {
_high: 0,
_low: 256,
remainder: { _low: 0, high: 0, remainder: null },
valueOf: function(){
return 20; /* valueOf does not fail to provide a primitive, "20" will 
be used". */
},
toString: function() {
return 10; /* toString's return value would be used (if it was a primitive), if "valueOf" failed to provide a primitive. */
}
};


console.log(id + 10); // prints out "30"  


3。

const id = {
_high: 0,
_low: 256,
remainder: { _low: 0, high: 0, remainder: null },
valueOf: function(){
return {}; // valueOf fails to provide a primitive
},
toString: function() {
return 10; // toString provides a primitive value, so "10" will be used.
}
};


console.log(id + 10); // prints out "20"

答案 1 :(得分:1)

回答:调用方法.valueOf() 你可以在那里实现自己的逻辑。

&#13;
&#13;
var obj = {
 a: 11,
 b: 30,
 valueOf: function () {
    return this.a + this.b;
 }
}

if (obj> 40) {
     alert(obj + 1);
}
&#13;
&#13;
&#13;