ECMAScript 5.1 仕様§15.4.4.4 は次のように述べています:
concat 関数は意図的に汎用的に設計されているため、この値が Array オブジェクトである必要はありません。そのため、他のタイプのオブジェクトに転送してメソッドとして呼び出すことができます。
この記事のコードはすべて、Array.prototype へのショートカットとして [] を使用しています。これは、読みにくいとはいえ、すでに非常に一般的な手法です。オブジェクト インスタンスを通じてアクセスします。 Array.prototype のメソッド。ただし、このアクセス メソッドは最新の JavaScript エンジンでは非常に高速であるため、これらの JavaScript エンジンではこの呼び出しメソッドで配列インスタンスを作成できないのではないかと思われます。この記事のすべての例は Firefox および V8 で試行されています。
concat がユニバーサル メソッドであるかどうかを見てみましょう。これがユニバーサル メソッドである場合、this の値が実数の配列であるか、配列のようなオブジェクト (長さがある) であるかは関係ありません。属性を持ち、インデックスによって各要素にアクセスできます)、メソッドの戻り結果は同じである必要があります。まず、配列に対して concat メソッドを呼び出します:
> ["hello"].concat(["world"])
["hello " , "world"]
> [].concat.call(["hello"], ["world"]) // 上記と同じ
["hello", "world" ]
次に、配列のようなオブジェクトを使用して上記の接続操作を実行します。結果は同じになるはずです。コード
特殊変数の引数も配列のようなオブジェクトです。結果はまだ変わりません。期待どおり:
コードをコピー
実際のユニバーサル メソッドは Array.prototype.push のようになります:
コードをコピーします
{ '0': 'hello', '1': 'ワールド', 長さ: 2 }
翻訳者注: ブラウザは標準に従って実装しているだけなので、実際には実装されていません。バグの問題はありません。