判断一个对象是否具有某个属性名的方法:
只要o.age的值不是 false、数字零(0)、空字符串、空对象、undefined 返回的就是true
in运算符的用法:是用来检测某个对象是否具有某个属性用的 返回值是: boolean
所以 判断一个对象是否具有某一个属性 最好用in运算符。
参数:prop要检测的属性的 字符串形式表示的名称,或者symbol。
返回值:用来判断某个对象是否含有指定的属性的布尔值 。
注意:只会判断自身特定的属性,会忽略掉从原型链上继承的属性。
const obj1 = {
firstName: "阿",
lastName: "清"
}
console.log(obj1.hasOwnProperty("firstName"));//true
console.log(obj1.hasOwnProperty("toString"));//false
参数: 一个字符串类型或者 symbol 类型的属性名或者数组索引(非symbol类型将会强制转为字符串)。
返回值:Boolean
const obj1 = {
firstName: "阿",
lastName: "清"
}
console.log("firstName" in obj1);//true
console.log("toString" in obj1);//true
console.log(obj1.firstName);//true
console.log(obj1.secondtName);//undefind
判断一个对象是否具有某个属性名的方法:
只要o.age的值不是 false、数字零(0)、空字符串、空对象、undefined 返回的就是true
in运算符的用法:是用来检测某个对象是否具有某个属性用的 返回值是: boolean
所以 判断一个对象是否具有某一个属性 最好用in运算符。
转载于:https://blog.51cto.com/11871779/2118099
目录
语法:
对象.hasOwnProperty('属性'); 返回值为 布尔值
let obj = { name: 'll', age: 189 };
console.log(obj.hasOwnProperty('age')); // true
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('sex')); // false
注意:
使用
对象.属性 != undefined 来判断对象是否含有某个属性。
或者
对象['属性'] != undefined 来判断对象是否含有某个属性。
通过点或者方括号可以获取对象的属性值,如果对象上不存在该属性,则会返回undefined。
不存在只的是对象和对象的原型链上都不存在,如果原型链上有该属性则返回原型链上的属性。
var obj = {
name: 'll',
age: 189,
};
console.log(obj['name']); // ll
console.log(obj.age); // 189
console.log(obj.sex); // undefined
// 可以查找原型上的属性
console.log(obj.toString); // ƒ toString() { [native code] }
obj.data = undefined;
console.log(obj.data); // undefined
注意:
对in运算符详细了解:in - JavaScript | MDN
语法:
属性 in 对象;
返回值:
布尔值
// 数组
var arr = ['blue', 'pink', 'yellow'];
console.log(0 in arr); // true
console.log(1 in arr); // true
console.log(3 in arr); // falae
// 必须使用索引号,而不是数组元素的值
console.log('pink' in arr); // false
// 数组上有 length 属性
console.log(length in arr); // true
// 也可以判断数组原型上的属性
console.log('concat' in arr); // true
// Symbol.iterator in trees // 返回true
console.log(Symbol.iterator in arr) // 返回true (数组可迭代,只在ES2015+上有效)
// 内置对象
console.log("PI" in Math); // 返回true
// 自定义对象
var mycar = { make: "Honda", model: "Accord", year: 1998 };
console.log("make" in mycar); // 返回true
console.log("model" in mycar); // 返回true
// in右操作数必须是一个对象值。例如,你可以指定使用String构造函数创建的字符串,但不能指定字符串文字。
var color1 = new String("green");
console.log("length" in color1); // 返回true
var color2 = "coral";
console.log("length" in color2) // 报错(color2不是对象)Cannot use 'in' operator to search for 'length' in coral
// 使用 delete 运算符删除了一个属性,则 in 运算符对所删除属性返回 false。
var mycar = { make: "Honda", model: "Accord", year: 1998 };
delete mycar.make;
"make" in mycar; // 返回false
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // 返回false
// 只是将一个属性的值赋值为undefined,而没有删除它,则 in 运算仍然会返回true
var mycar = { make: "Honda", model: "Accord", year: 1998 };
mycar.make = undefined;
"make" in mycar; // 返回true
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // 返回true
// 如果一个属性是从原型链上继承来的,in 运算符也会返回 true。
"toString" in {}; // 返回true
注意:
in
运算符 返回true
。 Symbol.iterator in 数组; 返回true (数组可迭代,只在ES2015+上有效).
也可以判断内置对象上的属性。
使用 delete 运算符删除了一个属性,则 in
运算符对所删除属性返回 false。
只是将一个属性的值赋值为 undefined,而没有删除它,则 in
运算仍然会返回true。
对于字符串的属性也可以判断,只是必须是字符串对象 new String() 创建的字符串。
JavaScript判断对象是否存在某个属性或者方法,常用方法有两种hasOwnProperty
和in
hasOwnProperty
是Object原型对象上的一个方法,用来判断对象自身属性中是否具有指定的属性。
这个方法可以用来检测一个对象是否含有特定的自身属性;和 in
运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
// eslint-disable-next-line no-new-object
const obj = new Object();
obj.name = 'myObject';
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // false
console.log(obj.hasOwnProperty('hasOwnProperty')); // false
console.log('name' in obj); // true
console.log('toString' in obj); // true
MDN上指出,JavaScript 并没有保护 hasOwnProperty
这个属性名,可以将任意对象的一个属性命名为hasOwnProperty
,这样一来就无法使用原型对象上的hasOwnProperty
方法了。解决办法,直接使用原型链上的hasOwnProperty
方法:
// 可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(obj, 'name'); // true
// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(obj, 'name'); // true
推荐使用第二种方式。