创建数组
Array.from(arrayLike,mapFn?,thisArg?)
从一个类似数组或可迭代对象创建一个新的,浅拷贝(已不是引用,但深层对象依然是引用)的数组实例。
- arrayLike 数组、类数组对象(必须有length)、可迭代对象(Set、Map等)
- mapFn 新数组生成前会先经过该map方法
- thisArg mapFn中this的指向
var newArr = Array.from([1, 2, 3], (x,i) => x + i));// [1, 3, 5]
var newArr2 = Array.from({length:3});// [undefined, undefined, undefined]
遍历数组
for 循环
for ( init; condition; increment ){
statement(s);
}
init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
接下来,会判断 condition。如果为 true,则执行循环主体。如果为 false,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句以更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
条件再次被判断。如果为 true,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为 false 时,for 循环终止。
以下方法均不改变原数组。
如new Array(10);
或arr.length=10;
这样的方式创建的数组项本质为empty
,用以下方法(包括for in
)遍历时不会遍历empty
。
-
map
每一项返回一个值,返回一个新数组
arr = arr.map((item,i) => {
return item+i
},thisValue)
-
forEach
类似for循环
arr.forEach((item,i)=>{
console.log(item)
},thisValue)
item
本质上是var item = arr[i]
,因此直接对其重新赋值并不能修改arr[i]
。
thisValue
可选。传递给函数的this
值,默认为undefined。
-
find
查找,返回第一个符合条件的值,然后结束循环
var arr = arr.find((item,i)=>{
return item==3
},thisValue)
-
filter
过滤,将符合条件的项组成新数组
var arr = arr.filter(item=>{
return item>3
},thisValue)
-
some
只要有一个值符合条件即返回true
arr.some(item=>{
return item>3
},thisValue)
-
every
所有值都符合条件才返回true
arr.every(item=>{
return item>3
},thisValue)
-
reduce
遍历后计算一个最终值
var res = arr.reduce((total, currentValue, currentIndex?, arr?)=>{
return total+currentValue
}, initialValue?)
每次迭代的结果会作为下一次迭代的total值
initialValue为初次迭代时的total值
无initialValue时则用数组的第一项,此时数组从第二项开始迭代
-
Object.keys
返回一个所有元素为字符串的数组,其元素来自于目标object上可枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
// getFoo is a property which isn't enumerable
var myObj = Object.create({}, {
getFoo: {
value: function () { return this.foo; }
}
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']
注意:Object.keys()
和for in
具有相同的排列顺序
- 如果属性名的类型是Number,那么Object.keys返回值是按照key从小到大排序
- 如果属性名的类型是String或Symbol,那么Object.keys返回值是按照属性被创建的时间升序排序,且一定排在Number之后
var obj = {
a:1,
'2':1,
'1':1,
d:1,
c:1,
'3':1
}
obj.b=66;
Object.keys(obj) //["1", "2", "3", "a", "d", "c", "b"]
- Object.keys()背后逻辑