MDN的解释是:
这个方法可以用来检测一个对象是否含有特定的自身属性
语法:obj.hasOwnProperty(prop)
参数:要检测的属性 字符串 名称 或者 Symbol
返回值: 用来判断某个对象是否含有指定属性的 Boolean
代码示例:
function ObjWithProto(){
this.foo = 'foo_val'
}
ObjWithProto.prototype.bar = 'bar_val';
var dict = new ObjWithProto();
dict.foobar = 'foobar_val';
console.log(dict.hasOwnProperty('foo')); // true
console.log(dict.hasOwnProperty('foobar')); // true
console.log(dict.hasOwnProperty('bar')); // false
上面代码可以看出 hasOwnProperty
方法检测自身和构造函数中的属性和方法
再来看for ... in, 遍历一个对象的可枚举属性
for(let i in dict){
console.log(i)
}
// foo
// foobar
// bar 原型链上的bar也获取到了
为了遍历一个对象的所有属性时忽略掉继承属性,使用hasOwnProperty()来过滤该对象上的继承属性。
for(let i in dict){
if(dict.hasOwnProperty(i)){
console.log(i);
}
}
// foo
// foobar
再来看看原型链上的一个继承
function ObjWithProto(){
this.foo = 'foo_val'
}
ObjWithProto.prototype.bar = 'bar_val'
function Person(){
this.name = 'Person_name'
}
Person.prototype = new ObjWithProto();
var _child = new Person();
for(let i in _child){
// console.log(i);
}
// name
// foo
// bar
for(let i in _child){
if(_child.hasOwnProperty(i)){
console.log(i);
}
}
// name
console.log(_child.hasOwnProperty('name')); // true
console.log(_child.hasOwnProperty('foo')); // false
console.log(_child.hasOwnProperty('bar')); // false
用for ... in循环会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty方法过滤掉。
延伸
一, 先说for in
- for in用于遍历对象的属性,包括原型链上的可枚举属性
- 遍历数组, 注意遍历结果是数组的索引都为字符串类型
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
for(let i in arr){
console.log(i+':'+arr[i]);
}
// string 0:1
// string 1:2
// string 2:3
// string name:xiaopao
Object.keys()
- 遍历结果为对象自身可枚举属性组成的数组
- 不能遍历出原型链上的属性
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
console.log(Object.keys(arr)); // ["0", "1", "2"]
三, for of
- 支持遍历数组,类对象(DOM NodeList对象),字符串
- 不支持遍历普通对象,也不能遍历出原型链上的属性
- 遍历的结果为数组元素的值
let arr = [1,2,3]
Array.prototype.name = 'xiaopao'
for(let i of arr){
console.log(i);
}
// 1
// 2
// 3
let obj = {
name: 'xiaopao',
age: 19
}
for(let key of obj){
console.log(key);
}
// obj is not iterable 不支持遍历普通对象
image.png
数组实例的entries()方法返回一个数组的迭代对着,该对象包含数组的键值对(key/value)
for of 搭配实例方法entries() ,同时输出数组内容和索引
let arr = ['a', 'b', 'c'];
for(let [index,val] of arr.entries()){
console.log(index+':'+val);
}
// 0:a
// 1:b
// 2:c
面试题
判断自身属性与继承属性
(检测一个属性是存在于实例中,还是存在于原型中。这个方法只在给定属性存在于对象实例中时,才会返回true)obj.hasOwnProperty(prop) 返回一个布尔值
网友评论