108

次の 2 つの異なるコード スニペットは、私には同等のようです。

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

var myObject = {'A': 'Athens', 'B':'Berlin'};

どちらも同じように動作し、typeof(myArray) == typeof(myObjects)(どちらも「オブジェクト」を生成します)。

これらのバリアントに違いはありますか?

4

8 に答える 8

133

事実上、javascript のすべてがオブジェクトであるため、任意のプロパティを設定することでArrayオブジェクトを「悪用」できます。ただし、これは有害であると見なされるべきです。配列は、数値でインデックス付けされたデータ用です。数値以外のキーの場合は、オブジェクトを使用します。

非数値キーが配列に「適合」しない理由のより具体的な例を次に示します。

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

alert(myArray.length);

これは '2' ではなく '0' を表示します - 実際には、要素は配列に追加されておらず、いくつかの新しいプロパティが配列オブジェクトに追加されているだけです。

于 2009-05-17T09:29:11.647 に答える
14

JS では、配列はオブジェクトであり、わずかに変更されているだけです (いくつかの関数が追加されています)。

次のような機能:

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 
于 2009-05-17T09:17:23.483 に答える
5

私は、私は前の答えで比喩的で不可解すぎると思います。説明は次のとおりです。

Array、Boolean、Date、Function、Number、RegExp、String のインスタンスは Object ですが、各タイプに固有のメソッドとプロパティで強化されています。たとえば、配列には定義済みのlengthプロパティがありますが、ジェネリック オブジェクトにはありません。

javascript:alert([].length+'\n'+{}.length)

ディスプレイ

0
未定義

本質的に、FF Gecko インタープリターは、言語構造を評価する明確な違いにより、配列と汎用オブジェクトも区別します。

javascript:
  ra=[  "one",   "two",   "three"]; ra.a=4;
  ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
  alert(
    ra            +"\n\n"+
    ob            +"\n\n"+
    ra.toSource() +"\n\n"+
    ra.a          +"\t .toSource() forgot me! \n\n"+
    ra.length     +"\t and my length! \n\n"+
    ob.toSource());
  ps=""; for(i in ra)ps+=i+" "; alert(ps);  /* NB .length is missing! */
  ps=""; for(i in ob)ps+=i+" "; alert(ps);

表示する

一二三

[オブジェクト オブジェクト]

["一二三"]

4 .toSource() 忘れてた!

3と私の長さ!

({0:"1", 1:"2", 2:"3", a:4})

0 1 2 a0 1 2 a.

すべてのオブジェクトが関数であるというステートメントについて:

123()任意のオブジェクト インスタンスをor"abc"()または[]()or {}()orのような関数として使用することは、構文的にも意味的にも正しくありません。obj()ここで、objは 以外の型です。ただし、オブジェクトとそのタイプが である場合、どのようにして になるのでしょうか? とは何ですか?FunctionFunctionobjArray, Boolean, Date, ...objArray, Boolean, Date, ...Array, Boolean, Date, ...

javascript:
    alert([Array, Boolean, Date, Function, 
              Number, Object, RegExp, String] . join('\n\n') );

ディスプレイ

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

すべての場合において、オブジェクト型はfunction定義として明示されます。したがって、すべてのオブジェクトは関数であるというステートメントです! (皮肉なことに、オブジェクト インスタンスとその型の区別を意図的にあいまいにし、あいまいにしています! それでも、これは「一方がなければ他方が存在できない」ことを示しています。オブジェクトと関数!インスタンスに反対します。)

機能パラダイムとオブジェクト パラダイムの両方が、 や などの JS インタープリターの低レベル組み込みプリミティブのプログラミングと実装の基本であるように思わMathJSONますtrue

 javascript:alert([Math, JSON, true.toSource()].join("\n\n"));

ディスプレイ

[object Math]

[object JSON]

(new Boolean(true))

Javascript の開発時には、オブジェクト中心のプログラミング スタイル (OOP's - Object Oriented Programming style - "'s" は私のしゃれです!) が流行しており、インタプリタも同様に信頼性を高めるために Java と名付けられました。 . 関数型プログラミングの手法は、オートマトン、再帰関数、形式言語などの理論を研究する、より抽象的で難解な試験に追いやられ、それ自体は口に合うものではありませんでした。ただし、これらの正式な考慮事項の強みは、特に FF の Gecko エンジン (つまり ) に実装されている Javascript で明確に表れています.toSource()


Function の Object 定義は、再帰関係として定義されているため、特に満足のいくものです! 独自の定義を使用して定義されています!

function Function() { [native code] }
関数はオブジェクトであるため、同じ感情が にも当てはまります
function Object() { [native code] }

他の定義のほとんどは、静的な端末値に静止します。ただし、eval()特に強力なプリミティブであるため、String には任意の機能を埋め込むこともできます。

繰り返しますが、上記で使用されている専門用語は、オブジェクト タイプとインスタンスの区別をあいまいにしています。

于 2011-05-17T20:06:13.587 に答える
5

JavaScript では、プリミティブ型以外はすべてオブジェクトです。

コード

var myArray = Array();

Array オブジェクトのインスタンスを作成し、

var myObject = {'A': 'Athens', 'B':'Berlin'};

Object オブジェクトのインスタンスを作成します。

次のコードを試してください

alert(myArray.constructor)
alert(myObject.constructor)

したがって、違いはオブジェクトコンストラクターのタイプにあることがわかります。

Array オブジェクトのインスタンスには、Array プロトタイプのすべてのプロパティとメソッドが含まれます。

于 2009-05-17T09:31:55.243 に答える
-1

-{}表記は、コードをより良くするための単なる構文糖衣です ;-)

JavaScript には、関数の構築のような多くの同様の構造があります。

var Func = new Function("<params>", "<code>");
于 2009-05-17T09:14:33.833 に答える