1. 直接用.或[]判断
var test = {name : 'lei'}
test.name //"lei"
test["name"] //"lei"
// 获取原型上的属性
test["toString"] //toString() { [native code] }
// 新增一个值为undefined的属性
test.un = undefined
所以,我们可以根据 Obj.x !== undefined 的返回值 来判断Obj是否有x属性。
这种方式很简单方便,局限性就是:不能用在x的属性值存在,但可能为 undefined的场景。 in运算符可以解决这个问题
2. in 运算符
var test = {name : 'lei'}
console.log("in",'un' in test, 'name' in test,'abc' in test);
//in true true false
这种方式的局限性就是无法区分自身和原型链上的属性,在只需要判断自身属性是否存在时,这种方式就不适用了。同时不是所有的浏览器都支持这个语法,存在兼容性问题
3. Reflect.has(obj,name);
Reflect.has方法对应name in obj 中的运算符
var myObject ={foo:1}
//旧写法
'foo' in myObject ;
// 新写法
Reflect.has(myObject ,'foo');
如果第一个参数不是对象Rellect.has和in运算符都会报错
4.hasOwnProperty
test.hasOwnProperty('name') //true 自身属性
test.hasOwnProperty('age') //false 不存在
test.hasOwnProperty('toString') //false 原型链上属性
可以看到,只有自身存在该属性时,才会返回true。适用于只判断自身属性的场景。