js|数组方法和判断数组的方法✌️✌️

126 阅读6分钟

改变数组的方法

会改变原来数组的有:
pop()---删除数组的最后一个元素并返回删除的元素。
push()---向数组的末尾添加一个或更多元素,并返回新的长度。
shift()---删除并返回数组的第一个元素。
unshift()---向数组的开头添加一个或更多元素,并返回新的长度。
reverse()---反转数组的元素顺序。
sort()---对数组的元素进行排序。
splice()---用于插入、删除或替换数组的元素。返回删除的元素组成的数组 (如果是插入操作的话,返回[])

arr.splice(index, num) // 删除 index下标 num 删除个数
arr.splice(index, 0, 'a', 'b') // 添加 index开始插入的索引位置,0表示删除0个,后面的表示添加的元素
arr.splice(index, num, 'x', 'y', 'z')  // 替换 index开始删除的索引,num表示删除的个数,后面的几个元素插入到删除的位置上

不改变数组的方法

不会改变数组的有:
concat()---连接两个或更多的数组,并返回结果。
every()---检测数组元素的每个元素是否都符合条件。
some()---检测数组元素中是否有元素符合指定条件。
filter()---检测数组元素,并返回符合条件所有元素的数组。
indexOf()---搜索数组中的元素,并返回它所在的位置。
join()---把数组的所有元素放入一个字符串。
toString()---把数组转换为字符串,并返回结果。
lastIndexOf()---返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
map()---通过指定函数处理数组的每个元素,并返回处理后的数组。
slice()---选取数组的的一部分,并返回一个新数组。
valueOf()---返回数组对象的原始值。
reduce()---方法也不会改变原数组的值

数组方法

3、includes

includes是数组的方法,返回一个布尔值,判断数组中是否有某个元素

4、数组的entries(),keys() 和 values()

这3个方法返回的值是遍历器,需要使用for of进行遍历

let arr = [1, 2, 3, 4, 5];
for (let key of arr.keys()) {
    console.log(key); // 0 1 2 3 4
}
let arr = [1, 2, 3, 4, 5];
for (let value of arr.values()) {
    console.log(value); // 1 2 3 4 5
}
let arr = [1, 2, 3, 4, 5];
for (let [k, v] of arr.entries()) {
    console.log([k, v]); //  [ 0, 1 ][ 1, 2 ][ 2, 3 ][ 3, 4 ][ 4, 5 ]
}

5、forEach

  • forEach没有返回值,永远返回是undefined,
  • 如果使用值类型修改,原数组不会改变,如果使用下标方式或者引用类型改变原数组会改变
  • 无法使用return、break退出循环,必须遍历完数组,自己结束

(1) forEach遍历的是基本类型,而且不是通过下标修改的方式,不会影响原数组

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.forEach((el, index, arr) => {
    el = el * 2;
})
console.log(res); // undefined 返回值
console.log(arr); //[ 1, 2, 3, 4, 5, 6, 7, 8]

(2)forEach遍历的是基本类型,通过下标修改的方式,会影响原数组

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.forEach((el, index, arr) => {
    arr[index] = el * 2;
})
console.log(res); // undefined 返回值
console.log(arr); // [2,  4,  6,  8, 10, 12, 14, 16]

(3)forEach遍历的是引用类型,会影响原数组

let arr = [{ name: 'tom', age: 1 }, { name: 'jake', age: 2 }];
arr.forEach((el) => {
    el.age += 10;
})
console.log(arr); // [{ name: 'tom', age: 11 },{ name: 'jake', age: 12 }]

(4)如果非要终止就使用try...catch


var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
try {
 ary.forEach(function (el) {
   console.log(el);
   if (el === "CoffeeScript") throw Error;
 });
} catch (e) {
 if (e !== Error) throw e;
}

6、map

  • map中如果使用return则有返回值,如果没有使用,则返回undefined
  • map如果使用值类型修改,原数组不会改变,如果使用下标方式或者引用类型改变原数组会改变
  • map不可以使用return或者break退出
  • map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

(1)map遍历基本数据类型,且使用return返回值,原数组不变

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.map((el) => {
    return el * 2;
})
console.log(res); //  [2,  4, 6, 8, 10, 12, 14, 16] 因为使用return所以有返回值
console.log(arr); //[ 1, 2, 3, 4, 5, 6, 7, 8] 

