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]は配列を生成しています.
  • ここでは二つの問題の説明をしましたが、全部自分の理解から出発しました.いつも未完の意味があり、また深く入り込みにくいです.自分の理解している友達がいますので、皆さんと交流してください.間違ったところがあったら指摘してください.