Javascript 为什么空数组类型转换为零+;[]
就在我认为我理解了JavaScript中的类型转换时,我遇到了以下问题:Javascript 为什么空数组类型转换为零+;[],javascript,type-conversion,Javascript,Type Conversion,就在我认为我理解了JavaScript中的类型转换时,我遇到了以下问题: +[]; // 0 Number([]); // 0 我的第一个想法是我应该得到NaN,就像我试图将一个空对象转换为数字一样: +{}; // NaN Number({}); // NaN 我已经搜索了一段时间,但没有任何成功 有人能解释一下为什么它被转换成0而不是NaN吗 这是行为标准吗 谢谢。简而言之,有两个要点: 空数组的toString方法返回空字符串 空字符串使用或强制为零(例如+“”==0;) 例如,我
+[]; // 0
Number([]); // 0
我的第一个想法是我应该得到NaN,就像我试图将一个空对象转换为数字一样:
+{}; // NaN
Number({}); // NaN
我已经搜索了一段时间,但没有任何成功
有人能解释一下为什么它被转换成0而不是NaN吗
这是行为标准吗
谢谢。简而言之,有两个要点:
- 空数组的
方法返回空字符串toString
- 空字符串使用或强制为零(例如
)+“”==0;
toString
方法,并返回一个空字符串以获得等效结果:
var obj = { toString: function () { return "";} };
+obj; // 0
Number(obj); // 0
这种行为是完全标准的
现在,答案很长:
和在内部都使用抽象操作
ToNumber
将使用另外两个内部操作,以及
当ToNumber
操作应用于对象时,例如示例中的空数组,它调用ToPrimitive
操作,以获取代表性的基本值,并使用该值再次调用ToNumber
ToPrimitive
操作接收两个参数,一个值(即数组对象)和一个提示类型,在本例中是“Number”,因为我们要进行数字转换
ToPrimitive
调用[[DefaultValue]]
内部方法,也使用“Number”提示类型
现在,由于我们使用的提示类型是“Number”,因此[[DefaultValue]]
内部方法现在将尝试首先调用对象上的valueOf
方法
数组对象没有特定的valueOf
方法,该方法是从继承的方法,该方法只返回对对象本身的引用
由于valueOf
方法没有产生一个基元值,现在调用toString
方法,并生成一个空字符串(这是基元值),然后ToNumber
操作将尝试进行字符串编号转换,最后得到0
[1]
但现在您可能会想,为什么空字符串强制为零
+""; // 0
有一个完整的语法,在生成时使用StringNumericLiteral
数字文字之间有一些区别,其中一个区别是:
空的或仅包含空白的StringNumericLiteral将转换为+0
+1数组实际上是JavaScript中的一种对象类型,因此它有一个toString()方法。为什么数组对象没有value of method?