それはオブジェクトであるかのように、なぜ私は配列に名前付きプロパティを追加することができますか?

StackOverflow https://stackoverflow.com/questions/874205

質問

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

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

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

それらは両方とも同じように動作し、またtypeof(myArray) == typeof(myObjects)(収率 'オブジェクト' の両方)からである。

これらの変異体との間の違いはありますか?

役に立ちましたか?

解決

JavaScriptで事実上すべてのものがオブジェクトであるので、あなたはアレイ「虐待」をすることができますその上に任意のプロパティを設定することによりのオブジェクト。このはしかし、有害を考慮すべきです。配列は数値添字のデータのためのものである - 非数字キーのために、オブジェクトを使用します。

ここでは、数値以外のキーが配列を「適合」しない理由より具体的な例です。

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

alert(myArray.length);

これは「2」表示が、「0」ではないであろう - 効果、どの要素がアレイに追加されていない、単にいくつかの新しいプロパティが配列オブジェクトに追加

他のヒント

JSアレイにおいては、オブジェクト、ほんのわずかに(数より多くの機能を有する)修飾されている。

のような関数ます:

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 

私は前の回答と私はあまりにも比喩と不可解な、と考えています。明確化は、次のとおりです。

配列のインスタンスは、ブール、日付、機能、数、正規表現は、文字列オブジェクトが、各タイプに固有のメソッドおよびプロパティで強化されます。汎用オブジェクトがいない間、例えば、アレイは、あらかじめ定義されlength性を有する。

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

ディスプレイ

0
undefined

本質的に、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);

表示

one,two,three

[object Object]

["one", "two", "three"]

4    .toSource() forgot me! 

3    and my length! 

({0:"one", 1:"two", 2:"three", a:4})

0 1 2 a0 1 2 aます。

すべてのオブジェクトが機能していることを声明に関してます:

これはそう任意のオブジェクトのインスタンスが123()ない、"abc"()[]()以外の任意のタイプで{}()又はobj()又はobj又はFunctionような関数またはFunctionなどの任意のオブジェクトのインスタンスを使用することも構文的にも意味的に正しいです。しかし、オブジェクトobjを与え、それがArray, Boolean, Date, ...ようになってきobjたのか、Array, 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定義、すべてのオブジェクトが機能していること、したがって文として現れます!私は意図的に隠さおよびTypeのそれのそれとオブジェクトインスタンスの区別をぼかすこと(冗談です!それでも、これは、オブジェクトと関数「あなたが他のないものを持つことはできません」と表示!総額はのように入力し強調しますインスタンスとは反対。)

両方の官能オブジェクトパラダイムは、プログラミングおよび組み込みようMathJSONtrueとしてプリミティブ、JSインタプリタ低レベルの実装の基礎であるように見える。

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

ディスプレイ

[object Math]

[object JSON]

(new Boolean(true))
<時間>

のJavascriptの開発時には、オブジェクト中心のプログラミングスタイル(OOPの - オブジェクト指向プログラミングのスタイル - !「さんは、」私自身のしゃれです)流行にあったと通訳も同様に与えるためにJavaで洗礼を受けましたそれより高い信頼性。関数型プログラミング技術がなどオートマトン、再帰関数、形式言語の理論を研究し、より抽象的で難解な検査にとのようなおいしいていないとして追いやられました。しかし、これらの正式な検討事項の強みは、FFのGeckoエンジン(すなわち。.toSource())に実装され、特にとして、JavaScriptで明らかに明白である。

<時間>

それは漸化式のように定義されるための機能のためのオブジェクトの定義は特に満足です!それ自身の定義を使用して定義された!

function Function() { [native code] }
関数はオブジェクトであるため、同じ感情を
成立します function Object() { [native code] }ます。

他の定義のほとんどは、静的な端末値に静止します。しかし、eval()は特に強力なプリミティブので、文字列は、任意の機能を組み込むことができるされている。

上記使用方言は、オブジェクトタイプとインスタンスの区別を隠し、再び注意してください。

JavaScriptですべてがプリミティブ型以外のオブジェクトである。

コード

var myArray = Array();
一方

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

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

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

次のコードを試してみてください
alert(myArray.constructor)
alert(myObject.constructor)

だから、違いは、オブジェクトのコンストラクタの型ではあるが表示されます。

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

:すべての非数値のインデックスは無視されJSON.stringifyarrayを使用した場合、

一つの実用的な違いがあります

var arr = [];
var obj = {};

arr['name'] = 'John';
obj['name'] = 'John';

console.log(arr);    // will output [name: "John"]
console.log(obj);    // will output {name: "John"}

JSON.stringify(arr); // will return []
JSON.stringify(obj); // will return {"name":"John"}
  

JavaScriptでの配列と他のオブジェクトとの間の差。アレイは魔法更新長性を有するが、配列以外の目的のためにそのようなプロパティを実装する方法はありません。

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6
  

アレイは、序数インデックスで物事を格納するために使用されている - 伝統的な配列、スタック、またはキューのようにそれを使用しています。オブジェクトはハッシュである - 異なるキーを持つデータのためにそれを使用する

{}表記は、コードがよりよいようにするだけで構文糖である; - )

のJavaScript関数は、()のためだけ同義語である関数の構成、のような多くの同様の構造を有している

var Func = new Function("<params>", "<code>");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top