ホームページ  >  記事  >  ウェブフロントエンド  >  Array.prototype.concat は [翻訳]_javascript スキルを否定するための普遍的な方法ではありません

Array.prototype.concat は [翻訳]_javascript スキルを否定するための普遍的な方法ではありません

WBOY
WBOYオリジナル
2016-05-16 17:49:541237ブラウズ

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" ]


次に、配列のようなオブジェクトを使用して上記の接続操作を実行します。結果は同じになるはずです。コード

特殊変数の引数も配列のようなオブジェクトです。結果はまだ変わりません。期待どおり:




コードをコピー

コードは次のとおりです。 > function f() { return [].concat .call(arguments, ["world"]) } > f("hello") [ { '0': 'hello' }, 'world' ]

実際のユニバーサル メソッドは Array.prototype.push のようになります:



コードをコピーします

コードは次のとおりです。 > var arrayLike = { 0: "hello", > "ワールド") 2 > arrayLike
{ '0': 'hello', '1': 'ワールド', 長さ: 2 }



翻訳者注: ブラウザは標準に従って実装しているだけなので、実際には実装されていません。バグの問題はありません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。