2016-06-11 5 views
0

私はan article about javascript PRNGsを読んでいた、と私は私を驚かせた何かに出くわした:(なぜ) `array [NaN]`は何もしませんか?

var a = new Array(); 
var b; 
a[b++] = 1; 

aは今[]で、例外がスローされない - 配列への書き込みは、単純に消えます。あなたが私を信じていない場合は、ブラウザのコンソールで試してみてください。

私は彼を信じていなかったので、私は私のブラウザのコンソール(Firefoxの47)でそれを試してみた:

» var a = new Array(); 
» var b; 
» a[b++] = 1 

» a 
← Array [ ] 
» b 
← NaN 

はここで起こっていくつかの好奇心の事があるが、特に、私はよ文a[b++] = 1が何かをしていないように見える理由を理解しようとする。

+4

これはない - それは '[のNaN]に '1'を'割り当て。 'a [NaN]'にアクセスして、それがそこにあるのを見てください。また滑りやすい道です。あなたは、標準化されていないホストオブジェクトから何かを期待しています( 'console'はそうではありません)。だから、あなたが見ているものが期待されているかどうかをどうやって知っていますか? – zerkms

答えて

0

var a = new Array(); 
// 'a' is now an empty array, plain ol' boring empty array, could have been 
// written as a = []; 
var b; 
// 'b' have no value and is 'undefined'. 'console.log(b); // undefined' 
a[b++] = 1; 
// Lets break the above statement down into pieces: 
    b++  // Increment b by one, undefined + 1 === NaN 
a[ ]  // Use NaN as a property for our array 'a' 
     = 1; // Assign 1 to that property 
// Ok? So what happened why does 'a' still look empty? 
console.log(a); // [] 
// The way your console with show you an array is by printing the numeric keys 
// in it, and looking at the length, eg: 
// var q = []; 
// q.length = 1; 
// console.log(q); // [undefined x 1] 

// With 'a' in our case there is no numeric keys in it so [] is printed. 
// So did our value dissapear? 
// No. It is there: 
console.log('NaN' in a); // true 
// And: 
for (var prop in a) console.log(prop); // NaN 

// Why is this even a feature? 
// Arrays are extending Objects so they have the same properties as em. 
console.log(a instanceof Object); // true 
console.log(a instanceof Array); // true 
+0

'インデントbを1つ、未定義+ 1 === NaN'で?なぜ「インデント」するのでしょうか?そして 'b ++'は 'b + 1'と同じではありません。 – melpomene

+0

私は、「Add to to b」と言っていると思っていました。 – andlrc

1

そこにはたくさんのものがあります。

  1. コードが何かをする - それがa[NaN]に値1を割り当てます。また、JSオブジェクトに文字列プロパティのみを設定できるようになると、NaNは暗黙的に文字列にキャストされるため、実際に1a["NaN"]またはa.NaNに割り当てています。

  2. consoleオブジェクトは標準化されていないため、そのオブジェクトから特別なものは期待できません。現在のFFでの実装は、配列インデックスを反復処理します。 "NaN"は数値ではないので配列インデックスではないため、コンソールに何も表示されません。

    上からそれを取っ

var a = new Array(); 
 
var b; 
 
a[b++] = 1; 
 

 
console.log(a[NaN], a["NaN"], a.NaN);

+0

@Mgetz a side note:最初にstringに変換されるので、 'NaN'がそれ自身と等しくないかどうかは関係ありません。 "配列オブジェクトのインデックスとして" ---標準でのインデックスは数値でしかない(より多くの制限がありますが、この場合は関係ありません)。 – zerkms

関連する問題