JS数组
爱思考的猪 人气:01.定义
数组是按次序依次排列的一组值
- 任何数据类型都可以放入数组
- 数组可以嵌套形成多维数组
const arr = [0,'1',{},function(){}]; //二维数组 const arr1 = [1,2,[3,4,5],6];
2.数组的本质
数组是一种特殊的对象,数组的key是正整数字符串,我们一般使用数字键操作数组,会自动转换成字符串
const arr = []; arr['1'] = 1; //1被自动转换成'1' console.log(arr[1],arr['1']); //1 typeof arr; //obejct
3.数组的length
数组的length计算的是数组中正整数的个数,但你依然可以将数据的key设置为其它类型的值,不过这不会增加length的长度
const arr = []; arr[2.1] = 2.1; arr['a'] = 'a'; console.log(arr); //[2.1: 2.1, a: 'a'] console.log(arr.length); //0
length是可写的
const arr = [1,2,3,4,5]; arr.length = 2; console.log(arr); //[1,2]
4. in
in关键用来判断数组中存在某个键,可应用于数组和对象
const arr = ['a','b']; 1 in arr; // true 2 in arr; //fasle
5. for…in
- for…in用来遍历数组和对象
- 遍历数组的时候不仅能遍历整数的key,还能遍历所有非整数的key
- Object.keys()也能获取到数组的非整数的key
const arr = [1,2]; arr['a'] = 3; arr[4.5] = 4; for(key in arr){ console.log(key); }; // 0 // 1 // a / 4.5 Object.keys(arr); // ['0', '1', 'a', '4.5']
6.数组的空位
- 即两个逗号之间没有任何值会产生空值(empty)
- 使用delete会产生empty
- 数组的lengt包含empty
var arr = [1,5,,8]; console.log(arr); //[1, 5, empty, 8] //使用delete也会产生空值 delete arr [0]; console.log(arr); //[empty, 5, empty, 8] console.log(arr.length); //4
- 空值和undefined有所区别,undefined参与for…in和forEach的遍历,empty不参与遍历
- Object.keys能获取到undefined的key获取不到empty的key
- 使用length能遍历出empty
const arr1 = new Array(10); //[empty × 10] for (key in arr1) { console.log(arr1); }; //无输出,没有进行遍历 arr1.forEach((v) => { console.log(v) }); //无输出,没有进行遍历 console.log(Object.keys(arr1)); //[] const arr2 = [undefined, undefined, undefined]; //[empty × 10] for (key in arr2) { console.log(key); }; //0 //1 //2 arr2.forEach((value, index) => { console.log(value, index) }); // undefined,0 // undefined,1 // undefinef,2 console.log(Object.keys(arr2)); //[3] // 使用for循环遍历empty for(let i = 0;i<arr1.length;i++){ console.log(arr1[1]) }; //undefined × 10
7.类数组(伪数组)
类数组的定义:键名都是正整数或零,拥有length属性
const arrayLike = { 0:'a', 1:'b', 2:'c', length:3 }; arrayLike[3] = 'd'; console.log(arrayLike[0]); //a console.log(arrayLike.length); //3
上面的代码为arrayLike添加了一个数字键,但length没有改变,这就说明arrayLike不是数组
典型的类数组有函数的arguments、大多数的元素DOM集合、字符串
function foo(){ console.log(arguments); }; foo('tom','jack'); // {0:'tom', 1:'jack', length:2, callee:...} console.log(document.getElementsByClassName('a')); //{"0": ...,"1": ...,"2":..., "length":3} const str = 'apple'; console.log(str.length); //5 consoel.log(str[2]); //p
将伪数组转为数组
- 使用Array.prototype.slice
- 使用拓展运算符
function foo(){ const arr = Array.prototype.slice.call(arguments); } function foo(){ const arr = [...arguments] } function foo(...args){ }
总结
- 数组的empty和undefined有所区别,empty不会被for…in和forEache以及Object.keys运算,但计算length的时候会包含empty,因此使用length循环带有empty的数组时要格外小心
- 类数组也叫伪数组,是指对象的属性为正整数或者零而且具有length属性的对象
- 使用Array.prototype.slice.call()或者拓展运算符将类数组转换为数组,类数组可以使用call函数借用数组的方法
加载全部内容