【问题标题】:Assigning using += gives NaN in javascript使用 += 赋值在 javascript 中给出 NaN
【发布时间】:2015-04-06 17:05:53
【问题描述】:

在 JavaScript 中使用 += 运算符为属性分配一个数字会得到 NaN

此代码按预期工作:

> var result = {};
undefined
> result['value'] = 10;
10
> result['value'] += 10;
20

但是在这里我们得到NaN:

> var test = {};
undefined
> test['value'] += 10;
NaN

为什么 JavaScript 会这样?如何在不初始化 result['value'] = 0 的情况下使其工作?

【问题讨论】:

  • 初始化有什么问题?
  • 那么当总结“未定义”和一个数字时,您希望结果是什么?好像没那么奇怪……

标签: javascript nan compound-assignment


【解决方案1】:

这一行test['value'] += 10 等于test['value'] = undefined + 10,即NaN(不是数字)。

【讨论】:

  • 你还没有告诉 OP 如何解决他的问题。
  • @Blazemonger 我只想给他钓鱼竿。会更有趣。
  • 一个好主意,但应该用 cmets 完成。当您提交答案时,您实际上应该“回答”整个问题。
【解决方案2】:

因为test['value']undefined。向undefined 添加一个数字会得到NaN(代表“非数字”)。您需要在添加之前初始化该值:

var test = {};
test['value'] = 0;
test['value'] += 10;

由于您使用的是对象,因此您也可以使用点表示法:

var test = {};
test.value = 0;
test.value += 10;

【讨论】:

    【解决方案3】:
    test['value'] += 10;
    

    相当于
    test['value'] = test['value'] + 10;
    但是,test['value'] 是未定义的,因为你还没有初始化它

    【讨论】:

      【解决方案4】:

      发生这种情况是因为您尝试将 10 添加到对象的 undefined 属性中,因此您的行将导致:

      test['value'] = undefined + 10; // NaN
      

      每个导致未知值的数值表达式在 JavaScript 中都会变成 NaN(不是数字)。要使其工作,您应该检查该属性是否存在并具有数值,然后添加一些数字;否则你将不得不创建它。另外,由于您使用的是对象,因此您可以使用test.value 而不是test['value']

      这是一个例子:

      if (Number(test.value)) test.value += 10;
      else test.value = 10;
      
      // Or more neatly:
      test.value = +test.value ? test.value + 10 : 10;
      

      【讨论】:

        【解决方案5】:

        在添加值之前检查测试值是否未定义:

        test['value']? test['value']+=10 : test['value']=10
        

        【讨论】:

        【解决方案6】:

        您不能在 JavaScript 中将数字添加到 undefined。如果不想初始化数字,需要在递增之前test if it's undefined

        test['value'] = (typeof test['value']==='undefined') ? 10 : test['value']+10;
        

        【讨论】:

          【解决方案7】:

          为什么 JavaScript 会这样?

          因为当属性不存在时,访问它默认为undefined;当向undefined 添加数字时,您会得到NaN

          如何在不初始化 result['value'] = 0 的情况下使其工作?

          如果您不想(或不能)初始化一次,则需要每次检查该属性是否存在,基本上:

          test.value = ('value' in test ? test.value : 0) + 10;
          

          另一种方法是在每次添加之前将属性转换为一个数字:

          test.value |= 0;
          test.value += 10;
          

          【讨论】:

            【解决方案8】:

            因为无法添加 NaN。您需要有一个数字才能使用 +=

            【讨论】:

            • 你能再解释一下吗?
            猜你喜欢
            • 1970-01-01
            • 2013-06-15
            • 1970-01-01
            • 2018-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多