判断一个对象上是否存在一个属性

考虑几种情况:

1. 有可能 属性是在自身上的属性

2. 属性   可能在 原型链上 obj.__proto__

比如:

const obj = {
      name: 'zs',
      age: 12
    };

    const s = Symbol('unique')
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      age: '13',
    // 定义symbol类型的值
      [s]: 'symbol'
    });

    在原型上的属性判断...

结果:

1. in 关键字既可以判断自生是否存在属性,也可以判断__proto__ 上的属性

2. for in 循环 可以循环 自身 和 原型链上的所有属性

// 1. in 关键字判断
function hasProp (obj, key) {
	return key in obj
}

 in 关键字也可以判断 symbol 类型的属性

const obj = {
      name: 'zs',
      age: 12
    };

    const s = Symbol('unique')
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      age: '13',
      [s]: 'symbol'
    });

    console.log(s in obj);  // true

扩展:

对象循环的几种方式:

1. for in 循环  ,  遍历自身和原型上的可枚举属性

                        symbol 类型的属性遍历不出

 const obj = {
      name: 'zs',
      age: 12
    };

// 定义属性 
    Object.defineProperties(obj, {
      high: {
        value: '180',
// 是否可枚举
        enumerable: false
      },
      weight: {
        value: 140,
        enumerable: true,
      }
    })

    const s = Symbol('unique')
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      age: '13',
      [s]: 'symbol'
    });

    for(let key in obj) {
      console.log(key);
    }

输出的结果如下图所示: 

 

 2. Object.keys, Object.vlaues, Object.entries  遍历自身可枚举的属性。

                                                                          不包括 原型 和 symbol类型的属性

const s1 = Symbol('test1');
    const s2 = Symbol.for('test2');

    const obj = {
      name: 'zs',
      age: 12,
      [s1]: 'test1'
    };

    Object.defineProperties(obj, {
      high: {
        value: '180',
        enumerable: false
      },
      weight: {
        value: 140,
        enumerable: true,
      }
    })

    
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      [s2]: 'test2'
    });

    console.log(Object.keys(obj));
    console.log(Object.values(obj));
console.log(Object.entries(obj));

 Object.keys(obj) , Object.values(), Object.entries() 结果如图所示:

 

3. Object.getOwnPropertyNames(obj) 遍历自身属性,不包含symbol类型

                                                              不可枚举属性也能遍历出

 const s1 = Symbol('test1');
    const s2 = Symbol.for('test2');

    const obj = {
      name: 'zs',
      age: 12,
      [s1]: 'test1'
    };

    Object.defineProperties(obj, {
      high: {
        value: '180',
        enumerable: false
      },
      weight: {
        value: 140,
        enumerable: true,
      }
    })

    
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      [s2]: 'test2'
    });

    console.log(Object.getOwnPropertyNames(obj));

 

 

 

 4. Object.assign({}, obj)   拷贝自身可枚举的属性  包括symbol;  不包含原型上的属性

                                        注意如果属性重复,后面的属性值替换前面的属性值

const s1 = Symbol('test1');
    const s2 = Symbol.for('test2');

    const obj = {
      name: 'zs',
      age: 12,
      [s1]: 'test1'
    };

    Object.defineProperties(obj, {
      high: {
        value: '180',
        enumerable: false
      },
      weight: {
        value: 140,
        enumerable: true,
      }
    })

    
    // 定义原型上
    Object.setPrototypeOf(obj, {
      father: 'zz',
      [s2]: 'test2'
    });

    console.log(Object.assign({}, obj));

 拷贝结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值