Javascript Array
-
由于数组成员的键名是固定的(默认总是0、1、2…),因此数组不用为每个元素指定键名,而对象的每个成员都必须指定键名。JavaScript 语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。
-
length
// 只要是数组,就一定有length属性。该属性是一个动态的值,等于键名中的最大整数加上1。
-
空位
当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)
数组的某个位置是空位,与某个位置是
undefined
,是不一样的。如果是空位,使用数组的forEach
方法、for...in
结构、以及Object.keys
方法进行遍历,空位都会被跳过。-
数组的空位不影响
length
属性。var a = [1,,1]; console.log(a.length); // 2
-
如果最后一个元素后面有逗号,并不会产生空位
var a = [1,2,3,4,]; consle.log(a.length); // 4
-
数组的空位是可以读取的,返回
undefined
。var a = [,,,,,]; a[1]; // undefined
-
使用
delete
命令删除一个数组成员,会形成空位,并且不会影响length
属性。var a = [1,2,3,4]; delete a[1]; console.log(a.length); console.log(a[1]);
-
-
数组和类数组
如果一个对象的所有键名都是正整数或零,并且有
length
属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)。-
类数组转为类数组(字符串也是类数组)
let arr = Array.prototype.slice.call(arrylike);
-
类数组可以通过call来调用数组的方法
let arrlike = { "0":'a', "1":"b", length:2 } Array.prototype.forEach.call(arrlike,function(item,index) { console.log(item,index); });
-
-
Array.prototype 所有数组实例都会从 [
Array.prototype
] 继承属性和方法。修改Array
的原型会影响到所有的数组实例。-
[
push()
] / [pop()
] - 在数组末尾增/删元素; -
[
unshift()
] / [shift()
] - 在数组首部增/删元素; -
[
concat()
] - 把一个(或多个)数组和(或)值与原数组拼接,返回拼接后的数组。 -
indexOf
-
splice
语法: array.splice(start[, deleteCount [, item1[, item2[, ...]]]]) 注意:在中括号外的是必要参数
- start 起始索引
- deleteCount待删除的个数
- [item1,....] 插入的元素
var myFish = ["angel", "clown", "mandarin", "sturgeon"]; // 从索引2开始删除0个元素插入drum; // var removed = myFish.splice(2, 0, "drum"); // console.log(removed); // 从索引2开始删除1个元素插入"truemp"" var removed = myFish.splice(2, 1, "truemp"); console.log(myFish);
// 通过索引删除一个元素 let pos = 1; let fruits = ["Strawberry", "Banana", "Mango"]; let removeItem = fruits.splice(pos,1);
-
slice
// 赋值数组 var shallowCopy = fruits.slice(); // 浅拷贝就是基本类型值是直接复制值的,引用类型值是复制引用的( 当在一个数组中修改引用数据类型的时候,也会影响另外一个)
应用:将类数组转为数组
[].slice.call(arraylike); Array.prototype.slice.call(arraylike);
-
-
Array
- from
// 从类数组中构造数组,可以调用回调函数 Array.from(arrlike) Array.from(arrlike,[mapFn]) Array.from(arrlike).map(fn) // 从string中生成数组 // 从set中生成数组 // 从Map中生成数组 // 从类数组对象中生成数组arguments // 序列生成器 const range = (start, stop, step) => Array.from({length:stop-start/step + 1},(_,i)=>start+i*step);
-
isArray
// 判断是否为数组 // 鲜为人知的事实:其实 Array.prototype 也是一个数组。 Array.isArray(Array.prototype); // Array.isArray的实现方式 if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
-
of
Array(7) // [ , , , , , , ] // 创建了7个数组的空位 这是指一个有7个空位(empty)的数组,而不是由7个undefined组成的数组 Array.of(7) // [7]