A few lines of code teach you to fully understand whether the attribute exists or not

// 情况一:全部存在
// const obj = {
    
    
//   a: 1
// }

// 情况二:存在 不存在 不存在 存在
// function OBJ() {}
// OBJ.prototype.a = 1;
// const obj = new OBJ();

// 情况三 不存在 不存在 存在 存在
// function OBJ() {}
// OBJ.prototype.a = 1;
// const obj = new OBJ();
// Object.defineProperty(obj, 'a', {
    
    
//   enumerable: false,
//   value: undefined,
// });

// 情况四 存在 不存在 不存在 存在
// const a = Symbol()
// function OBJ() {}
// console.log(a)//Symbol()
// OBJ.prototype.a = a;
// console.log(OBJ.prototype.a)//Symbol()
// const obj = new OBJ();

// 情况五 不存在 不存在 存在 存在
const a = Symbol()
function OBJ() {
    
    }
OBJ.prototype.a = a;
const obj = new OBJ();
Object.defineProperty(obj, 'a', {
    
    
  enumerable: false,
  value: undefined,
});

//结论:可见是不是symbol都没任何影响

//方式一最不准确,他是判断属性的值,并不是存在,假如const obj = { a:undefined },结果判断为不存在
console.log('------------------');
console.log('方式1:对比undefined');
if (obj.a !== undefined) {
    
    
  console.log('存在');
} else {
    
    
  console.log('不存在');
}
//方式二Object.keys(obj)是得到对象的自有可枚举属性,得不到原型链上的
/**枚举
Object.defineProperty(obj, 'a', {
  enumerable: false,
});
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));{ value: 1, writable: true, enumerable: false, configurable: true }
console.log(obj.a);1
console.log(Object.keys(obj));[]
 */
console.log('------------------');
console.log('方式2:使用Object.keys');
if (Object.keys(obj).includes('a')) {
    
    
  console.log('存在');
} else {
    
    
  console.log('不存在');
}
//方式三obj.hasOwnProperty('a')是得到对象的自由属性,不管是不是可枚举都可以拿到,但是拿不到原型链上的
console.log('------------------');
console.log('方式3:使用hasOwnProperty');
if (obj.hasOwnProperty('a')) {
    
    
  console.log('存在');
} else {
    
    
  console.log('不存在');
}
//方式四只要obj能访问a就算存在,能拿到原型链的,能拿到不能枚举的(常用)
console.log('------------------');
console.log('方式4:使用in');
if ('a' in obj) {
    
    
  console.log('存在');
} else {
    
    
  console.log('不存在');
}

Guess you like

Origin blog.csdn.net/qq_53461589/article/details/131054778