以下两个不同的代码片段对我来说似乎是相同的:

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 

我认为,我之前的回答太隐喻和神秘了。澄清如下。

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() 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, ,所以任意对象 INSTANCE 不是 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 定义,因此声明所有对象都是函数!(半开玩笑的是,我故意模糊了对象实例与其类型的区别!尽管如此,这仍然表明“对象和功能缺一不可”!大写强调类型而不是实例。)

函数式和对象范例似乎都是 JS 解释器低级内置原语的编程和实现的基础,例如 MathJSONtrue.

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

显示

[object Math]

[object JSON]

(new Boolean(true))

在 Javascript 开发时,以对象为中心的编程风格(OOP - 面向对象编程风格 - “'s” 是我自己的双关语!)很流行,解释器也同样被命名为 Java,以赋予其更大的可信度。函数式编程技术被降级为更抽象和深奥的考试,研究自动机、递归函数、形式语言等理论。因此不太可口。然而,这些形式考虑的优势在 Javascript 中清晰可见,特别是在 FF 的 Gecko 引擎(即 .toSource()).


Function 的 Object 定义特别令人满意,因为它被定义为递归关系!使用它自己的定义来定义!

function Function() { [native code] }
由于函数是一个对象,因此同样的观点也适用
function Object() { [native code] }.

大多数其他定义静止为静态终端值。然而, eval() 是一个特别强大的原语,因此字符串也可以嵌入任意功能。

再次注意,上面使用的白话模糊了对象类型和实例的区别。

JavaScript 中除了原始类型之外,一切都是对象。

代码

var myArray = Array();

创建 Array 对象的实例,同时

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

创建一个 Object 对象的实例。

尝试下面的代码

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

所以你会看到区别在于对象构造函数的类型。

Array 对象的实例将包含 Array 原型的所有属性和方法。

这是一个所有JSON.stringify非数字索引被忽略使用array时的一个实际的区别是

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中的其他对象之间的差异。虽然阵列具有神奇地更新length属性,对于除阵列的其他对象也没有办法来实现这样的特性。

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

阵列被用来存储东西用序号索引 - 使用它像一个传统的阵列,堆栈,或队列。一个目的是散列 - 使用它的具有不同的密钥数据

{}-符号只是语法糖,使代码更好; - )

JavaScript有很多类似的构建体等的功能的结构,其中,()的函数仅仅是一个同义词

var Func = new Function("<params>", "<code>");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top