web-dev-qa-db-ja.com

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

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

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

そして

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

両方とも同じように動作し、typeof(myArray) == typeof(myObjects)(両方とも 'object'を生成する)ためです。

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

103
prinzdezibel

Javascriptの実質的にすべてがオブジェクトなので、任意のプロパティを設定することで Array オブジェクトを「乱用」できます。これは 有害と見なされるべきです しかし。配列は、数値でインデックス付けされたデータ用です-非数値キーの場合、オブジェクトを使用します。

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

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

alert(myArray.length);

これは「2」を表示しませんが、「0」-事実上、配列に要素が追加されず、配列オブジェクトにいくつかの新しいプロパティが追加されます。

130
Paul Dixon

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

次のような機能:

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

以前の答えでは比too的で不可解すぎると思います。明確化が続きます。

Array、Boolean、Date、Function、Number、RegExp、Stringのインスタンスはオブジェクトですが、各タイプに固有のメソッドとプロパティで強化されています。たとえば、配列には定義済みの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()は私を忘れてしまった! 
 
 3と私の長さ! 
 
({0: "one"、1: "two"、2: "three"、a:4})

および0 1 2 aおよび0 1 2 a

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

123()または"abc"()または[]()または{}()またはobj()などの関数として任意のオブジェクトインスタンスを使用することは、構文的にも意味的にも正しくありません。ここで、objFunction以外の型です。 Functionではありません。しかし、オブジェクトobjとそのタイプがArray, 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定義として現れます。したがって、すべてのオブジェクトが関数であるというステートメントです! (冗談は、オブジェクトインスタンスとそのタイプの区別を意図的に曖昧にし、あいまいにしたことです!それでも、これは「他なしでは一方を持たない」ことを示しています。オブジェクトと機能!インスタンスに反対。)

機能とオブジェクトの両方のパラダイムは、MathJSONtrueなどのJSインタープリターの低レベルの組み込みプリミティブのプログラミングと実装の基本と思われます。

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

ディスプレイ

[object Math]

[object JSON]

(new Boolean(true))

Javascriptの開発時には、オブジェクト中心のプログラミングスタイル(OOP-オブジェクト指向プログラミングスタイル-「 's」は私自身のしゃれです!)が流行し、インタプリタも同様にJava信頼性を高めるために、関数型プログラミング手法は、オートマトン、再帰関数、形式言語などの理論を研究する、より抽象的で難解な試験に委ねられました。特にFFのGeckoエンジン(.toSource())に実装されているように、Javascriptで明確に現れます。


Functionのオブジェクト定義は、繰り返し関係として定義されているため、特に満足です!独自の定義を使用して定義されています!

function Function() { [native code] }
そして関数はオブジェクトなので、同じ感情が保持されます
function Object() { [native code] }

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

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

6
Ekim

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

コード

var myArray = Array();

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

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

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

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

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

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

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

5
Dasha Salo

実用的な違いの1つは、JSON.stringify上のarray all 非数値インデックスは無視されます:

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"}
1
user5513314

JavaScriptの配列と他のオブジェクトの違い。配列には魔法のように更新するlengthプロパティがありますが、配列以外のオブジェクトには、そのようなプロパティを実装する方法はありません。

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

配列は、順序インデックスを持つものを格納するために使用されます-従来の配列、スタック、またはキューのように使用します。オブジェクトはハッシュです-別個のキーを持つデータに使用します。

1
Parth Raval