Answers:
实际上,javascript中的所有内容都是对象,因此您可以通过在Array对象上设置任意属性来“滥用” Array对象。但是,这应该被认为是有害的。数组用于数字索引数据-对于非数字键,请使用对象。
下面是一个更具体的示例,为什么非数字键不能“适合”数组:
var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";
alert(myArray.length);
这不会显示“ 2”,但会显示“ 0”-实际上,没有将任何元素添加到数组,只有一些新属性添加到了数组对象。
title
,description
和items
属性。这完全取决于您对语言的了解程度和使用方式。
我认为,我对先前的回答也隐喻和含糊。澄清如下。
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:“两个”,2:“三个”,a:4})
和0 1 2 a
和0 1 2 a
。
关于所有对象都是函数的声明:
使用任意对象实例作为函数诸如123()
或"abc"()
或[]()
或{}()
或obj()
where 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
定义,因此声明所有对象都是函数!(开玩笑的是,我故意模糊和模糊了对象实例与它的类型之间的区别!不过,这表明“没有另一个就不能拥有一个”,对象和功能!大写强调类型为反对实例。)
功能和对象范例似乎都是JS解释器底层内置原语(例如Math
和JSON
和)的编程和实现的基础true
。
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
显示
[object Math]
[object JSON]
(new Boolean(true))
在开发Javascript时,以对象为中心的编程风格(OOP的-面向对象的编程风格-“ s”是我自己的双关语)正在流行,并且类似的解释器也用Java命名为Java,以赋予它更大的可信度。 。函数式编程技术被放到更抽象和深奥的考试中,这些考试研究自动机,递归函数,形式语言等的理论,但这些都不是可口的。但是,这些正式考虑的优点在Javascript中已明显体现出来,尤其是在FF的Gecko引擎(即.toSource()
)中实现的情况。
Function的Object定义特别令人满意,因为它被定义为递归关系!使用自己的定义来定义!
function Function() { [native code] }
并且由于函数是一个对象,因此同样的观点也成立
function Object() { [native code] }
。
其他大多数定义都静默为静态终端值。但是,它eval()
是一个功能特别强大的原语,因此String也可以嵌入任意功能。
再次注意,上面使用的白话语掩盖了对象类型和实例区别。
JavaScript中的所有内容都是原始类型以外的对象。
代码
var myArray = Array();
创建Array对象的实例,而
var myObject = {'A': 'Athens', 'B':'Berlin'};
创建一个Object对象的实例。
试试下面的代码
alert(myArray.constructor)
alert(myObject.constructor)
因此,您将看到区别在于对象构造函数的类型。
Array对象的实例将包含Array原型的所有属性和方法。
数组与JavaScript中其他对象之间的区别。尽管数组具有不可思议的更新长度属性,但是对于除数组之外的其他对象,则无法实现这种属性。
var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6
数组用于存储具有序索引的事物-像传统数组,堆栈或队列一样使用它。对象是哈希-将其用于具有唯一键的数据。
您可以将命名属性添加到javascript中的几乎所有内容中,但这并不意味着您应该这样做。
Array
如果您想使用关联数组,则应将javascript中的in用作列表Object
。
请注意,如果您真的想使用Array
具有命名属性而不是Object
这些属性,则将无法在for...of
循环中访问这些属性,并且在对其进行JSON编码时,可能还会得到意外的结果。请参见下面的示例,其中所有非数字索引都将被忽略:
let arr = [];
let 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 [] <- not what you expected
JSON.stringify(obj); // will return {"name":"John"}
- {}
符号只是使代码更好的语法糖;-)
JavaScript具有许多类似的构造,例如函数的构造,其中function()只是以下各项的同义词
var Func = new Function("<params>", "<code>");
{}
是文字对象符号,[]
是文字数组,我不确定您的答案是什么。