美文网首页
obj.hasOwnProperty(prop))

obj.hasOwnProperty(prop))

作者: 小泡_08f5 | 来源:发表于2019-07-08 15:58 被阅读0次

    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))

          本文链接:https://www.haomeiwen.com/subject/zvgohctx.html