2015-02-06 69 views
2

使用+=运算符将属性赋值给属性给了我JavaScript中的NaN使用+ =赋予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

+9

初始化它有什么问题? – freefaller 2015-02-06 14:19:12

+0

那么当总结“未定义”和一个数字时,你会期望结果是什么?似乎并不奇怪...... – 2015-02-06 14:21:49

回答

2

不能在JavaScript中的号码添加到undefined。如果您不想初始化的数量,则需要test if it's undefined递增之前:

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

这是一个圆滑的代码来完成这件事。谢谢 – jsbisht 2015-02-07 12:27:22

10

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

+4

虽然你没有告诉OP如何解决他的问题。 – Blazemonger 2015-02-06 14:28:01

+0

@Blazemonger我只想给他钓鱼竿。这将会更有趣。 – Lewis 2015-02-06 14:31:50

+2

一个好主意,但应该用评论来完成。当你提交答案时,你实际上应该是“回答”整个问题。 – Blazemonger 2015-02-06 14:35:04

3

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

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

由于您使用一个对象,你也可以使用点符号:

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

相当于
test['value'] = test['value'] + 10;
但是,test['value']未定义,因为您尚未初始化它

5

这是因为你想添加10到对象的undefined属性,所以你的行会导致这样做:

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

这将导致一个未知值的每一个数值的表达变成NaN(非数字)在JavaScript。为了使它工作,你应该检查该属性是否存在并且有一个数值,然后向它添加一些数字;否则你将不得不创建它。另外,由于您使用的是对象,因此您可以使用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; 
0

检查测试值不加入前值未定义:

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

从技术上讲,这只会测试它的值是否为“falsey”。 – Blazemonger 2015-02-06 14:26:04

+0

Ecmascript5条件运算符的定义:http://www.ecma-international.org/ecma-262/5.1/#sec-11.12 LogicalORExpression? AssignmentExpression:AssignmentExpression' then 'AssignmentExpression'在这里定义http://www.ecma-international.org/ecma-262/5.1/#sec-11.13 – lifeisfoo 2015-02-07 13:02:34

0

为什么的JavaScript这样的表现?

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

我怎样才能得到这个工作,而不需要初始化result['value'] = 0

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

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

另一种方法是投该属性每次添加到它之前:

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