JavaScript: undefined++的结果是NaN,而不是undefined?

5

第一个console.log的输出为2,毫无疑问。
但是为什么第二个console.log不是undefined呢?难道不应该先输出undefined,然后变量b变成NaN吗?

var a = 2;
console.log(a++);

var b;
console.log(b++);

1
是的,这是合乎逻辑的。Undefined + 1 等于 NaN。 - kemicofa ghost
5
x++ 的计算结果为 Number(<x 的先前值>),而不是 <x 的先前值>,因为它是一个作用于数字的运算符。这个逻辑相当清晰,但实际上并不经常出现,它就是这样工作的。 - Ry-
3个回答

8
考虑这个:

b = "foo"
c = b++
console.log(c) 

由于后缀 ++ 返回递增前的值,我们期望 cfoo,但实际上是 NaN。为什么会这样呢?
这是有意设计的,并在标准中描述如下(重点在于此): 12.4.4.1 Runtime Semantics: Evaluation UpdateExpression:LeftHandSideExpression++
1. 让 lhs 成为评估 LeftHandSideExpression 的结果。 2. 让 oldValue 成为 ? GetValue(lhs) 转换成数字类型的结果。 3. 让 newValue 成为将值 1 添加到 oldValue 后得到的结果,使用与 + 运算符相同的规则(请参见 12.8.5)。 4. 执行 ? PutValue(lhs, newValue)。 5. 返回 oldValue。
将上述算法转化为类 JavaScript 语言,即为:
 function postIncrement(someVariable) {
     let oldValue = Number(someVariable.value); // Note "Number" here
     let newValue = oldValue + 1;
     someVariable.value = newValue;
     return oldValue;
 }

换句话说,value++ 不仅返回值,还将其转换为数字。转换发生在增加之前,由于 Number("foo")NaN,因此我们得到的就是 NaN。
这是需要注意的另一个 JavaScript 奇怪现象!

我已经仔细阅读了你的回答,最终理解了。非常感谢。 - Danson Lin

-3

在记录b之前,您需要为b分配值或检查null条件。 b为NaN,因为它的b ++是检查数值。


-3

var a = 2;

这里你声明了一个变量"a",它的值为"2",使其数据类型为"整数"。

console.log(a++);

输出结果为2,变量“a”的值为“3”。

var b;

在这里,您声明了一个没有任何值的变量“b”,使其数据类型为“未定义”。

console.log(b++);

输出结果为NaN,因为变量“b”为空,因此无法应用递增运算符。


1
输出为NaN是因为变量“b”没有默认值,这句话不正确。请参考@georg的评论以获取更多细节。 - slesh
@slesh 这行代码是100%正确的。输出结果为NaN,因为变量“b”没有默认值。由于未初始化的变量b的值为null,您不能对null值应用++运算符,因此它是NaN。 - Muhammad Hamza Mirza
1
你得到了 NaN,是因为你对 undefined 应用了算术运算,而不是因为 b 没有默认值。 - slesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接