(2)map遍历基本类型,使用下标方式,原数组发生改变

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.map((el, index) => {
    return arr[index] = el * 2;
})
console.log(res); //  [2,  4,  6,  8,10, 12, 14, 16] 因为使用return所以有返回值
console.log(arr); // [2,  4,  6,  8,10, 12, 14, 16]  原数组发生变化

(3)map遍历引用类型,原数组发生改变

let arr = [{ name: 'tom', age: 1 }, { name: 'jake', age: 2 }];
let res = arr.map((el) => {
    el.age += 10;
    return el;
})
console.log(res);  // [ { name: 'tom', age: 11 }, { name: 'jake', age: 12 } ]
console.log(arr); // [{ name: 'tom', age: 11 },{ name: 'jake', age: 12 }]

7、every

  • 如果所有项都满足,返回true,有一项不满足,返回false,不再遍历之后的数据项;空数组返回true
  • 如果使用下标方式或者引用类型改变原数组会改变
  • 只要回调函数返回的是false,循环立刻终止

(1)判断基本类型

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.every((el) => {
    return el > 0;
})
console.log(res); //  true
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.every((el) => {
    console.log(el);  // 当检测到1 不符合时,返回false,后面的数据项不在执行
    return el > 3;
})
console.log(res); //  false
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变

8、Some

  • 如果有一项都满足,返回true;所有项都不满足,返回false,不再遍历之后的数据项;空数组返回false
  • 如果使用下标方式或者引用类型改变原数组会改变
  • 只要回调函数返回的是true,循环立刻终止

(1) 返回true

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.some((el) => {
    console.log(el);  // 当检测到1,2,3,4  4符合时,返回true,后面的数据项不在执行
    return el > 3;
})
console.log(res); //  true
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变

(2) 返回false

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.some((el) => {
    return el > 10;
})
console.log(res); //  false
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变

9、filter

  • 不会改变原数组的值
  • 将符合条件的值组合成新的数组返回
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.filter((el) => {
    return el > 4;
})
console.log(res); //  [5,6,7,8]
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变

10、reduce

  • reduce是一个累加器
  • 最常见的应用是做数组扁平化
let arr = [1, 2, [3, 4,], [5, 6]];
function flatten(arr) {
    return arr.reduce((result, item) => {
        return result.concat(Array.isArray(item) ? flatten(item) : item)
    },[])
}
console.log(flatten(arr)); // [ 1, 2, 3, 4, 5, 6 ]
  • es6提供数组扁平化的函数
let arr = [1, 2, [3, 4,], [5, 6]];
console.log(arr.flat(Infinity)); // [ 1, 2, 3, 4, 5, 6 ]

11、find

  • 不会改变原数组
  • 找到第一个值作为返回值
let arr = [1, 2, 3, 4, 5, 6, 7, 8];
let res = arr.find((el) => {
    return el > 4;
})
console.log(res); //  5
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8]  原数组不发生改变

判断数组的方法

  1. Obejct.prototype.toString.call(obj).slice(8,-1) === 'Array'
let arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr).slice(8, -1) === 'Array'); // true
  1. Object.getPrototypeOf(obj) === Array.prototype
let arr = [1, 2, 3];
// Object.getPrototype(obj)是ES5中用来获取obj对象的原型对象的标准方法。
console.log(Object.getPrototypeOf(arr) === Array.prototype);// true
  1. Array.prototype.isPrototypeOf(obj)
let arr = [1, 2, 3];
// JS isPrototypeOf()方法:检测一个对象是否存在于另一个对象的原型链中
console.log(Array.prototype.isPrototypeOf(arr)); // true
  1. Array.isArray(obj)
let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true
  1. obj instanceof Array
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
  1. obj.__proto__ = Array.prototype
let arr = [1, 2, 3];
console.log(arr.__proto__ === Array.prototype); // true
  1. obj.constructor === Array
let arr = [1, 2, 3];
console.log(arr.constructor === Array); // true

参考:👀

# forEach中return有效果吗?如何中断forEach循环?

www.jianshu.com/p/f90db19ed…

cuggz.blog.csdn.net/article/det…