数组和对象的区别

对象就是包含 属性/值 的集合,数组就是一组 值 的集合
数组具有一个最基本特征:索引,这是对象所没有的,通过 数组名[索引] 可以访问数组元素。数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。

数组和对象的另一个区别是,数组的数据没有”名称”(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
        }