JavaScript中的对象到原语的转换

JavaScript中的对象到原语的转换,javascript,primitive,Javascript,Primitive,我读了一本关于JS的书,无法理解接下来的事情: 2 + null // => 2: addition after null converts to 0 2 + undefined // => NaN: addition after undefined converts to NaN 我了解到JS如何使用toString()和valueOf()将对象转换为基本值,但是null和undefined没有这样的方法-它是如何工作的?您可以阅读以下内容,例如: 。。。然而,需要更多解释的关键

我读了一本关于JS的书,无法理解接下来的事情:

2 + null // => 2: addition after null converts to 0
2 + undefined // => NaN: addition after undefined converts to NaN

我了解到JS如何使用
toString()
valueOf()
将对象转换为基本值,但是null和undefined没有这样的方法-它是如何工作的?

您可以阅读以下内容,例如:

。。。然而,需要更多解释的关键机制是ToPrimitive函数。此函数用于获取任意值并获取相应的基元值。如果输入已经是一个原语值,那么该值将在不进行转换的情况下返回。但是,如果该值是非基本值,则它将调用内部[[DefaultValue]]方法来查找对象的默认值


简言之,这是一种内在机制

根据ECMAScript规范,当应用加法运算符(+)且给定操作数的基元值不是字符串时,两个操作数都转换为基元值,然后转换为这些基元值的数值并相加。比如说

let x = 2 + null;
在这里,2和null都被转换成原语值,即2(数字已经是原语)和null(已经是原语)。然后使用ToNumber函数将其转换为数字,该函数根据给出的值2和+0分别表示2和null。现在,价值观变成了

let x = 2 + (+0);
变成

let x = 2 + 0;
变成2。因为null和undefined已经是基本值。此处不需要[[DefaultValue]],也就是说,不需要使用valueOf,因为它已经是一个基本值。valueOf或toString仅适用于中提到的对象类型的值