JS常见面试题
一.数组创建方式:
使用字面量的方式 var arr=[] ; (最常用)
使用数组构造函数 var arr=new Array();
使用数组表达式 var arr=Array();
二.如何确认变量类型是数组
1.Array.isArray直接判断
2.(利用class)Object. prototype.toString.call(obj)===[ object Array]
class:每个对象的内部属性,记录创建对象时使用的类型名,一旦创建,无法修改。
问题:数组类型等内置类型,重写了toString方法,直接调用数组对象的方法,不再返回class
三.数组的深浅拷贝
- 浅拷贝(数组): (会改变原数组)
就是数组A重新赋值给数组B,数组B里的属性值被改变,则数组A里的值也会跟着发生改变。 - 深拷贝(数组): (不会改变原数组)
(1)使用slice() 和 concat()方法来实现深拷贝
(2)利用循环实现
// arrayObj.slice(start, [end])
//该方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。不会改变原数组
var arr1 = [1, 2, 3];
var arr2 = arr1.slice(0);
arr1[0] = 4;
console.log(arr1); //4, 2, 3
console.log(arr2); //1, 2, 3
arrayObj.concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
var arr1 = [1, 2, 3];
var arr2 = arr1.concat();
arr1[0] = 4;
console.log(arr1); //4, 2, 3
console.log(arr2); //1, 2, 3
循环实现深拷贝
var arr1 = [1, 2, 3];
var arr2 = [];
for (var i = 0; i < arr1.length; i++) {
arr2.push(arr1[i]);
}
arr1[0] = 4;
console.log(arr1); //4, 2, 3
console.log(arr2); //1, 2, 3
四.数组去重
- 遍历数组使用indexOf去重
新数组中若该项的下标为-1,则表示新数组中没有找到,就可以将该项放入新数组中。
arr.forEach(item=>{
if(arr2.indexOf(item) == '-1'){
arr2.push(item);
}
})
- sort排序后遍历过滤数组
先给数组排序,这样相同的项总是相邻。然后遍历数组和前一个对比,不相等就放入新数组中。
var arr2 = [arr[0]];
arr.forEach((item,index)=>{
if(item != arr2[arr2.length-1]){
arr2.push(item)
}
})
- set实现
使用扩展运算符[…]和Set结构相结合,可以去掉数组中重复的元素。
var arr2 = new Set(arr);
var newArr = [...arr2];
console.log(newArr);
五. for-in,for-of,forEach()
1.for-in 输出的是键,可以用来遍历json
for-in用来循环对象中的属性,但是通过for-in循环输出的属性名的顺序是不可测的。具体来说,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
2.for-of输出值:
for-of三种方法
key()是对键名的遍历;
value()是对键值的遍历;
entries()是对键值对的遍历;
3.forEach()循环:forEach中传入要执行的回调函数,函数有三个参数。第一个参数为数组元素(必选),第二个参数为数组元素索引值(可选),第三个参数为数组本身(可选)
<script>
const arr = ["a", "v", "y", "s"]
for (let item in arr) {
console.log(item) // 键0,1,2,3
}
for (let item of arr) {
console.log(item) //a,v,y,s
}
</script>
六.数组常用方法
- 添加
- push(元素):从尾部添加 push方法返回的数组的长度
- unshift(元素):从头部添加
- 删除
- pop():从尾部弹出
- shift():从头部弹出
- splice
- splice(起点,长度):删除
- shift(起点,长度,添加元素):插入
- shift(起点,长度,替换元素):替换
- concat(数组) : 连接数组
- join(‘分隔符’) : 生成字符串(字符串split)
- sort() :排序
- sort():只认字符串
- sort(function(){}):可对数字排序
<script>
var arr = [99,67,8,11,112];
// alert(arr.sort());
//输出 11,112,67,8,99
alert(arr.sort(function(n1,n2){
return n1-n2;
}))
//8,11,67,99,112
</script>
七.arguments 可变参
- arguments不是数组
虽然可以使用下标访问相应的参数,但是并非正真的数组。它不能使用数组的.join()、.concat() 、.pop()等数组的方法。 - 将伪数组转为真正的数组的方法 Array.prototype.slice.call(arguments)