Aray.prototype.xx.cal()処理文字列の疑惑
3032 ワード
あなたが知らないJavaScriptの中巻2.1配列を見たら疑問があります.具体的にはこうです.
「借用」配列の方法により、文字列を簡単に処理することができます.「借用」配列の非変更方法がありますが、「借用」配列の変更可能な方法はありません.
コードで説明すると、なぜ文字列はこのように配列方法を使用することができますか? どうして 私たちは、 を知ることができます.は、エラーの中の を思い出しました.
最初の疑惑は比較的合理的な説明があったと言えますが、実はまだ多くの問題があります.本の中で は、 ここでは二つの問題の説明をしましたが、全部自分の理解から出発しました.いつも未完の意味があり、また深く入り込みにくいです.自分の理解している友達がいますので、皆さんと交流してください.間違ったところがあったら指摘してください.
「借用」配列の方法により、文字列を簡単に処理することができます.「借用」配列の非変更方法がありますが、「借用」配列の変更可能な方法はありません.
コードで説明すると、
var a = 'foo';
// ,
var b = Array.prototype.join.call(a, '-');
var c = Array.prototype.map.call(a, v => v.toUpperCase()).join()
var d = Array.prototype.slice.call(a);
console.log(b); // 'f-o-o'
console.log(c); // 'FOO'
console.log(d); // ['f', 'o', 'o']
// ,
var e = Array.prototype.reverse.call(a);
// chrome: Uncaught TypeError: Cannot assign to read only property '0' of object '[object String]'
最初は戸惑いました.
というのはこのように使ってもいいですか?
は使えません.Uncaught TypeError: Cannot assign to read only property '0' of object '[object String]'
という新聞が間違っているのを見た時、少し分かりました.call
の最初のパラメータがコンテキストオブジェクトとして知られていますが、ここで直接に入力されたのは文字列変数a
です.[object String]
を見たとき、ここで文字列を使用したパッケージオブジェクトString
var f = new String(a);
console.log(f); // String {0: f, 1: 0, 2: 0, length: 3,}
// , 0,1,2..., length
配列の
は、元の配列を変更せずに、新しい配列を返します.すると、呼び出しごとに新しい配列が生成され、コンテキストオブジェクトを巡回して、対応するインデックス上の値を新しい配列に割り当てます.fn(){
var newArray = [];
for(var i = 0,len = f.length; i < len; i++){
newArray[i] = f[i];
}
return newArray;
}
これは第一の問題を説明し、なぜArray.prototype.xxx.call()
によって文字列が操作されるのかを説明する.read only
を発見しました.オブジェクトの各属性の記述オブジェクトObject.getOwnPropertyDescriptors(f);
/**
{
0: {value: "f", writable: false, enumerable: true, configurable: false},
1: {value: "o", writable: false, enumerable: true, configurable: false},
2: {value: "o", writable: false, enumerable: true, configurable: false},
length: {value: 3, writable: false, enumerable: false, configurable: false}
}
*/
enumerable: true
の他は全部false
であり、各属性は列挙するだけで、変更することはできないが、配列の
はreverse
などのように、コンテキストオブジェクト(配列またはクラスの配列)を直接操作しなければならない.ただし、[Object String]
の属性は読み取り専用ですので、変更できません.設定できません.これは第二の問題を説明しました.最初の疑惑は比較的合理的な説明があったと言えますが、実はまだ多くの問題があります.
Array.prototype.reverse(a)
の返却値は文字列foo
のパッケージオブジェクトだと言っていますが、私のchromeはエラーを報告します.firefox、edge、ie 11、ie 10、ie 9はいずれもエラーを報告します.ie 8だけが[object String]{0: undefined, 1: undefined, 2: undefined}
に戻ります.他のブラウザはテストしていません.
の構造がこのように配列の方法を使用することができる以上、Iterator
エルゴードインターフェースを展開したデータ構造もこのように使用することができるのではないか?だめなら、どうしてですか?でも、この感じはちょっと遠いです.意味がないところもあります.
があります.普通はIterator
の環境で、拡張演算子ES6
または直接[...a]
は配列を生成しています.