数组和对象的区别
对象就是包含 属性/值 的集合,数组就是一组 值 的集合
数组具有一个最基本特征:索引,这是对象所没有的,通过 数组名[索引] 可以访问数组元素。数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
数组和对象的另一个区别是,数组的数据没有”名称”(name),对象的数据有”名称”(name)。
var obj = {};
var arr = [];
obj[2] = 'a';
arr[2] = 'a';
console.log(obj[2]); // 输出 a
console.log(arr[2]); // 输出 a
console.log(obj.length); // 输出 undefined
console.log(arr.length); // 输出 3
obj[2]与arr[2]的区别
obj[2]输出’a’,是因为对象就是普通的键值对存取数据(此处对象存为键值对,即 { obj[2] : ‘a’ })
而arr[2]输出’a’ 则不同,数组是通过索引来存取数据,arr[2]之所以输出’a’,是因为数组arr索引2的位置已经存储了数据
obj.length与arr.length的区别
obj.length并不具有数组的特性,并且obj没有保存属性length,故输出undefined
而对于数组来说,length是数组的一个内置属性,数组会根据索引长度来更改length的值。
为什么arr.length输出3而不是1
这是由于数组的特殊实现机制,对于普通的数组,如果它的索引是从0开始连续的,那么length的值就会等于数组中元素个数
而对于上面例子中arr,在给数组添加元素时,并没有按照连续的索引添加,所以导致数组的索引不连续,那么就导致索引长度大于元素个数(稀疏数组)。
数组和对象操作上的区别
var arr = [1,2,3,4,5,6]
var stu = {
name : "张三",
sex : "男",
age : 18,
address : "四川成都",
}
for (var i in arr) {
console.log(i, arr[i]);
//输出
//0 1
//1 2
//2 3
//3 4
//4 5
//5 6
}
for (var i in stu) {
console.log(i, stu[i]);
//输出
//name 张三
//sex 男
//age 18
//address 四川成都
}
由输出结果可以看出,for-in循环遍历时,i 的取值在数组和对象中是有区别的,i 在数组中代表索引,而在对象中代表了属性名。数组和对象操作元素的方法一致(名字[下标])。
对象可以充当数组中的元素
var scores = [
{id: 1, name:"张三", chinese: 99, math: 88, english: 37},
{id: 2, name:"李四", chinese: 79, math: 98, english: 47},
{id: 3, name:"王二", chinese: 99, math: 76, english: 27},
{id: 4, name:"麻子", chinese: 89, math: 98, english: 57},
{id: 5, name:"老宋", chinese: 99, math: 76, english: 77},
];
var arr = {
id: 1,
name:"张三",
chinese: 99,
math: 88,
english: 37,
}
console.log(arr.name);//输出张三
for(i=0;i<scores.length;i++){
console.log(scores[i].chinese);
//循环输出语文成绩
//99
//79
//99
//89
//99
}