我正在研究一个现有的库,我对在对象上使用算术运算感到困惑。
用于算术运算的对象如下所示:
{
_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);
}
问题:
如果在对象上应用模数等算术运算或将其与数字进行比较,会发生什么?
如果可能,请将给定的代码段重写为使用对象属性的内容。
答案 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() 你可以在那里实现自己的逻辑。
var obj = {
a: 11,
b: 30,
valueOf: function () {
return this.a + this.b;
}
}
if (obj> 40) {
alert(obj + 1);
}