Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我可以将命名属性作为对象添加到数组中?_Javascript_Arrays_Object_Javascript Objects - Fatal编程技术网

Javascript 为什么我可以将命名属性作为对象添加到数组中?

Javascript 为什么我可以将命名属性作为对象添加到数组中?,javascript,arrays,object,javascript-objects,Javascript,Arrays,Object,Javascript Objects,以下两个不同的代码片段在我看来是等效的: var myArray = Array(); myArray['A'] = "Athens"; myArray['B'] = "Berlin"; 及 因为它们的行为相同,而且typeof(myArray)==typeof(myObjects)(两者都产生“object”) 这些变体之间有什么区别吗?{}-表示法只是语法上的糖分,可以使代码更漂亮;-) JavaScript有许多类似的构造,比如函数的构造,其中function()只是 var Func

以下两个不同的代码片段在我看来是等效的:

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

因为它们的行为相同,而且
typeof(myArray)==typeof(myObjects)
(两者都产生“object”)


这些变体之间有什么区别吗?

{}
-表示法只是语法上的糖分,可以使代码更漂亮;-)

JavaScript有许多类似的构造,比如函数的构造,其中function()只是

var Func = new Function("<params>", "<code>");

JS中的数组是对象,只是稍微修改了一下(还有一些函数)

功能如下:

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

实际上javascript中的所有内容都是一个对象,因此您可以通过在对象上设置任意属性来“滥用”该对象。但这是事实。数组用于数字索引数据-对于非数字键,请使用对象

下面是一个非数字键不“适合”数组的更具体示例:

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

alert(myArray.length);

这不会显示“2”,而是“0”-实际上,没有向数组添加任何元素,只是向数组对象添加了一些新属性。

JavaScript中的所有内容都是一个对象,而不是基本类型

代码

var myArray = Array();
创建数组对象的实例,同时

var myObject = {'A': 'Athens', 'B':'Berlin'};
创建对象的实例

请尝试以下代码

alert(myArray.constructor)
alert(myObject.constructor)
因此,您将看到不同之处在于对象构造函数的类型


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

Me认为,Me与前面的答案过于隐喻和神秘。澄清如下

Array、Boolean、Date、Function、Number、RegExp、String的实例是一个对象,但使用特定于每种类型的方法和属性进行了增强。例如,数组具有预定义的
length
属性,而常规对象没有

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

0 undefined
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]
}
[object Math]

[object JSON]

(new Boolean(true))
展示

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 undefined
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]
}
[object Math]

[object JSON]

(new Boolean(true))
在任何情况下,对象类型都以
函数
定义的形式出现,因此所有对象都是函数!(开玩笑的是,我故意模糊了对象实例与其类型的区别!尽管如此,这表明“你不能没有另一个”,对象和函数!大写强调类型而不是实例。)

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

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

0 undefined
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]
}
[object Math]

[object JSON]

(new Boolean(true))

在Javascript开发时,一种以对象为中心的编程风格(OOP的-面向对象编程风格-我自己的双关语是“'s!”)很流行,解释器也同样被命名为Java,以提高其可信度。函数式编程技术被降级为更抽象和深奥的考试,学习自动机、递归函数、形式语言等的理论,因此并不令人满意。然而,这些形式化考虑的优点在Javascript中明显体现出来,尤其是在FF的Gecko引擎中实现的Javascript(即
.toSource()


函数的对象定义特别令人满意,因为它被定义为递归关系!使用它自己的定义定义

function(){[native code]}

由于函数是一个对象,因此对
function Object(){[native code]}

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


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

您可以在javascript中的几乎任何内容中添加命名属性,但这并不意味着您应该这样做。 javascript中的
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"}
让arr=[];
设obj={};
arr['name']='John';
obj['name']='John';
console.log(arr);//将输出[名称:“John”]
console.log(obj);//将输出{name:“John”}

JSON.stringify(arr);//将返回[]数组与JavaScript中其他对象之间的差异。虽然数组有一个神奇的更新长度属性,但对于数组以外的对象,没有办法实现这样的属性

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6
var arrName=[];
arrName[5]=“测试”;

arrName.length;// 在JavaScript中,数组是特殊类型的对象

typeof new Array(); // returns "object" 
typeof new Object(); // returns "object
数组使用编号索引,对象使用命名索引

所以我们可以将命名属性添加到数组中

const arr = []
arr["A"] = "Hello" //["A":"Hello"]

console.log(arr.length) // 0 
arr.length返回0,因为具有命名索引的数组更喜欢调用对象

console.log(Object.keys(clothing)); // ["A"]
console.log(Object.keys(clothing).length); //1

虽然我不认为列出的所有函数都是每个JS实现中内置的,但您明白了。另一个区别是不同的原型(这些额外的函数暗示了这一点)。myArray.length返回数组中最后一个元素的数字索引/键,但不返回实际的元素数。数组对象的属性是否与数组值不同?我只是想说明,如果将数组对象视为常规对象,它的预期语义会被滥用。不过,链接的文章做得更好:)下次有人说JavaScript是一种很好的开发语言时,我将向他展示这个示例。谢谢。@Olivier,你所谓的“bug”也可以是一个很棒的“特性”。您可以在不影响数组内容或长度的情况下向数组添加标题和说明,并使用