Array methods

every

every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
如果发现了一个不符合条件的元素,every 方法将会立即返回 false,停止后面的便利

参数说明

/**
* element 当前项
* index    索引
* array 源数组
*/
let arr1 = [12, 5, 8, 130, 44]
let arr2 = [12, 54, 18, 130, 44]

function isBigEnough(element, index, array) {
    arr1.splice(0)
    console.log(element, index, array, this)
    return element >= 10;
}

/**
* callback 回调函数
* thisArg 执行 callback 时使用的 this 值。 非严格模式下不指定为 window, 严格模式下为undefined 
*/
arr1.every(isBigEnough);   // false
arr2.every(isBigEnough, [100]); // true

在调用 every 之后添加到数组中的元素不会被 callback 访问到

var arr1 = [12, 15, 8, 130, 44]

function isBigEnough(element, index, array) {
    console.log(element, index, array, this, arr1)

    arr1.push(0)
    return element >= 8;
}

arr1.every(isBigEnough);   // true

如果数组中存在的元素被更改,则他们传入 callback 的值是 every 访问到他们那一刻的值

var arr1 = [12, 15, 8, 130, 44]

function isBigEnough(element, index, array) {
    console.log(element, index, array, this, arr1)

    arr1[2] = 5
    return element >= 8;
}

arr1.every(isBigEnough);  // false

那些被删除的元素或从来未被赋值的元素将不会被访问到。

var arr1 = [12, 15, 5, 130, 44]
arr1.length = 6
// arr1[5] 是一个从来未被赋值的元素

function isBigEnough(element, index, array) {
    console.log(element, index, array, this, arr1)

    arr1.splice(2, 1)
    return element >= 8;
}

arr1.every(isBigEnough);

every 不会改变原数组

filter

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 
filter 为数组中的每个元素调用一次 callback 函数,
并利用所有使得 callback 返回 true 或等价于 true 的值的元素创建一个新数组。

参数说明

同 every 函数

filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。

  • 在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
  • 如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。
  • 被删除或从来未被赋值的元素不会被遍历到。

代码同 every 函数测试代码

filter 不会改变原数组

map

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。
当你不打算使用返回的新数组却使用map是违背设计初衷的,请用forEach或者for-of替代。

参数说明

同 every 函数

map 遍历的元素范围在第一次调用 callback 之前就已经确定了。

  • 在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
  • 如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。
  • 被删除或从来未被赋值的元素不会被遍历到。

代码同 every 函数测试代码

map 不会改变原数组

reduce

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

参数说明

const array1 = [1, 2, 3, 4];
/**
* accumulator    累加器
* currentValue    当前值
* currentIndex    当前项
* sourceArray    源数组
*/
const reducer = (accumulator, currentValue, currentIndex, sourceArray) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
/**
* callback    回调函数
* initialValue    作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 
在没有初始值的空数组上调用 reduce 将报错。
*/
console.log(array1.reduce(reducer, 5));
// expected output: 15
注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。 如果提供initialValue,从索引0开始。

reduce 遍历的元素范围在第一次调用 callback 之前就已经确定了。

  • 在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
  • 如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。
  • 被删除或从来未被赋值的元素不会被遍历到。

代码同 every 函数测试代码

reduce 不改变源数组

some

some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
找到一个使得 callback 返回一个“真值”时,立即停止后面的查找

参数说明

同 every 函数

some 遍历的元素范围在第一次调用 callback 之前就已经确定了。

  • 在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
  • 如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。
  • 被删除或从来未被赋值的元素不会被遍历到。

代码同 every 函数测试代码

some 不改变源数组

slice

slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

可实现数组的浅拷贝

参数列表

var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
/**
* start 起始坐标(包含、可为负、默认从0开始、如大于数组长度则返回 [])(可选)
* end    终止坐标(不包含、默认值一直提取到数组的最后、可为负最后一个为 -1、大小超出数组长度时,一直提取到数组的最后)(可选)
*/
var citrus = fruits.slice(1, 3);

slice 方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组

function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

slice 不会修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素

splice

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

参数列表

var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
var myFish = ["angel", "clown", "mandarin", "sturgeon"];

/**
* start 起始坐标(包含、可为负、默认从0开始、如大于数组长度则返回 [])(可选)
* deleteCount     删除元素的长度或者插入元素的位置
* item1, item2, ... 需要插入的元素
*/
var citrus = fruits.slice(1, 3);
var removed = myFish.splice(2, 0, "drum");

splice 会改变原数组

js
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。