1、什么是扩展运算符
答:由三个点号(…)表示,可以将数组转化为用逗号分隔的参数序列
2、扩展运算符的用处
答:函数的rest剩余参数获取 用于深度拷贝一个数组 用于代替Math的求最大值方法: Math.max.apply(null, arr) -> Math.max(…arr) 用于代替数组的拼接concat:arr1.concat(arr2) -> […arr1, …arr2] 用于代替数组的push方法 :Array.prototype.push.apply(arr1, arr2) -> arr1.push(…arr2) 打散字符串:let arr = […‘hello’] 替代函数的apply方法,进行数组入参的打散 func.apply(null, arr) -> func(…[arr]) 可以将部署了 iterator接口的类数组转为数组:let div = document.querySelectorAll(‘div’); let arr = […div]
3、对于没有部署iterator接口的类数组怎么转为数组
答:使用 Array.from()方法 let likeArr = { ‘0’: ‘aaa’, ‘1’: ‘bbb’, length: 2 } let arr = Array.form(likeArr) 注意不能使用扩展运算符进行转换为数组,会报错
4、apply方法有什么特别的功效吗
答:有打散数组为参数序列的效果,例如 Math.max.apply(null, [1, 2, 3, 4]) === Math.max(1, 2, 3, 4) === Math.max(…[1, 2, 3, 4]) Array.prototype.push.apply([1, 2], [3, 4]) === [1, 2].push(…[3, 4]) new (Date.bind.apply(Date, [null, 2015, 11, 10])) === new Date(…[2015, 11, 10])
5、Array.from()的作用
答:将类数组和据有iterator接口的对象(Set Map)转为数组
6、ES5怎么将类数组转为数组
答:使用数组的slice进行转化 let likeArr = { ‘0’: ‘aaa’, ‘1’: ‘bbb’, length: 2 } let arr = [].slice.apply(likeArr)
7、在转换为数组方面,Array.from()比扩展运算符有什么优势吗?
答:Array.from()可以将任何具有length的类数组进行转换,扩展运算符则不行
8、Array.from(a, b)方法
答:参数a是要转换为数组的目标,参数b类似于map方法,用来对数组的每个元素进行处理 Array.form([1, 2, 3], x => x*2) // [2, 4, 6]
9、Array.of()方法
答:将一组值序列转为数组 ,例: Array.of(1,2,3,‘4’, true, {})
10、Array.of()和new Array()、Array()的区别
答:Array.of()不管参数有多少个,都能转换成数组 new Array()如果参数少于2个,则会返回空数组或者值为undefined的数组 Array.of() // [] --------------------new Array() // []-------------Array() // [] Array.of(2) // [2] ------------------new Array(2) // [undefined, undefined]-------------Array(2) // [undefined, undefined] Array.of(2,3) // [2,3] ---------------new Array(2,3) // [2, 3]-------------Array(2,3) // [2, 3]
11、Array.of()方法用ES5怎么实现
答:function ArrayOf(){ return [].slice.call(arguments) }
12、arr.copyWithin(target, start, end)
答:将数组指定位置的值复制到其他位置(含头不含尾) target是开始替换数据的位置 start是开始读取数据的位置,默认是0,如果是负数,就从数组的倒数位置开始 end是结束读取数据的位置,默认为数组的length,如果是负数,就从数组的倒数位置开始 // 从 2开始的位置 到 4结束的位置(5,6)复制到从 0开始的位置,结果覆盖了 3和4 [3, 4, 5, 6, 7].copyWithin(0, 2, 4) // [5, 6, 5, 6, 7]
13、arr.find()方法
答:寻找数组中第一个符合条件的值,如果没有找到就返回 undefined。注意,可以查找到NaN [1,2,3,4,5].find((value, index, arr) => { console.log(value) console.log(index) console.log(arr) return value > 3 }) // 4
14、arr.findIndex()方法
答:寻找数组中符合条件的第一个数值的下标index, 如果没有找到返回-1。注意,可以查找到NaN [1,2,3,4,5].findIndex((value, index, arr) => { console.log(value) console.log(index) console.log(arr) return value > 3 }) // 3
15、数组的indexOf和findIndex 、find方法相比,有什么缺陷
答:一是不够语义化;二是内部使用严格相等(===)判断,导致无法查找到 NaN [1,2,NaN].indexOf(NaN) // -1 [1,2,NaN].find(val => Object.is(NaN, val)) // NaN [1,2,NaN].findIndex(val => Object.is(NaN, val)) // 2
16、arr.fill(val, startIndex, endIndex)方法
答:用来填充数组的(含头不含尾规则) val参数:填充值,默认undefined startIndex: 开始填充位置,默认 0 endIndex:结束填充位置 [1,2,3].fill(4) // [4,4,4] new Array(1).fill(2)// [2] [0,1,2,3,4].fill(2,1,3) // [0, 2, 2, 3, 4]
17、for…of与arr.keys() arr.values() arr.entries()遍历数组
答:for(let key of [1,2].keys()){} // 遍历数组 键名 for(let key of [1,2].values()){} // 遍历数组键值 for(let [key,value] of [1,2].entries()){} // 遍历数组键和值 注意:可以使用next方法代替 for…of let entries = [1,2,3].entries() entries.next().value // [0, 1] entries.next().value // [1, 2] entries.next().value // [2, 3]
18、arr.includes(value, startIndex)
答:从数组的指定位置开始查找一个数值是否存在, 如果startIndex为负数就从后往前开始查找, 如果startIndex超过数组长度就从0开始查找
19、什么是数组的空位
答:就是数组内的某个位置完全没有任何值,包括undefined。例如: [, , , ]
20、怎么判断一个数组里是否有空位
答:使用 val in arr的方法。例如: 0 in [undefined, undefined] // true 0 in [,] // false
21、ES5对数组空位的处理
答:大部分情况会忽略空位 forEach() filter() every() some() 会跳过空位 map()会跳过空位,但会保留这个值 join() toString()会把空位看成 undefined,而undefined和null会被处理成空字符串 扩展:由于ES5、ES6及数组的各个方法对空位的处理不一样,建议代码中避免空位的出现
22、ES6对空位的处理
答:将空位转为undefined Array.form()、扩展运算符、keys() values() entries()会将空位转为undefined copyWithin()会连空位一起复制 fill()会将空位当作正常的数组位置 for…of会遍历空位 扩展:由于ES5、ES6及数组的各个方法对空位的处理不一样,建议代码中避免空位的出现
23、flat(number)方法
答:将多层数组进行拉平,会自动跳过空位。 number默认为1,可以设置拉平的层级数,如果设置为 Infinity 可以直接转为一维数组 [1, [2, 3, [4, 5]]].flat() // [1, 2, 3, [4, 5]] [1, [2, 3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5] [1, [2, 3, [4, 5]]].flat(Infinity) // [1, 2, 3, 4, 5]
24、flatMap(value, index,arr)方法
答:只能展开一层数组,并可以对其中的数组成员做处理 [1, 2, 3, 4].flatMap(x => x * 2) // [2, 3, 6, 8]
25、数组的at()方法
答:查找指定位置的成员值,可以出现负数,如果超出范围返回undefined。 arr[index]只能是正数,如果是负数,要写成 arr[arr.length - number]的形式 let arr = [0,1,2,3] arr.at(2) // 2 arr.at(-1) // 3 arr.at(-5) // undefined
26、什么是排序稳定性
答:是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变
|