使用 += 赋值在 javascript 中给出 NaN

Assigning using += gives NaN in javascript

使用 += 运算符为属性分配一个数字在 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 的情况下让它工作?

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

因为test['value']undefined。将一个数字添加到 undefined 将得到 NaN(代表 "Not a Number")。您需要在添加之前初始化该值:

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

由于您使用的是对象,因此您还可以使用点符号:

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

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

发生这种情况是因为您试图将 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;

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

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

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

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

Why does JavaScript behave like this?

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

How can I get this to work without initializing result['value'] = 0?

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

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

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

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

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