2016-04-18 3 views
1

わかっているように、関数の引数をArrayに変換するなどのシナリオでは、Array.prototype.slice.call()を使用します。Array.prototype.slice.call()の内部作業

ここで、キー値が数字以外のキー値とともに反復される他のオブジェクトと同じことをしようとしている場合、それを省略したもの(非数値)。以下はコードです。

var myobject ={ // array-like collection 
length: 4, 
'0': 'zero', 
'1': 'one', 
'2': 'two', 
'3': 'three' 
} 

var myarray = Array.prototype.slice.call(myobject) // returns myobject as a true array: ["zero", "one", "two", "three"] 

0,1,2,3 ...空配列のようなキー値でのみオブジェクトを使用している場合、同じフローが返されます。以下はコードです。

var myobject2 ={ // array-like collection 

'1': 'one', 
'2': 'two', 
'3': 'three' 
} 

var myarray2 = Array.prototype.slice.call(myobject2) //returns empty array 

誰でもこの現象が起こっている理由を教えてください。それは数字キーだけを見て、空の配列を作成し、それを数値インデックスに変換する??????

答えて

3

Array.prototype.slice.call()は、.lengthプロパティを必要とし、それに対応するゼロベースの数値プロパティが必要です(すべてのプロパティ名は実際には文字列であるため、数字に相当する文字列です)。存在するものが見つからない場合は、.slice()を適切に実行しません。

ソースが実際の配列でない場合は、基本的には0から.length - 1までのループに入り、オブジェクトの一致するプロパティ名を探し、そのプロパティ名で検出された値をコピーします。プロパティ名は、数字の文字列に完全に一致する必要があります。

数字のプロパティが見つからない場合は、単にその値がundefinedとしてコピーされます。

+0

非数値キーを含むlengthプロパティは、未定義としてプッシュされます。私は正しいですか? – Vino

+0

@Vino - 欠落している数値プロパティは、値が何であるかにかかわらず 'undefined 'としてコピーされます。 – jfriend00

+0

便利なクイックインフォメーションありがとう! – Vino

関連する問題