javascript中关联[]、{}和对象之间的差异
可能重复:javascript中关联[]、{}和对象之间的差异,javascript,Javascript,可能重复: 我对javascript中的对象和关联数组有点困惑。我读到了这篇文章:但是这个问题说两者没有太大区别。我在控制台上写了这样的话: var a = []; a["A"] = 1; var b = {}; b["B"] = 2; var c = new Object(); c["C"] = 3; 以上各项的输出如下: a gives {A : 1} b gives {B : 2} c gives {C : 3} 以上三种情况给出的结果都与它们给出的对象相同。问题是如何在ja
我对javascript中的对象和关联数组有点困惑。我读到了这篇文章:但是这个问题说两者没有太大区别。我在控制台上写了这样的话:
var a = [];
a["A"] = 1;
var b = {};
b["B"] = 2;
var c = new Object();
c["C"] = 3;
以上各项的输出如下:
a gives {A : 1}
b gives {B : 2}
c gives {C : 3}
以上三种情况给出的结果都与它们给出的对象相同。问题是如何在javascript中处理上述三种情况。在您的示例中,
b
和c
本质上是相同的,因为{}
相当于新对象()
回到a
,它被定义为数组
,这是一种特殊类型的对象
,因为数字属性(基于uint32)的处理方式不同。其length
属性在添加和删除这些属性时得到更新
当您使用'A'
作为索引时,它会被视为常规属性,由对象
如何处理属性定义,因此您可以将其作为A.A
或A['A']
访问,而[5]
的索引只能使用A[5]
访问
通常,数组的调试输出总是[]
,除非length
属性为非零,因此显示的输出有点不规则
琐事
根据,特定值p只能是数组索引,当且仅当:
(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)
另见:
请阅读以下文章-
简言之,“规则数组”,在JavaScript中表示为[]
,也是对象,就像{}
,但它们有长度
属性和“数字”键(“标记”),加上它们内部\uuuuu proto\uuuu
属性点位于数组。prototype
对象,它包含所有数组
方法,例如push
或forEach
等。数组也是一个对象,这就是为什么您也可以使用非数字索引的原因。这些将作为属性添加到数组对象,而不是数组数据的一部分
var a = [];
a[42] = 1337;
数组和对象之间的区别在于,数组将带有数字索引的属性作为数组数据的一部分进行计数,并相应地更新length
属性。(另外,数组对象有一些特定的方法来处理数组数据。)
现在,长度已更改为包含项目:
alert(a.length); // shows 43
使用字符串或数字作为索引并不重要,数字索引即使是字符串也会计数:
alert(a[42]); // shows 1337
alert(a["42"]); // shows 1337
缩短长度将删除其外部的属性:
a.length = 10;
alert(a[42]); // shows undefined
让我们从澄清一些事情开始:
newobject()
与{}
new Array()
与[]
后者只是前者的简称
在幕后,javascript中的一切基本上都是一个对象(这有点夸张,但相当准确)。数组只是从对象派生的。下面是一个数组的基本示例:
var myArray = {};
myArray[0] = 'value1';
myArray[1] = 'value2';
myArray[2] = 'value3';
myArray[length] = 3;
数组的原型包含所有方法。例如:
// myArray#push
myArray.prototype.push = function(val){
myArray[this.length] = val;
this.length++;
}
另一种方法是获取数组并添加非数字键:
var example = [];
example.push(0);
example.push(1);
example.push(2);
example['a'] = 'a';
example['b'] = 'b';
example['c'] = 'c';
example.log = function(){
for(var i = 0, l = this.length; i < l; i++){
console.log( example[i] );
}
console.log(this['a']);
console.log(this['b']);
console.log(this['c']);
}
// example[0] is 0
// example[1] is 1
// example[2] is 2
// example.log is my custom function
example.log(); // results in
// 0
// 1
// 2
// a
// b
// c
Chrome将把任何具有数字长度属性和拼接功能的东西作为一个数组。这就是为什么jQuery对象在控制台中看起来像数组。我怀疑第一个对象是否给出{A:1}
。在我的控制台中,它给出了一个空的[]
数组(应该是)。@VisioN:我正在IE中检查它。在IE中,它给出了上面的结果,而不管控制台说什么,a
将有一个a
属性,因为数组也是对象。数组只是特殊对象。对象的处理方式与其他对象完全相同,但它们以特殊的方式处理具有数字名称的属性。始终只使用带有数字键的数组,一切都会正常;)@FelixKling Numeric但不是negative:)那么问题应该重新表述为“为什么IE先验地给出错误语法的错误结果?”。数组元素只不过是具有数字属性名称的属性,所以“它改为属性”这句话有点误导。@是的,我不得不承认这有点奇怪。@FelixKling谢谢你强调这一点,更新了我的答案:)
first is an array
second is an object array
third is an array object
first is an array
second is an object array
third is an array object