一.数组
1>数组就是存储一系列值的,任何类型的数据,都可以放入数组
var arr = [2, '2', false,{a:1}, [1,2,3],function(){return true;},undefined,null]
console.log(arr)
2>多维数组:
var arr=[[22,33],[45,54]]
var arr=[[[232],[32]],[[2342],[232]]]
console.log(arr[0][0][0])//232
3>数组类型其实是一个object
var arr=[112,23,3,4]
console.log(typeof arr)//object
console.log(Object.keys(arr))// ["0", "1", "2", "3"]
1)Object.keys返回数组中的所有键值
arr['0']// 112
arr[0]//112
在这里字符串0和数字0都能获取数组中对应的数据,键名其实是string类型,如果你写的是number类型,它可以自动转化为string类型
var arrKeys=Object.keys(arr)
console.log(typeof arrKeys[0])//string
2)如果想获取数组中某个元素
var arr=[112,23,3,4];
arr.0// 报错-----因为数值型不能单独作为标识符
二、数组属性
1>length获取数组长度
var arr=[112,23,3,4];
console.log(arr.length)//4
1)
var arr=[112,23,3,4]
arr[7]=7//添加修改元素
console.log(arr,arr.length)
2)将数组长度改成比当前数组长度小的值,那么arr会自动删除arr长度后面的值。如果修改的length比当前数组长度长,那么则自动添加,只不过添加的都是empty(空位)
var arr=[112,23,3,4]//arr.length是4
arr.length=2
console.log(arr)//[112, 23]---数组后面的3、4元素都被删了
arr.length=10
console.log(arr)//[112, 23, empty × 8]//添加了8个空位
console.log(arr[5])//undefined
注意:如果length不合法,报错
3)
var arr =[1,23,5]
arr[0.03]=3
arr['xiaoming']='xm'
console.log(arr,'arr')
看到上图 length是3。为什么我们添加了键名0.03、xiaoming两个键名,但length是3呢?length属性的值就是等于最大的数字键加1,这里面最大的数字键是2,所以length是2+1是3。
三、in 运算符:检查某个键名是否存在,可用于对象和数组。
var arr =[1,23,5]
console.log(1 in arr)//true
console.log(2 in arr)//true
console.log('2' in arr)//true
console.log(6 in arr)//false----因为arr键名只有0,1,2所以输出false
arr.lenght=10
console.log(8 in arr)//false----因为8这里是空位(empty)
四、数组空位:
1>数组中两个逗号之间没有值。不影响length,获取空位上的元素时是undefined,但实际上是没有值,可以读到length但是获取不到键名
var arr=[23,,,89]
console.log(arr.length)//4
console.log(arr[1])//undefined
2> 使用delete命令删除一个数组成员,会形成空位,并且不会影响length属性。
var arr =[1,,23,5]
delete arr[1]//[1, empty, 23, 5],arr.length还是4
delete arr[2]//[1, empty × 2, 5],arr.length还是4
delete对象中的成员
var obj={
a:'222',
b:'333',
c:'44'
}
delete obj.a
这时候obj就变成了{b: "333", c: "44"}
3>空位和undefined的区别
1)空位
var arr = [, , ,];
arr.forEach(function (x, i) {
console.log(i +'-------------'+ x);// 没有产生任何输出
})
for (var key in arr) {
console.log(key); // 没有产生任何输出
}
let keys=Object.keys(arr)
console.log(keys)// []
2)undefined
var arr = [111,221,undefined,444];
arr.forEach(function (x, i) {
console.log(i + '-------------' + x);
})
//0-------------111
// 1-------------221
//2-------------undefined
//3-------------444
for (var key in arr) {
console.log(key);
}
//0
//1
//2
//3
let keys=Object.keys(arr)
//["0", "1", "2", "3"]
总结:空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过遍历。而键值是undefined则不会跳过遍历
五、类似数组的对象
1> var obj = {0:'a',1:'b',2:'c',length:3}
obj[0]// 'a'
obj[1]// 'b'
obj.length// 3
obj.push('d')// error
这个obj就是一个类似数组的对象,但他不是数组,因为它不具备数组特有的方法
“类似数组的对象”的根本特征,就是具有length属性。只要有length属性,就可以认为这个对象类似于数组。但是有一个问题,这种length属性不是动态值,不会随着成员的变化而变化。
2>有哪些常见的‘类似数组对象’
1).函数的arguments对象
function args() { return arguments }
var arrayLike = args('str1', 'str2');
console.log(arrayLike)//2
console.log(arrayLike instanceof Array)//false
2).大多数 DOM 元素集
var domArray = document.querySelectorAll('div');
console.log(domArray.length)//4
console.log(domArray instanceof Array)//false
3).字符串
var str='aedtee'
str instanceof Array // false
console.log(str.length)//6
console.log(str)//false
3>“类似数组对象”怎么使用Array上的方法
1)数组的slice方法,让“类似数组对象”变成真正数组
var arr =Array.prototype.slice.call(arrayLike);
console.log(arr instanceof Array)//true
2)call()把数组的方法放到对象上面
Array.prototype.forEach.call(arrayLike, function(value, index){
console.log(index + ' : ' + value);
});
通过call(),把forEach()继承到arrayLike上面。
注意,这种从Array中继承的forEach比数组forEach要慢。建议先将“类似数组对象“转化为真正的数组,再使用。