1.判断数组
这是笔试里经常会出现的知识考察点,总结一下
(1)Array.isArray()方法判断
var a=[]; Array.isArray(a) //返回true var b='hello world'; Array.isArray(b) //返回false
这个方法简单有效,缺点是IE8及以下版本浏览器不兼容
(2)用instanceof判断
var a=[]; console.log(a instanceof Array) //返回true
obj instanceof Object 判断 Object.prototype 是否存在在 obj 的原型链上,因此 a instanceof Object 也会返回 true
(3)根据对象的constuctor属性判断
var a=[];
console.log(a.constructor==Array); //返回true
在javascript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数
通常会将这个判断方法封装为一个判断数组的方法
function isArray(obj) { return typeof obj == 'object' && obj.constructor == Array }
(4)终极判断方法
第二第三种方法也有列外情况,比如在跨框架iframe的时候使用页面中的数组时会失败,因为在不同的框架iframe中,创建的数组是不会相互共享其prototype属性的;当第二第三种方法也不能用时,可以使用最通用的方法 Object.prototype.toString.call()
function isArray(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; }//仅判断Array
function isType(data,type) { return Object.prototype.toString.call(data) === "[object "+type+"]"; } //通用判断方法
方法中的call()可以换成apply(),不能直接用toString调用,因为从原型链的角度讲,所有对象的原型链最终都指向了 Object, 按照JS变量查找规则,其他对象应该也可以直接访问到 Object 的 toString方法,但是大部分的对象都实现了自身的 toString 方法,这样就可能会导致 Object 的 toString 被终止查找,因此要用 call或apply 来强制调用Object 的 toString 方法。
(5)typeof的一些坑
typeof 判断Array和null等特殊类型都会输出Object,typeof 返回值有六种可能: "number"、 "string"、 "boolean"、 "object" 、"function" 和 "undefined"。
2.数组的常用方法
(1)push()、pop()和unshift()、shift()
push(),在数组的尾部添加新元素,可同时放多个参数,原数组被改变,返回添加后的数组
pop()删除数组的最后一个元素,原数组被改变,返回被删除的项
unshift()添加新元素到数组头部,原数组被改变,返回添加后的数组
shift()删除数组的第一个元素,原数组被改变,返回被删除的项
var numArray=[2,45,12,-7,5.6,-3.4,50,132]; var arr=numArray.push(23,7); console.log(arr);//[2,45,12,-7,5.6,-3.4,50,132,23,7] console.log(numArray);//[2,45,12,-7,5.6,-3.4,50,132,23,7] var num=numArray.pop(); consoleog(num);//7 console.log(numArray);//[2,45,12,-7,5.6,-3.4,50,132,23] var num=numArray.shift(); console.log(num);//2 console.log(numArray);//[45,12,-7,5.6,-3.4,50,132,23] var arr=numArray.unshift(1,2); console.log(numArray);//[1,2,45,12,-7,5.6,-3.4,50,132,23]
(2)sort()排序方法
sort排序,默认按字母编码规则排序,原数组被改变,返回排序后的数组
var numArray=[2,45,12,-7,5.6,-3.4,50,132]; console.log(numArray); console.log(numArray.sort()); console.log(numArray.sort(function(a,b){return a-b;}));//按数字升序 //tip:要使回调函数中的a排在b前面,返回小于0的数 console.log(numArray);
(3)slice和splice
a.slice(),返回截取的数组,原数组不改变
1个参数a:返回数组从a索引开始的部分
2个参数a,b:返回数组从a索引开始到b(不包括b)的部分
若参数不合适导致截取部分为空,则返回空数组
b.splice(start,deleteAccount,value,...),返回截取的数组,改变原数组
1个参数:截取从start开始到末尾的数组
2个参数:截取从start开始deleteAccount位的数组
更多参数:截取后,将第三及之后的参数插入截取的位置
deleteAccount为负,返回空数组
//清空数组
//numArray.splice(0);
两个方法中表示索引的参数为负数时,识别为length+(负参数);
var a=[1,2,3]; a.slice(-2,3);//相当于a.slice(1,3)
更多数组方法 http://www.runoob.com/jsref/jsref-obj-array.html
3.相关笔试题目
(1)有一个长度未知的数组a,如果它的长度为0就把数字1添加到数组里面,否则按照先进先出的队列规则让第一个元素出队
a.length === 0 ? a.push(1) : a.shift();
(2)编写一个带参数(m,n)的函数,产生一个m个n的数组,不用循环(答案介绍了3种方法,使用时要将其他2种方法去掉)
function mnArr(m,n){ //第一种方法 var newArr=new Array(m); newArr.fill(n); return newArr; //第二种,from方法 var arr = Array.from({length:m}, (v)=> n); return arr; //第三种,递归 var arr=[]; if(arr.length<m) { arr[arr.length]=n; mnArr(m,n); } return arr; } console.log(mnArr(6,4));
(3)将数组处理成嵌套对象
示例:
[{id:1,parent:null}, {id:2,parent:1}, {id:3,parent:2}];
变成
{ id:1, parent:null, child:{ id:2, parent:1, child:{ id:3, parent:2 } } }
答案:
var arr=[{id:1,parent:null}, {id:2,parent:1}, {id:3,parent:2}, {id:4,parent:3}, {id:5,parent:4}];
function change(arr,index) { if(index===arr.length-1) { return arr[index]; } else if(index>=0) { arr[index].child=change(arr,index+1); return arr[index]; //return arr[index].child=change(arr,index+1);//child一直是最后一个 } } console.log(change(arr,0));
代码中注释掉的那一行,直接运行的话只有一个child,原因还不清楚
运用递归的方法,从数组的第一项开始遍历,如果是数组除最后一项的其他项,就将后一项作为前一项的child
(4)将字符串数组变成整数数组
var arr = ['1', '2', '3']; var r = arr.map(parseInt);//[1, NaN, NaN] var m = arr.map(x=>parseInt(x));//[1, 2, 3]