1. forEach()
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。forEach() 是会循环完数组的每一项。
下面看看我用到的forEach的几种情况:
一是通过循环数组的每一项,找到符合条件的元素加以使用。
上面这种情况既然是找到符合条件的就可以了,那为什么不用find呢?foreach还会遍历完整个数组。因为该方法里写了业务逻辑,不符合find方法的使用目的。
二是改变数组,把表单的值给到数组,从而数组多一项instanceId。
2. find()
find() 方法返回用过符合测试(通过函数判断)的数组的第一个元素的值。
find() 方法为数组中的,每个元素都调用一次函数执行:
- 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
- 如果没有符合条件的元素返回 undefined。
- find() 对于空数组,函数是不会执行的, find() 并没有改变数组的原始值。
const arr = [34, 65, 87, 48, 99]; // find() 方法 const arrNew = arr.find(num => { return num >= 66; }); console.log(arrNew); // 87
总之,find()方法目的是找出符合条件的那项元素,然后不会再往后执行,不对数组做过多的操作
3. map()
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
map() 不会对空数组进行检测,不会改变原数组。
适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。
let arr = [1, 2, 3, 4, 5];
let arr2 = arr.map(value => value * value).filter(value => value > 10);
// arr2 = [16, 25]
var a = [1,2,3,4];
var newa = a.map(function(x){
return x = x+1;
});
console.log(newa,a);
//newa : 2 3 4 5 //a: 1 2 3 4
4. filter()
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
filter() 不会对空数组进行检测,不会改变原数组。因为都是对元素的遍历,所以我猜想 如果把map中调用的函数换成filter里面的过滤函数是否能得到相同的结果呢。
var a = [1,2,3,4];
var newa = a.filter(function(x){
return x > 1;
});
console.log(newa,a);
//newa : 2 3 4 //a: 1 2 3 4
因为都是对元素的遍历,所以 如果把map中调用的函数换成filter里面的过滤函数是否能得到相同的结果呢。
var a = [1,2,3,4];
var newa = a.map(function(x){
return x > 1;
});
console.log(newa,a);
//newa :false true true true //a: 1 2 3 4
可以看出来newa 的到的并不是数字,它们只是对当前元素调用函数后(x是否大于1)的结果。而filter 会将结果为true的数组存到新的数组里面。
5. some()
some() 方法用于检测数组中的元素是否满足指定条件(函数提供), 返回true或false。
some() 方法会依次执行数组的每个元素:
- 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
- 如果没有满足条件的元素,则返回false。
some() 不会对空数组进行检测,不会改变原数组。
getDbData(dbList: any) {
this.dbList = dbList;
this.formInvalid = dbList.some((item) => item.formInvalid === true);
} // 查看数组中的formInvalid值是true还是false
5. Object.assign()
Object.assign(target, source_1, ···) 用于将源对象的所有可枚举属性复制到目标对象中。
const target = { a: 1, b: 2};
const source = { b: 4, c: 5};
// 第一个参数是目标对象,后面的参数是源对象,可以有多个源对象
const returnedTarget = Object.assign(target, source);
console.log(target);
console.log(returnedTarget);
// {a: 1, b: 4, c: 5}
// {a: 1, b: 4, c: 5}
可以看到:
- 如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则源对象属性会覆盖目标的属性(目标对象的属性b替换掉目标对象的属性b)。
- 如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回
Object.assign(3);
consol.log(Object.assign(3)) // Number {3}
typeof Object.assign(3); // "object"
Object.assign("name");
console.log(Object.assign("name"))
// String {'name'}
0: 'n'
1: 'a'
2: 'm'
3: 'e'
length: 4
Object.assign([2,3], [5]); // [5,3]
会将数组处理成对象,所以先将 [2,3] 转为 {0:2,1:3} ,然后再进行属性复制,所以源对象的 0 号属性覆盖了目标对象的 0。
6. Object.is()
Object.is(value1, value2)用来比较两个值是否严格相等,与(===)基本类似。
Object.is("q","q"); // true
Object.is(1,1); // true
Object.is([1],[1]); // false
Object.is({q:1},{q:1}); // false
与( === )的区别
//一是+0不等于-0
Object.is(+0,-0); //false
+0 === -0 //true
//二是NaN等于本身
Object.is(NaN,NaN); //true
NaN === NaN //false