最近公司让我面试了一个前端时,我问了“遍历对象的方法”,结果她给了我一个曾经没有用过的方法,果然面试也是一种学习,故在此记录总结。
一. 遍历对象的方法
1.使用for ... in语句
for..in语句是一种迭代语句,可以用来枚举对象的属性,也可以用来循环数组。但这里是有个坑的,会把原型上的方法名也遍历出来
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
for (var key in myObject) {
console.log(key); // a b c method
}
2. 使用Object.keys遍历对象
今天学到的是这种方法,先通过Object.keys找到对象中所有key值的一个数组,再forEach取得其value。
var obj = {
name: 'Seeme',
age: 27,
job: 'Software Engineer'
};
Object.keys(obj).forEach(function(key){
console.log(key,obj[key]);
});
3.使用for...of语句
for...of语句可遍历循环Array,Map,Set,String,TypedArray,arguments等等。
二. 判断对象的方法
我们知道,判断基本数据类型时,typeof操作符可以准确的判断一个值是字符串、数值、布尔值、还是undefined,如果变量的值是一个对象或null,则typeof操作符都返回"object"。但在检测引用类型的值时,这个操作符的用处不大。这时可以有以下几种方法:
1.instanceof
const obj = {
age: 27,
name: 'Seeme'
};
const arr = [1, 2, 3];
const reg = /\[bc\]at/;
console.log(obj instanceof Object); // true
console.log(obj instanceof Array); // false
console.log(arr instanceof Object); // true
console.log(arr instanceof Array); // true
console.log(reg instanceof RegExp); // true
console.log(reg instanceof Object); // true
通过返回的instanceof返回的布尔值,我们可以判断出是否为Object、Array、RegExp、Boolean ,但由于Array和RegExp都属于引用类型,所以判断是否为Object时也为true。
2.constructor
var obj = {
name:'Nickolas'
};
var arr = [1, 2, 3];
console.log(obj.constructor == Object);//true
console.log(arr.constructor == Array);//true
但constructor会有一个问题,如果没有原型对象时,判断会出问题。如下面的例子
function Person() {};
Person.prototype = {
name: 'Seeme',
age: 27,
job: 'Software Engineer'
}
function PersonName() {};
var person1 = new Person();
var personName1 = new PersonName();
console.log(person1.constructor == Object) // true
console.log(person1 instanceof Object) // true
console.log(personName1.constructor == Object) // false
console.log(personName1 instanceof Object) // true
3.prototype.toString方法
这个方法是我觉得最准确的方法,可以分别把Object、Array、Function、RegExp检测出来
function fun() {}
var arr = [1, 2, 3]
var obj = {
name: 'Seeme',
age: 27
}
console.log(Object.prototype.toString.call(fun)); // "[object Function]"
console.log(Object.prototype.toString.call(arr)); // "[object Array]"
console.log(Object.prototype.toString.call(obj)); // "[object Object]"