一、Array.of
将参数作为数组元素,生成新数组。解决了Array构造函数产生的歧义(Array接受一个数字参数时,会返回对应长度的稀松数组)。
let arr1 = new Array(3), //Array直接接受多个参数作为数组元素,但是会产生歧义。
arr2 = Array.of(3);
console.log(arr1, arr2)
二、Array.from
es5中的转化方法 : [].slice.call()
es6中,将两类对象转化为数组
a.类数组:nodeList,arguments,string
b.可遍历的对象: map和set对象,以及具有遍历器生成函数的对象。
将arguments转化为数组的用法可以通过rest参数代替,数组去重的时候将Array.from和Set构造函数配合使用。
function test(...args){
args.map((item)=>{
return ++item
})
}
let arr = [12,1,1,2,2,4];
console.log(Array.from(new Set(arr)))
(1)Array.from和拓展运算符的比较
Array.from调用了Iterator接口,只要部署了Iterator接口,Array.from都能将其转化为数组。(string,nodelist,arguments,map,weakMap,set,weakSet,typedArray)Array.from还能转化类似数组的对象(具有length属性),只要有length属性,Array.from就能转化。
拓展运算符也可以将某些数据转化为数组,也是调用了iterator接口。拓展运算符还不能转化类似数组的对象。
let arrLikeObj = {length:3};
console.log(Array.from(arrLikeObj))
console.log([...arrLikeObj]) // 报错 arrLikeObj is not iterable
(2)参数<br />1.转化原对象<br />2.类似map的方法,处理每个元素,将处理后的值放入返回的数组。
let map = (item)=> item*2;
console.log(Array.from([1,2,3], map)) // => [2, 4, 6]
function myTypeof (){
return Array.from(arguments, (item)=> typeof item)
}
三、Array.fill
给定某一个值,用来填充指定起始范围元素(左开右闭)
参数:
1.填充的值
2.填充开始位置,可正可负
3.填充结束位置,可正可负
let arr = [1,2,3];
arr.fill(6,-2,2)
console.log(arr) // => [1, 6, 3]
四、Keys(),Values(),Entries()
返回数组的一个迭代器对象,可以手动调用next方法,可以使用for … of进行遍历。
let arr = [1, 2, 3, 4, 5],
keys = arr.keys(),
values = arr.values(),
entries = arr.entries();
for (let index of keys){
console.log(index)
}
for (let val of values){
console.log(val)
}
for (let entry of entries){
console.log(entry)
}
entries.next() // 此处遍历器迭代完了,返回value为undefined,done为true的对象
五、copyWithin在数组自身内将指定范围元素覆盖其他元素
参数:
1.被覆盖的位置
2.覆盖元素开始位置,默认值为0
3.覆盖元素结束位置 ,默认值为数组length,左开右闭
let arr = [1, 2, 3, 4, 5];
arr.copyWithin(1) // => [1, 1, 2, 3, 4]
arr.copyWithin(1,2) // => [1, 3, 4, 5, 5]
console.log([].copyWithin.call({length: 5, 3: 1}, 1, 3)) // => {'1' : 1, '3' : 1}
和fill还是有区别,fill用指定值来填充范围内元素,copyWithin是用选中的元素来覆盖其他元素。
六、includes, find,findIndex
includes接收一个参数,用来判断数组是否包含改参数可以判断NaN,返回boolean。
find接收一个验证回调函数,用来找寻第一个通过验证函数的元素,如果没有符合条件的元素则返回undefined。
findIndex接收一个验证回调函数,返回第一个满足验证函数元素的索引,如果没有符合条件的元素则返回-1。
indexOf用来判断元素在数组的索引。
find和findIndex都可以遍历NaN,而indexOf不能。es6解决了NaN与NaN相等的问题。
console.log([NaN].indexOf(NaN)) // => -1
let test = (elem,index,arr)=>{
console.log(elem,index,arr)
return Object.is(NaN, elem)
// Object.is 只判断数据的值,值相等就返回true。 NaN与NaN,-0 与 +0
}
console.log([NaN].findIndex(test)) // 0
七、数值拓展
(1)给Number添加了静态方法 isNaN
es5中,全局方法isNaN会将参数转化,转化后得到NaN返回true,否则返回false
Number.isNaN不会先将参数隐式转化
console.log(Number.isNaN('abc'), isNaN('abc'))
<br />(2)Number.isFinite()<br />es5中,全局isFinite会对参数进行隐式转化,es6中将isFinite挂到了Number上,而Number.isFinite不会对参数进行隐式转化。
console.log(isFinite('123'), Number.isFinite('123')) // => true, false
(3)Number.MAX_SAFE_INTEGER 和 Number.isSafeInterger<br />js引擎目前能精确处理的最大数为 Math.pow(2, 53) - 1。
console.log(Number.MAX_SAFE_INTEGER === (Math.pow(2, 53) - 1) ) // => true
console.log(Number.MIN_SAFE_INTEGER === ( -Math.pow(2, 53) + 1) ) // => true