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

undefinedJavaScriptで数値を追加することはできません。数値を初期化したくない場合は、数値をインクリメントする前にテストする必要があります。undefined

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

10これは、オブジェクトのundefinedプロパティに追加しようとしているために発生するため、行は次のようになります。

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

NaNJavaScript では、不明な値を引き起こすすべての数値式が(数値ではない) に変換されます。機能させるには、そのプロパティが存在し、数値があるかどうかを確認してから、数値を追加する必要があります。それ以外の場合は、作成する必要があります。さらに、オブジェクトを操作しているため、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。に数字を追加すると、 (「Not a Number」の略)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

Why does JavaScript behave like this?

Because when the property does not exist, accessing it defaults to undefined; and when adding a number to undefined you get NaN back.

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

If you don't want to (or can't) initialize it once, you will need to check every time whether the property exists, basically:

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

Another approach would be to cast the property to a number every time before adding to it:

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 に答える