JavaScriptの中で配列の対象のあれらの持参方法は紹介します.

6925 ワード

/**
*本文は純粋に整理します.現在のW 3 C標準の中で、ArayオブジェクトはMethodを持参しています.
*全文は栄養があまりないですが、最後の性能テストの部分は疑問を投げかけました.
*/
割当方法(Muttor methods)
これらの方法は配列自体を直接修正します.
ポップとプッシュ
Aray.pop()///配列の最後の要素を削除し、削除された要素を返します.
Aray.push(element 1,…,element N);配列の末尾に1-Nの要素を挿入し、操作後の配列のlengthを返します.
このポップとプッシュによって、配列をスタックに見立てて操作することができます.
スタックというデータ構造の特徴は、「後進先出」(LIFO,Last In First Out)です.
シフトとunshift
Aray.shift()///配列の最初の要素を削除し、削除された要素を返します.
Aray.unshift(element 1,…,element N);配列の先頭に1-Nの要素を挿入し、操作後の配列のlengthを返します.
シフトとunshiftを利用すればキューの操作が可能です.
キューの操作方式はスタックとは逆で、「先入先出」(FIFO、First-In-First-Out)を採用しています.
splice
 
  
Array.splice(index , howMany[, element1[, ...[, elementN]]]);
Array.splice(index);
パラメータ:
index:要素をどこから追加/削除するかを規定しています.
howmany:どのぐらいの要素を削除するべきかを規定しています.
elements:配列に追加する新しい要素を、indexでいう下付きから挿入することを規定しています.
splice方法はpop、push、shift、unshiftに対する補完です.
戻り値は削除された要素です.
逆転セ
 
  
Array.reverse(); // ,
ソフト
 
  
Array.sort([compareFunction]);
この方法を呼び出したときにパラメータが使用されていない場合は、配列内の要素をアルファベット順に並べ替えます.
より正確に言うと、文字コードの順序で並べ替えられます.
他の基準にしたがって並べ替えたい場合は、比較関数を提供する必要があります.この関数は2つの値を比較して、この2つの値の相対的な順序を説明するための数字を返します.比較関数は2つのパラメータaとbを持つべきで、その戻り値は以下の通りである.
•aがbより小さい場合、並べ替えられた配列の中でaがbより前に現れるべきなら、0より小さい値を返します.
•aがbに等しいなら、0を返します.
•aがbより大きいと0より大きい値を返します.
--------------------------------------------------
アクセス方法(Access or methods)
これらの方法は、配列自体を変更することなく、対応する結果を返します.
cat
 
  
Array.concat(value1, value2, ..., valueN); // 2 ,
ただし、注意すべき点があります.以下の例で説明します.
 
  
var arr = [1, 2, 3];
arr.concat(4, 5); // return [1, 2, 3, 4, 5]
arr.concat([4, 5]); // return [1, 2, 3, 4, 5]
arr.concat([4, 5], [6, 7]); // return [1, 2, 3, 4, 5, 6, 7]
arr.concat(4, [5, [6, 7]]); // return [1, 2, 3, 4, 5, [6, 7]]
ジョン
string=Aray.join;
配列中のすべての要素を文字列に入れます.ここで、要素間は指定された区切り記号で区切られます.
デフォルトの区切り記号はカンマ(,)で、戻り値は結合後の文字列です.
[1,2,3].ジョイン()//return"1,2,3"Aray.join()の方法は、実際にはString.splite()の逆動作です.
slice
 
  
Array.slice(begin[, end]); //
toString
 
  
Array.toString(); // , JavaScript toString
indexOfとlastIndexOf*[ECMAScript 5]
 
  
Array.indexOf(searchElement[, fromIndex]); //
Array.lastIndexOf(searchElement[, fromIndex]); //
search Element:検索する値が必要です.
from Index:インデックス、検索はどこから開始するかを示します.
--------------------------------------------------
反復方法(Iteration methods)forEach*[ECMAScript 5]
 
  
Array.forEach(callback[, thisArg]); // , ,
パラメータ:
calback:配列を巡るときに呼び出す関数
thisArg:calbackの役割領域を指定します.
また、コールバックは3つのパラメータを呼び出します.
value:配列要素
index:配列インデックス
array:配列自体
 
  
[1, 2].forEach(function(value, index, array) {
console.log(value, index, array);
});
// return
// 1 0 [1, 2]
// 2 1 [1, 2]
Note:forEachはbreakで配列を中断することができないエルゴードです.
解決方法:try方法を利用して異常を投げて、遍歴を中止します.
 
  
try {
[1,2,3].forEach(function(val) {
console.log(val);
throw(e)
});
} catch(e) {
console.log(e);
}
map*[ECMAScript 5]
Aray.map(calback[,thisArg])//配列要素を巡回して、指定関数を呼び出して、すべての結果を行列で返します.
パラメータ:
calback:配列を巡るときに呼び出す関数
thisObject:calbackの作用領域を指定します.
例:
 
  
[1, 2, 3].map(function(num) { // return [2, 3, 4]
return num + 1;
});
filter*[ECMAScript 5]
 
  
Array.filter(callback[, thisObject]); // , ( true) ,
パラメータ:
calback:配列を巡るときに呼び出す関数
thisObject:calbackの作用領域を指定します.
例:
 
  
[1, 2, 3].filter(function(num) { // return [1]
return num < 2;
});
everyとsome*[ECMAScript 5]
 
  
Array.every(callback[, thisObject]); // “ ”
Array.some(callback[, thisObject]); // “ ”
パラメータ:
calback:配列を巡るときに呼び出す関数
thisObject:calbackの作用領域を指定します.
every:すべての要素が関数を呼び出したらtrueに戻ります.結果はtrueに戻ります.そうでなければfalseに戻ります.
some:すべての要素が関数を呼び出したらfalseに戻ります.結果はfalseに戻ります.そうでないとtrueに戻ります.
everyとsomeの戻り値が確定すると、すぐに巡回を停止します.
例:
 
  
[1, 2, 3]. every(function(num) { // return false
return num > 1;
});
[1, 2, 3]. some(function(num) { // return true
return num > 2;
});
reduceとreduceRight*[ECMAScript 5]
 
  
Array.reduce(callback[, initialValue]); // , ( )
Array.reduceRight(callback[, initialValue]); // , ( )
パラメータ:
calback:配列を巡るときに呼び出す関数
initial Value:初めてコールバックを呼び出した時に入ってきたprevious Value
また、calbackは4つのパラメータを呼び出します.
previous Value:これまでの作業の累積結果
currentValue:配列要素
index:配列インデックス
array:配列自体
例:
[1,2,3].reduce(function(x,y){/return 106
return x+y
}100)
--------------------------------------------------
性能テスト
テストシステム:Windows 7
テストブラウザ:Chrome 26.0.1386.0
 
  
var arr = [];

