ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript_javascript スキルの配列状オブジェクト

JavaScript_javascript スキルの配列状オブジェクト

WBOY
WBOYオリジナル
2016-05-16 16:05:201138ブラウズ

私は、引数を配列 [].slice.call(arguments) に変換できることをずっと前から知っていました。なぜなら、
argument は配列のようなオブジェクトなので、このように使用できます。しかし、配列のようなオブジェクトが

と呼ばれるのかについては、まったく明確ではありませんでした。

今日『Effective JavaScript』を読んだとき、これに特化したセクションがあり、とてもクールに感じました。

まず、私が書いたサンプル コードを見てみましょう:

コードをコピーします コードは次のとおりです:

a = 「こんにちは」
[].map.call(a, (e) -> e.toUpperCase()) # => [ 'H', 'E', 'L', 'L', 'O' ]
[].reduceRight.call(a, (acc, e) -> acc e) # => b = {1: "a"、2: "b"、4: "c"、長さ: 6}
[].reduce.call(b, (acc, e) -> acc e) # => 'abc'

最初のものは文字列を操作します。文字列は配列のようなオブジェクトとみなすこともできます。しかし、後ろにある b オブジェクトは実際には

です。 これも配列のようなオブジェクトです。

本の説明を読んでください:

コードをコピーします コードは次のとおりです:
では、オブジェクトを「配列のような」ものにするのは正確には何でしょうか?
の基本的な規約は何でしょうか? 配列オブジェクトは 2 つの単純なルールに相当します。
0...2^32 – 1 の範囲の整数の長さプロパティがあります。
length プロパティがオブジェクトの最大インデックスよりも大きくなっています。
インデックスは 0...2^32 – 2 の範囲の整数であり、その文字列表現
オブジェクトのプロパティのキーです。

ルールはこの 2 つだけです。

では、なぜ引数、文字列、および上記の b オブジェクトは配列のようなオブジェクトとみなせるのでしょうか?

それらはすべて、正当な長さ属性 (0 から 2**32 - 1 までの正の整数) を持ちます。

長さ属性の値が最大インデックスを超えています。
別の例:

コードをコピーします コードは次のとおりです:
b = {1: "a"、2: "b"、4: "c"、長さ: 3}
[].reduce.call(b, (acc, e) -> acc e) # =>

それは間違いです。ルール 2: 長さ属性は 3 に違反しているため、「ab」になりました。 最大インデックス値は 4 で、length プロパティよりも大きくなります。したがって、その行動は異常です。


これは強力すぎるようです。インターフェイスを定義するだけで、配列のすべてのメソッドが使用できます。

実際には、すべてのメソッドが使用できるわけではありません (Array.prototype.concat

) 2つの配列を接続するので配列の人でないと絶対に使えません。


もう 1 つの小さな問題は、文字列が作成後に不変であるため、どのように投げても不変のままであることです。

しかし、この本の著者は、なぜこれら 2 つの条件を満たす場合に配列のようなオブジェクトとみなされるのかについてはまったく説明していません。

彼は ECMAScript 委員会のメンバーなので、基本的に信頼できるものです。なぜこれら 2 つの条件を満たす場合に配列のようなオブジェクトとみなされるのかについては、Google で長時間検索しましたが、合理的な説明が見つかりませんでした。


以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。