在我看来,Number构造函数将调用String([]),因此Number([])等于Number("")。所以它返回0。此外,Number构造函数将调用String({}),因此Number({})等于Number("[object Object]")。所以它返回NaN。但我不确定。
发布于 2021-09-15 01:53:39
是的,你是对的。
number构造函数在其参数上调用will call ToNumeric,然后在其上调用ToNumber,后者使用Number提示调用对象上的ToPrimitive,这导致OrdinaryToPrimitive被调用,该函数
1. If hint is string, then
a. Let methodNames be « "toString", "valueOf" ».
2. Else,
a. Let methodNames be « "valueOf", "toString" ».
3. For each element name of methodNames, do
a. Let method be ? Get(O, name).
b. If IsCallable(method) is true, then
i. Let result be ? Call(method, O).
ii. If Type(result) is not Object, return result.提示是number,所以调用的方法名称首先是valueOf,然后是toString (如果不存在)。
如果是普通对象,则valueOf返回对象本身,如果是数组,则返回数组本身,因此这是没有帮助的-它将转移到toString。
Array.prototype.toString返回已联接的数组值- arr.toString()等同于arr.join(',')。空数组加入到空字符串中。所以
Number([])变成了
Number('')因此,空字符串变成了0。
但是,当对对象调用toString时,会给出[object Object]
console.log({}.toString());
它不能被强制转换成一个数字,因此是NaN。
https://stackoverflow.com/questions/69186099
复制相似问题