@(JavaScript基础)
关于构造函数Array属性和方法总结
构造函数Array属性:
Array.length
Array 构造函数的 length 属性,其值为1。
Array.prototype
构造函数Array方法
Array.isArray
Array.isArray(obj):
描述:
假如一个变量是数组则返回true,否则返回false
参数:
obj
返回值:
boolean值
例子:
// 下面的函数调用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鲜为人知的事实:其实 Array.prototype 也是一个数组。
Array.isArray(Array.prototype);
// 下面的函数调用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype })
Array.of
Array.of(element0[, element1[, ...[, elementN]]]):
描述:
方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型
参数:
elementN
任意个参数,将按顺序成为返回数组中的元素。
返回值
新的 Array 实例
例子:
Array.of(1); // [1]
Array.of(1, 2, 3); // [1, 2, 3]
Array.from
Array.from(arrayLike, mapFn, thisArg):
描述:
从类数组或者迭代对象(iterable object)中创建一个新的数组实例,
Array.from(obj, mapFn, thisArg) 就相当于 Array.from(obj).map(mapFn, thisArg)
伪数组对象(拥有一个 length 属性和若干索引属性的任意对象)
可迭代对象(可以获取对象中的元素,如 Map和 Set 等)
参数:
arrayLike
想要转换成数组的伪数组对象或可迭代对象。
mapFn (可选参数)
如果指定了该参数,新数组中的每个元素会执行该回调函数。
thisArg (可选参数)
可选参数,执行回调函数 mapFn 时 this 对象
返回值:
一个新的数组实例
例子:
Array.from('foo'); // ["f", "o", "o"]
const obj={
name:'lee',
};
const forEach=item=>item+=item;
const arrayLike={
0:'name',
1:'age',
length:2
}
Array.from(arrayLike,forEach,obj); // ["namename", "ageage"]
构造函数Array实例方法
数组的方法也可以分为增删改查:
查找:
// 以下方法会返回该字符串是否存在某特定字符串的boolean值
----------------------------------------------------------------------------
Array.prototype.includes(searchElement, fromIndex)
描述:
判断当前数组是否包含某指定的值,如果是返回 true,否则返回 false
参数:
searchElement:
需要查找的元素值。
fromIndex:
从该索引处开始查找 searchElement
返回值:
boolean值
例子:
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(3, 2); // true
----------------------------------------------------------------------------
// 以下方法会返回某元素在数组中的索引
----------------------------------------------------------------------------
Array.prototype.indexOf(searchElement[, fromIndex = 0]):
描述:
返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1
参数:
searchElement:
要查找的元素
fromIndex:
开始查找的位置
返回值:
元素所在的索引
例子:
const arr=[1,2,3,4,5,6];
arr.indexOf(5); // 4
arr.indexOf(6,3); // 5
----------------------------------------------------------------------------
Array.prototype.lastIndexOf(searchElement[, fromIndex = arr.length-1]):
描述:
返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1
参数:
searchElement:
要查找的元素
fromIndex:
开始查找的位置
返回值:
元素所在的索引
例子:
const arr=[1,2,3,4,5,6];
arr.lastIndexOf(5); // 4
arr.lastIndexOf(2,3); // 1
arr.lastIndexOf(6,3); // -1
----------------------------------------------------------------------------
Array.prototype.findIndex(callback,thisArg):
描述:
找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回 -1
参数:
callback
针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数:
element
当前元素。
index
当前元素的索引。
array
调用findIndex的数组。
返回值:
强制为true的某元素
thisArg
执行callback时作为this对象的值
返回值:
满足回调函数元素的索引
例子:
const foo=(item,index)=>{
if(item%2===0){
return false;
}else{
return item>10;
}
}
[6,9,10,11].findIndex(foo); // 3
[6,9,10,20].findIndex(foo); // -1
----------------------------------------------------------------------------
// 以下方法会返回数组中的某元素
----------------------------------------------------------------------------
Array.prototype.find(callback[, thisArg])
描述:
找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回 undefined
参数:
callback
在数组每一项上执行的函数,接收 3 个参数:
element
当前遍历到的元素。
index
当前遍历到的索引。
array
数组本身
返回值:
强制为true的某元素
thisArg 可选
指定 callback 的 this 参数
返回值:
当某个元素通过 callback 的测试时,返回数组中的一个值,否则返回 undefined
例子:
const foo=(item,index)=>{
if(item%2===0){
return false;
}else{
return item>10;
}
}
[6,9,10,11].find(foo); // 11
[6,20,10,20].find(foo); // undefined
----------------------------------------------------------------------------
增加:
// 该方法向数组开头添加元素
----------------------------------------------------------------------------
Array.prototype.unshift(element1, ..., elementN):
描述:
将一个或多个元素添加到数组的开头,并返回新数组的长度
参数:
elementN
返回值:
新数组的长度
例子:
const arr=[1,2,3];
arr.unshift(0); // 4
const arr2=[1,2,3];
arr2.unshift(4,5,6); // 6
----------------------------------------------------------------------------
// 该方法向数组尾部添加元素
----------------------------------------------------------------------------
Array.prototype.push(element1, ..., elementN):
描述:
在数组的末尾增加一个或多个元素,并返回数组的新长度
参数:
elementN
返回值:
新数组的长度
----------------------------------------------------------------------------
// 该方法用特定值填充数组特定位置
----------------------------------------------------------------------------
Array.prototype.fill(value, start, end):
描述:
用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
参数:
value
start
end
返回值:
修改后的数组
例子:
[1,2,3,4].fill(5); // [5,5,5,5]
[1,2,3,4].fill(5,2); // [1,2,5,5]
[1,2,3,4].fill(5,1,4); // [1,5,5,5]
----------------------------------------------------------------------------
编辑
总结:
splice() 方法与 slice() 方法的作用是不同的,
splice() 方法会直接对数组进行修改,
slice()方法会返回截取后的数组
----------------------------------------------------------------------------
Array.prototype.slice(begin,end)
描述:
抽取当前数组中的一段元素组合成一个新数组
参数:
begin:
提取数组的起始位置,默认值为0
end:
提取数组的结束位置(该位置取不到),默认值为数组长度
返回值:
一个含有提取元素的新数组
例子:
const names=['panda','cat','dog','monkey'];
names.slice(); // ["panda", "cat", "dog", "mokey"]
names.slice(1); // ["cat", "dog", "mokey"]
names.slice(1,3); // ['cat','dog']
----------------------------------------------------------------------------
Array.prototype.splice(start, deleteCount, item1, item2, ...):
描述:
通过删除现有元素和/或添加新元素来更改一个数组的内容
参数:
start:
指定修改的开始位置(从0计数)
若只使用start参数而不使用deleteCount、item,如:array.splice(start) ,
表示删除[start,end]的元素
deleteCount:
整数,表示要移除的数组元素的个数
item1, item2, ... :
要添加进数组的元素,从start 位置开始
返回值:
由被删除的元素组成的一个数组。
如果只删除了一个元素,则返回只包含一个元素的数组。
如果没有删除元素,则返回空数组
例子:
[1,2,3,4,5].splice(3); // [4,5]
[1,2,3,4,5].splice(2,3); // [3,4,5]
const arr=[1,2,3,4,5];
arr.splice(2,3,6);
// [3,4,5]
// arr: [1,2,6]
arr.splice(2,4,6,7,8,9,0);
// [3, 4, 5]
// [1, 2, 6, 7, 8, 9, 0]
----------------------------------------------------------------------------
// 该方法会对数组内部元素进行复制
----------------------------------------------------------------------------
Array.prototype.copyWithin(target, start, end):
描述:
浅复制数组的一部分到同一数组中的另一个位置,并返回它,而不修改其大小
参数:
target:
0 为基底的索引,复制序列到该位置。如果是负数,target 将从末尾开始计算
start:
0 为基底的索引,开始复制元素的起始位置。如果是负数,start 将从末尾开始计算
如果 start 被忽略,copyWithin 将会从0开始复制
end:
0 为基底的索引,开始复制元素的结束位置
如果 end 被忽略,copyWithin 将会复制到 arr.length
返回值:
改变了的数组
例子:
[1,2,3,4,5].copyWithin(-2); // [1,2,3,1,2]
[1,2,3,4,5].copyWithin(2,1); // [1,2,2,3,4]
[1,2,3,4,5].copyWithin(2,1,3); // [1,2,2,3,5]
----------------------------------------------------------------------------
// 该方法会反转数组
----------------------------------------------------------------------------
Array.prototype.reverse():
描述:
颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个,然后依次颠倒
无参:
返回值:
颠倒顺序之后的新数组
例子:
['hello','world','today','tomorrow','yesterday'].reverse();
// ["yesterday", "tomorrow", "today", "world", "hello"]
----------------------------------------------------------------------------
// 该方法会对数组进行排序
----------------------------------------------------------------------------
Array.prototype.sort(compareFunction)
描述:
在适当的位置对数组的元素进行排序,并返回数组。
默认排序顺序是根据字符串Unicode码点
参数
compareFunction
可选。用来指定按某种顺序进行排列的函数。
如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序
如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变
如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前
返回值:
排序后的数组
例子:
['atom','diy','coo','bar'].sort(); // ["atom", "bar", "coo", "diy"]
function compare(val1,val2){
return val1-val2;
};
[2,9,4,7,5].sort(compare); // [2, 4, 5, 7, 9]
const items=[
{name:'lee',age:18},
{name:'panda',age:9},
{name:'cat',age:15},
{name:'dog',age:6},
{name:'monkey',age:20},
];
function compareAge(val1,val2){
return val1.age-val2.age;
};
items.sort(compareAge);
// [
// {name:'dog',age:6},
// {name:'panda',age:9},
// {name:'cat',age:15},
// {name:'lee',age:18},
// {name:'monkey',age:20},
// ]
----------------------------------------------------------------------------
// 合并数组
----------------------------------------------------------------------------
Array.prototype.concat(value1[, value2[, ...[, valueN]]]):
描述:
用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组
参数:
valueN:
将数组和/或值连接成新数组
返回值:
新的 Array 实例
例子:
const arr1=[1,2,3],
arr2=[4,5,6],
arr3=[7,8,9];
arr1.concat(arr2,arr3);
// [1,2,3,4,5,6,7,8,9];
arr1.concat(0,arr2,arr3);
// [1,2,3,0,4,5,6,7,8,9]
----------------------------------------------------------------------------
删除:
// 该方法删除数组中第一个元素
----------------------------------------------------------------------------
Array.prototype.shift()
描述:
从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度
无参:
返回值:
[1,2,3,4,5].shift(); // 1
----------------------------------------------------------------------------
// 该方法删除数组中最后一个元素
----------------------------------------------------------------------------
Array.prototype.pop():
描述:
从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度
无参
返回值:
从数组中删除的元素
例子:
[1,2,3,4].pop(); // 4
----------------------------------------------------------------------------
以下数组方法与字符串有关
----------------------------------------------------------------------------
Array.prototype.join(separator):
描述:
将数组(或一个类数组对象)的所有元素连接到一个字符串中
参数
separator:
指定一个字符串来分隔数组的每个元素。
如果需要(separator),将分隔符转换为字符串。
如果省略(),数组元素用逗号分隔。默认为 ","。
如果separator是空字符串(""),则所有元素之间都没有任何字符
返回值:
一个所有数组元素连接的字符串
例子:
['h','e','l','l','o'].join(); // "h,e,l,l,o"
['h','e','l','l','o'].join(""); // "hello"
----------------------------------------------------------------------------
----------------------------------------------------------------------------
Array.prototype.toString()
描述:
返回一个由所有数组元素组合而成的字符串,默认以','进行分割
遮蔽了原型链上的 Object.prototype.toString() 方法
无参:
返回值:
返回一个字符串,表示指定的数组及其元素
例子:
const names=['panda','cat','dog','mokey'];
names.toString(); // "panda,cat,dog,mokey"
----------------------------------------------------------------------------
----------------------------------------------------------------------------
Array.prototype.toLocaleString()
描述:
返回一个由所有数组元素组合而成的本地化后的字符串。
数组中的元素将会使用各自的 toLocaleString 方法:
Object: Object.prototype.toLocaleString()
Number: Number.prototype.toLocaleString()
Date: Date.prototype.toLocaleString()
无参:
返回值:
返回一个由所有数组元素组合而成的本地化后的字符串
----------------------------------------------------------------------------
遍历方法
Array.prototype.forEach
Array.prototype.forEach(callback[, thisArg]):
描述:
为数组中的每个元素执行一次回调函数
参数:
callback:
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值):
数组中正在处理的当前元素。
index(索引):
数组中正在处理的当前元素的索引。
array:
forEach()方法正在操作的数组。
thisArg可选
当执行回调 函数时用作this的值(参考对象)
返回值:
undefined
例子:
const arr=[1,2,3,4,5];
const newArr=[];
arr.forEach((item,index)=>{
if(index%2===0){
item+=item;
newArr.push(item);
}
if(index%2!==0){
item*=item;
newArr.push(item)
}
});
console.log(newArr); // [2, 4, 6, 16, 10]
// 利用类创建对象,而且forEach中参数以箭头函数方式传入
class Counter {
constructor(){
this.sum=0;
this.count=0;
}
add(array){
array.forEach(item=>{
this.sum+=item;
++this.count
})
}
}
const obj=new Counter();
obj.add([1,2,3,4,5]);
obj.sum; // 15
obj.count; // 5
// 利用类创建对象,而且forEach中参数以函数方式传入
class Counter {
constructor(){
this.sum=0;
this.count=0;
}
add(array){
array.forEach(function(item){
this.sum+=item;
++this.count
})
}
}
const obj=new Counter();
obj.add([1,2,3,4,5]);
obj.sum; // Uncaught TypeError: Cannot read property 'sum' of undefined
// 利用类创建对象,而且forEach中参数以箭头函数方式传入,并传入this
class Counter {
constructor(){
this.sum=0;
this.count=0;
}
add(array){
array.forEach(function(item){
this.sum+=item;
++this.count
},this)
}
}
const obj=new Counter();
obj.add([1,2,3,4,5]);
obj.sum; // 15
Array.prototype.every
Array.prototype.every(callback[, thisArg])
描述:
测试数组的所有元素是否都通过了指定函数的测试
如果数组中的每个元素都满足测试函数,则返回 true,否则返回 false
参数:
callback:
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值):
数组中正在处理的当前元素。
index(索引):
数组中正在处理的当前元素的索引。
array:
forEach()方法正在操作的数组。
thisArg可选
当执行回调 函数时用作this的值(参考对象)
返回值:
boolean值
例子:
const compare=(item,index)=>{
return item>2;
};
[1,2,3,4,5].every(compare); // false
[3,4,5,6,7].every(compare); // true
Array.prototype.some
Array.prototype.some(callback[, thisArg])
描述:
如果数组中至少有一个元素满足测试函数,则返回 true,否则返回 false
参数:
callback:
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值):
数组中正在处理的当前元素。
index(索引):
数组中正在处理的当前元素的索引。
array:
forEach()方法正在操作的数组。
thisArg可选
当执行回调 函数时用作this的值(参考对象)
返回值:
boolean值
例子:
const compare=(item,index)=>{
return item>4;
};
[1,2,3,4,0].some(compare); // false
[3,4,5,6,7].some(compare); // true
Array.prototype.filter
Array.prototype.filter(callback[, thisArg])
描述:
将所有在过滤函数中返回 true 的数组元素放进一个新数组中并返回
参数:
callback:
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值):
数组中正在处理的当前元素。
index(索引):
数组中正在处理的当前元素的索引。
array:
forEach()方法正在操作的数组。
thisArg可选
当执行回调 函数时用作this的值(参考对象)
返回值:
一个新的通过测试的元素的集合的数组
例子:
const compare=(item,index)=>{
return item>2;
};
[1,2,3,4,0].filter(compare); // [3,4]
Array.prototype.map
Array.prototype.map(callback[, thisArg])
描述:
返回一个由回调函数的返回值组成的新数组
参数:
callback:
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue(当前值):
数组中正在处理的当前元素。
index(索引):
数组中正在处理的当前元素的索引。
array:
forEach()方法正在操作的数组。
thisArg可选
当执行回调 函数时用作this的值(参考对象)
返回值:
一个新数组,每个元素都是回调函数的结果
例子:
['1', '2', '3'].map( str => parseInt(str) ); // [1,2,3]
Array.prototype.keys
Array.prototype.keys()
描述:
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键
无参:
返回值:
一个新的 Array 迭代器对象
例子:
const arr = ["a", "b", "c"];
const iterator = arr.keys();
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true}
Array.prototype.values
Array.prototype.values()
描述:
返回一个数组迭代器对象,该迭代器会包含所有数组元素的值
谷歌,火狐暂未实现
Array.prototype.entries
Array.prototype.entries()
描述:
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对
无参:
返回值:
一个新的 Array 迭代器对象
例子:
const arr = ["a", "b", "c"];
const iterator = arr.entries();
console.log(iterator.next()); // { value:[0,'a'], done:false}
console.log(iterator.next()); // { value:[1,'b'], done:false}
console.log(iterator.next()); // { value:[2,'c'], done:false}
console.log(iterator.next()); // { value:undefined, done:done}
Array.prototype.reduce
Array.prototype.reduce(callback[, initialValue]):
描述:
从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,
并返回最后一次回调函数的返回值
参数:
callback
执行数组中每个值的函数,包含四个参数:
accumulator
累加器累加回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
currentValue
数组中正在处理的元素。
currentIndex
数组中正在处理的当前元素的索引。 如果提供了initialValue,则索引号为0,否则为索引为1。
array
调用reduce的数组
返回值:
强制返回accumulator,否则为undefined
initialValue
用作第一个调用 callback的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素
返回值:
函数累计处理的结果
例子:
let arr=[];
const add=(init,item,index)=>{
if(item%2===0){
init+=item;
arr.push(index);
return init;
}else{
return init
}
};
let sum=[1,2,3,4,5,6].reduce(add);
console.log(sum); // 13
console.log(arr); // [1, 3, 5]
[7,8,9,10].reduce(add,sum); // 31
Array.prototype.reduceRight
Array.prototype.reduceRight(callback[, initialValue])
描述:
从右到左为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,
并返回最后一次回调函数的返回值
参数:
callback
执行数组中每个值的函数,包含四个参数:
accumulator
累加器累加回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
currentValue
数组中正在处理的元素。
currentIndex
数组中正在处理的当前元素的索引。 如果提供了initialValue,则索引号为0,否则为索引为1。
array
调用reduce的数组
返回值:
强制返回accumulator,否则为undefined
initialValue
用作第一个调用 callback的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素
返回值:
函数累计处理的结果
例子:
let arr=[];
const add=(init,item,index)=>{
if(item%2===0){
init+=item;
arr.push(index);
return init;
}else{
return init
}
};
let sum=[1,2,3,4,5,6].reduceRight(add);
console.log(sum); // 12
console.log(arr); // [3,1]
[7,8,9,10].reduceRight(add,sum); // 31
对方法一些特性进行总结:
以下方法会改变调用他们自身的对象的值:
Array.prototype.copyWithin()
Array.prototype.fill()
Array.prototype.pop()
Array.prototype.push()
Array.prototype.reverse()
Array.prototype.shift()
Array.prototype.sort()
Array.prototype.splice()
Array.prototype.unshift()
以下方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值:
Array.prototype.concat()
Array.prototype.includes()
Array.prototype.join()
Array.prototype.slice()
Array.prototype.toString()
Array.prototype.toLocaleString()
Array.prototype.indexOf()
Array.prototype.lastIndexOf()
与字符串共有的方法
Array.prototype.includes()
Array.prototype.slice()
Array.prototype.concat()
Array.prototype.toString()
关于数组遍历方法返回值总结:
Array.prototype.forEach(callback[, thisArg])
无返回值
Array.prototype.every(callback[, thisArg])
返回boolean值
Array.prototype.some(callback[, thisArg])
返回boolean值
Array.prototype.filter(callback[, thisArg])
返回 true 的数组元素组成的新数组
Array.prototype.map(callback[, thisArg])
返回一个由回调函数的返回值组成的新数组。
Array.prototype.keys()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键。
Array.prototype.values()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的值
Array.prototype.entries()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对。
Array.prototype.reduce()
Array.prototype.reduceRight()
Array.prototype[@@iterator]()