for(var i = 0; i < 999999; i++) {
arr.push(i);
}
forEach
 
  
function forEachTest() {
howTime("forEach", function() {
var num = 0;
arr.forEach(function(val, key) {
num += val;
});
});
howTime("for", function() {
var num = 0;
for(var i = 0, len = arr.length; i < len; i++) {
num += arr[i];
}
});
}
以下はランダムに行われた3回のテスト結果です.
time_forEach
time_for
1421000 ms 
64.000 ms 
1641.000 ms 
63.000 ms 
1525000 ms 
63.000 ms 
ChromeはforEachに対して専門的な最適化をしていません.直接forサイクルを使うより性能に大きな差があります.
forEachはECMAScript 5のものなので、古いバージョンのブラウザはサポートしていません.
ただし、MDNは、下位互換性のある解決方法を提供しています.
 
  
if(!Array.prototype.forEach) {
Array.prototype.forEach = function(fn, scope) {
for(var i = 0, len = this.length; i < len; ++i) {
fn.call(scope, this[i], i, this);
}
}
}
スペクトルを外したのは、原生のforEachの方法で、性能の上で、意外にも自分の構造のforEachに及ばないです!
また、他のArayオブジェクトの他の反復方法は?
みんなはこれを見てください.http://maplejan.sinaapp.com/demo/ArratMethod.html
また、面白いことも見つけました.
直接操作台でDemoのJavaScriptコードを実行すれば、性能に大きな違いがあります.
この時、直接for循環で書くと、性能が悪くなります.
この疑問に対して、知識の上で質問しました.http://www.zhihu.com/question/20837774