其他分享
首页 > 其他分享> > 对象判断属性是否存在

对象判断属性是否存在

作者:互联网

Object.prototype.hobby = 'basketball'
const mySymbol =  Symbol('本对象上的可遍历symbol值')
const mySymbol2 =  Symbol('本对象上的不可遍历symbol值')
const mySymbol3 =  Symbol('Object.prototype定义的symbol值')
Object.prototype[mySymbol3] = 'i am a symbol3333'
const foo  = {
    name:'kobe',
    age:18,
    [mySymbol]:'i am a symbol',
    
}
Object.defineProperty(foo,'address',{
    configurable:true,
    enumerable:false,
    writable:true,
    value:'xxxxxxx'
})
Object.defineProperty(foo,mySymbol2,{
    configurable:true,
    enumerable:false,
    writable:true,
    value:'i am symbol2222222'
})


console.log(Object.getPrototypeOf(foo));
//  foo现在一共六个属性,
//  address属性不可枚举,hobby属性在原型上;mysymbol是可遍历的symbol值,mysymbol是不可遍历的symbol值;
console.log(foo.hasOwnProperty('name'));  // true
console.log(foo.hasOwnProperty('address'));  //true
console.log(foo.hasOwnProperty(mySymbol));  //true
console.log(foo.hasOwnProperty('hobby'));  //false
//担心hasOwnProperty被重写,可以用这个方法;console.log(Object.prototype.hasOwnProperty.call(foo,'name'))  //true



for (const key in foo) {
    console.log(key);  //name age hobby
}
console.log(Object.getOwnPropertyNames(foo));  //[ 'name', 'age', 'address' ]
console.log(Object.getOwnPropertySymbols(foo));  //[ Symbol(mySymbol), Symbol(mySymbol22222) ]
console.log(Object.getOwnPropertyDescriptors(foo)); 
                                                      
                                                        //     name: {
                                                        //       enumerable: true,。。。。。。。。。
                                                        //     },
                                                        //     age: { value: 18, writable: true, enumerable: true, configurable: true },
                                                        //     address: {
                                                        //       enumerable: false,。。。。。。。。
                                                        //     },
                                                        //     [Symbol(mySymbol)]: {
                                                        //       enumerable: true,。。。。。。。。
                                                        //     },
                                                        //     [Symbol(mySymbol22222)]: {
                                                        //       enumerable: false,
                                                        //     }
                                                        //   }



//IN 刚好相反:会遍历到可枚举的东西,但是会遍历原型, SYMBOL不可以遍历

//总结:这四个都不可以遍历原型;
//Object.prototype.hasOwnProperty会遍历到不可枚举的东西,但是不会遍历原型, SYMBOL可以遍历  这个方法和getOwnPropertyDescriptors很像,只不过这个只是单纯的判断是否存在,只是单纯的反回boolean;
// Object.getOwnPropertyNames  可以遍历不可枚举的东西,但是不会遍历原型,不能symbol
// Object.getOwnPropertySymbols  可以遍历不可枚举的symbol;不遍历原型;之遍历symbol;
// Object.getOwnPropertyDescriptors   会遍历到不可枚举的东西,不会遍历原型, 遍历symbol     这个方法就是上面两个的合体;

 

标签:遍历,log,对象,symbol,Object,判断,foo,true,属性
来源: https://www.cnblogs.com/EricShen/p/16365649.html