使用+;=在javascript中提供NaN

使用+;=在javascript中提供NaN,javascript,nan,compound-assignment,Javascript,Nan,Compound Assignment,在JavaScript中,使用+=操作符将一个数字分配给属性会得到NaN 此代码按预期工作: > var result = {}; undefined > result['value'] = 10; 10 > result['value'] += 10; 20 但是这里我们得到了NaN: > var test = {}; undefined > test['value'] += 10; NaN 为什么JavaScript的行为是这样的?在不初始化结果['valu

在JavaScript中,使用
+=
操作符将一个数字分配给属性会得到
NaN

此代码按预期工作:

> var result = {};
undefined
> result['value'] = 10;
10
> result['value'] += 10;
20
但是这里我们得到了
NaN

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

为什么JavaScript的行为是这样的?在不初始化
结果['value']=0
的情况下,我如何使其工作?

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

因为
测试['value']
未定义的。在未定义的
中添加一个数字将为您提供
NaN
(表示“非数字”)。在添加值之前,需要初始化该值:

var test = {};
test['value'] = 0;
test['value'] += 10;
test.value |= 0;
test.value += 10;
由于您使用的是对象,因此也可以使用点表示法:

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

但是,
test['value']
是未定义的,因为您还没有初始化它

这是因为您试图将
10
添加到对象的
未定义的属性中,因此您的行将导致执行以下操作:

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中,不能向未定义的
中添加数字。如果不想初始化数字,则需要在递增之前:

test['value'] = (typeof test['value']==='undefined') ? 10 : test['value']+10;
为什么JavaScript的行为是这样的

因为当属性不存在时,访问它的默认值为
undefined
;当向
undefined
添加一个数字时,返回
NaN

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

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

test.value = ('value' in test ? test.value : 0) + 10;
另一种方法是在每次添加属性之前将其强制转换为一个数字:

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

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

初始化它有什么问题?那么,将“未定义”和一个数字相加时,您希望得到什么结果?看起来并不奇怪……从技术上讲,这只测试其值是否为“false”。Ecmascript5条件运算符的定义:
LogicalORExpression?AssignmentExpression:AssignmentExpression
那么这里定义了
AssignmentExpression
,不过你还没有告诉OP如何解决他的问题。@Blazemonger我只想把钓竿给他。这会更有趣。这是个好主意,但应该通过评论来完成。当你提交答案时,你实际上应该“回答”整个问题。你能再解释一下吗?