obj.hasOwnProperty(prop))

MDN的解释是:

这个方法可以用来检测一个对象是否含有特定的自身属性
语法:obj.hasOwnProperty(prop)
参数:要检测的属性 字符串 名称 或者 Symbol
返回值: 用来判断某个对象是否含有指定属性的 Boolean

代码示例:

function ObjWithProto(){
    this.foo = 'foo_val'
}

ObjWithProto.prototype.bar = 'bar_val';

var dict = new ObjWithProto();
dict.foobar = 'foobar_val';

console.log(dict.hasOwnProperty('foo')); // true
console.log(dict.hasOwnProperty('foobar')); // true
console.log(dict.hasOwnProperty('bar')); // false 

上面代码可以看出 hasOwnProperty方法检测自身和构造函数中的属性和方法

再来看for ... in, 遍历一个对象的可枚举属性

for(let i in dict){
    console.log(i)
}
// foo
// foobar 
// bar  原型链上的bar也获取到了

为了遍历一个对象的所有属性时忽略掉继承属性,使用hasOwnProperty()来过滤该对象上的继承属性。

for(let i in dict){
    if(dict.hasOwnProperty(i)){
        console.log(i);
    }
}
// foo
// foobar

再来看看原型链上的一个继承

function ObjWithProto(){
    this.foo = 'foo_val'
}
ObjWithProto.prototype.bar = 'bar_val'

function Person(){
    this.name = 'Person_name'
}
Person.prototype = new ObjWithProto();

var _child = new Person();
for(let i in _child){
    // console.log(i);
}
// name 
// foo
// bar

for(let i in _child){
    if(_child.hasOwnProperty(i)){
        console.log(i);
    }
}
// name
console.log(_child.hasOwnProperty('name')); // true
console.log(_child.hasOwnProperty('foo')); // false
console.log(_child.hasOwnProperty('bar')); // false

用for ... in循环会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty方法过滤掉。

延伸

一, 先说for in
  1. for in用于遍历对象的属性,包括原型链上的可枚举属性
  2. 遍历数组, 注意遍历结果是数组的索引都为字符串类型
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
for(let i in arr){
    console.log(i+':'+arr[i]);
}
// string 0:1
// string 1:2
// string 2:3
// string name:xiaopao
Object.keys()
  1. 遍历结果为对象自身可枚举属性组成的数组
  2. 不能遍历出原型链上的属性
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
console.log(Object.keys(arr)); // ["0", "1", "2"]
三, for of
  1. 支持遍历数组,类对象(DOM NodeList对象),字符串
  2. 不支持遍历普通对象,也不能遍历出原型链上的属性
  3. 遍历的结果为数组元素的值
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
for(let i of arr){
    console.log(i);
}
// 1
// 2
// 3
let obj = {
    name: 'xiaopao',
    age: 19
}
for(let key of obj){
    console.log(key);
}
// obj is not iterable  不支持遍历普通对象
image.png

数组实例的entries()方法返回一个数组的迭代对着,该对象包含数组的键值对(key/value)

for of 搭配实例方法entries() ,同时输出数组内容和索引

        let arr = ['a', 'b', 'c'];
        for(let [index,val] of arr.entries()){
            console.log(index+':'+val);
        }
        // 0:a
        // 1:b
        // 2:c

面试题
判断自身属性与继承属性
(检测一个属性是存在于实例中,还是存在于原型中。这个方法只在给定属性存在于对象实例中时,才会返回true)obj.hasOwnProperty(prop) 返回一个布尔值

你可能感兴趣的:(obj.hasOwnProperty(prop)))