7

使用运算符为属性分配一个数字+=给我NaN在 JavaScript 中。

此代码按预期工作:

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

但在这里我们得到NaN

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

为什么 JavaScript 会有这样的行为?我怎样才能在不初始化的情况下让它工作result['value'] = 0

4

8 回答 8

11

此行test['value'] += 10等于test['value'] = undefined + 10,即NaN(非数字)。

于 2015-02-06T14:19:34.290 回答
7

您不能undefined在 JavaScript 中添加数字。如果您不想初始化数字,则需要在递增之前测试它是否为:undefined

test['value'] = (typeof test['value']==='undefined') ? 10 : test['value']+10;
于 2015-02-06T14:24:14.720 回答
6

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

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;
于 2015-02-06T14:22:12.057 回答
3

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

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

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

var test = {};
test.value = 0;
test.value += 10;
于 2015-02-06T14:20:55.437 回答
1
test['value'] += 10;

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

于 2015-02-06T14:21:18.433 回答
1

为什么 JavaScript 会有这样的行为?

因为当属性不存在时,访问它默认为undefined; undefined并在向您添加号码时NaN返回。

我怎样才能在不初始化的情况下让它工作result['value'] = 0

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

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

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

test.value |= 0;
test.value += 10;
于 2015-02-06T15:09:35.370 回答
0

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

test['value']? test['value']+=10 : test['value']=10
于 2015-02-06T14:23:25.047 回答
0

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

于 2020-01-12T03:09:33.793 回答