【问题标题】:JavaScript: The result of undefined++ is NaN, not undefined?JavaScript:undefined++的结果是NaN,不是undefined?
【发布时间】:2020-01-30 10:50:59
【问题描述】:

第一个 console.log 输出是 2。毫无疑问。
但是为什么第二个 console.log 输出不是未定义的?一开始不应该输出未定义的,那么变量b就变成了NaN?

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

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

【问题讨论】:

  • 是的,这是合乎逻辑的。未定义 + 1 是 NaN
  • x++ 计算结果为 Number(<previous value of x>),而不是 <previous value of x>,因为它是数字运算符。足够合乎逻辑,不会真的出现,它就是这样工作的。

标签: javascript undefined increment var hoisting


【解决方案1】:

考虑一下:

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

由于后缀++ 返回递增前的值,我们预计cfoo,然而,它是NaN。这是为什么呢?

这是设计使然,并在标准中描述如下(强调我的):

12.4.4.1 Runtime Semantics: Evaluation

UpdateExpression:LeftHandSideExpression++

  1. 令 lhs 为计算 LeftHandSideExpression 的结果。

  2. 让 oldValue 为 ? ToNumber(?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,这就是我们得到的。

另一个需要注意的 JavaScript 怪癖!

【讨论】:

  • 我多次查看您的答案。终于明白了。非常感谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    var a = 2;

    在这里,您声明了一个值为“2”的变量“a”,使其数据类型为“INTEGER”。

    console.log(a++);
    

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

    var b;

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

    console.log(b++);

    输出为 NaN,因为变量“b”为空,因此不能应用自增运算符。

    【讨论】:

    • The output is NaN because the variable "b" doesnot have a default value 这句话不正确。更多详情请参考@georg 评论。
    • @slesh 这一行是 100% 正确的,输出为 NaN 因为变量“b”没有默认值,因为没有任何初始值的 b 的值为 null,您不能将 ++ 应用于空值,因此它是 Nan
    • 您得到 NaN 是因为您将算术运算应用于 undefined,但不是因为 b 没有默认值。
    猜你喜欢
    • 2012-09-20
    • 2017-03-07
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2016-08-20
    相关资源
    最近更新 更多