gpt4 book ai didi

javascript - 为什么空数组类型转换为零? +[]

转载 作者:可可西里 更新时间:2023-11-01 01:17:34 24 4
gpt4 key购买 nike

就在我以为自己了解 JavaScript 中的类型转换时,我偶然发现了这个:

+[]; // 0
Number([]); // 0

我的第一个想法是我应该得到 NaN,就像我尝试将空对象转换为数字一样:

+{}; // NaN
Number({}); // NaN

我一直在寻找这个,但没有成功......

有人能解释一下为什么它被转换为 0 而不是 NaN 吗?

这种行为标准吗?

谢谢。

最佳答案

简单来说,有两个关键点:

例如,我们可以使用一个对象,它定义了一个toString 方法,并返回一个空字符串以获得等效的结果:

var obj = { toString: function () { return "";} };
+obj; // 0
Number(obj); // 0

这种行为是完全标准的。

现在是长答案:

两者,unary plus operatorNumber constructor called as a function内部使用 ToNumber抽象操作。

ToNumber 将使用另外两个内部操作,ToPrimitive[[DefaultValue]] .

ToNumber 操作应用于对象时,例如您示例中的空数组,它会调用 ToPrimitive 操作,以获取具有代表性的原始值并调用 ToNumber 再次使用该值 [1]

ToPrimitive 操作接收两个参数,一个值(这是您的数组对象)和一个提示类型,在本例中是“数字”,因为我们要进行数字转换。

ToPrimitive 调用 [[DefaultValue]] 内部方法,同样使用“Number”提示类型。

现在,由于我们使用的提示类型是“Number”,[[DefaultValue]] 内部方法现在将首先尝试调用对象上的 valueOf 方法.

数组对象没有特定的valueOf方法,该方法是继承自Object.prototype.valueOf的方法。 ,并且此方法仅返回对对象本身的引用。

由于 valueOf 方法没有产生原始值,现在 toString 方法被调用,它产生一个空字符串(这是一个原始值),然后 ToNumber 操作将尝试进行字符串-数字转换,最终以 0 [1].

但现在您可能想知道,为什么空字符串会强制为零?

+""; // 0

ToNumber internal operation is applied to a String type 时使用了完整的语法, StringNumericLiteral 产生式。

它与 NumericLiteral 有一些区别,其中一个区别是:

A StringNumericLiteral that is empty or contains only white space is converted to +0.

关于javascript - 为什么空数组类型转换为零? +[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3306453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com