Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么空数组类型转换为零+;[]_Javascript_Type Conversion - Fatal编程技术网

Javascript 为什么空数组类型转换为零+;[]

Javascript 为什么空数组类型转换为零+;[],javascript,type-conversion,Javascript,Type Conversion,就在我认为我理解了JavaScript中的类型转换时,我遇到了以下问题: +[]; // 0 Number([]); // 0 我的第一个想法是我应该得到NaN,就像我试图将一个空对象转换为数字一样: +{}; // NaN Number({}); // NaN 我已经搜索了一段时间,但没有任何成功 有人能解释一下为什么它被转换成0而不是NaN吗 这是行为标准吗 谢谢。简而言之,有两个要点: 空数组的toString方法返回空字符串 空字符串使用或强制为零(例如+“”==0;) 例如,我

就在我认为我理解了JavaScript中的类型转换时,我遇到了以下问题:

+[]; // 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?