下面是针对这个主题的详细讲解:
下面是针对这个主题的详细讲解:
JavaScript中in和hasOwnProperty区别详解
what is in
in 关键字可以用于判断一个对象是否具有某个属性,或者一个数组中是否包含某个元素。其用法如下:
propertyNameOrIndex in objectOrArray
这里propertyNameOrIndex代表要查找的属性名或者数组中的索引位置,objectOrArray代表要查找的对象或者数组。
判断对象是否具有某个属性:
const obj = { name: 'Tom', age: 18 };
console.log('name' in obj); // true
console.log('email' in obj); // false
判断数组中是否包含某个元素:
const arr = [1, 2, 3];
console.log(0 in arr); // true
console.log(4 in arr); // false
what is hasOwnProperty
hasOwnProperty 方法是 JavaScript 中的一个实例方法,它返回一个布尔值,表示一个对象是否具有指定的属性。其用法如下:
obj.hasOwnProperty(propertyName)
这里obj代表要判断的对象,propertyName代表要查找的属性名。
判断对象是否具有某个属性:
const obj = { name: 'Tom', age: 18 };
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('email')); // false
需要注意的是,hasOwnProperty 只能检测对象本身的属性,无法检测从原型继承的属性。
差异
它们的区别在于hasOwnProperty 可以检测对象本身的属性,无法检测从原型继承的属性,而 in 关键字可以检测对象本身的属性和从原型继承的属性。
function Person(name) {
this.name = name;
this.sayName = function() {
console.log(this.name);
};
}
Person.prototype.sayAge = function() {
console.log(this.age);
};
const tom = new Person('Tom');
tom.age = 18;
console.log(tom.hasOwnProperty('name')); // true
console.log(tom.hasOwnProperty('age')); // true
console.log('name' in tom); // true
console.log('age' in tom); // true
console.log(tom.hasOwnProperty('sayAge')); // false
console.log('sayAge' in tom); // true
由上例可以看到,tom 既有自己的属性,也从原型继承了方法,但是 hasOwnProperty 只能检测到 tom 自己的属性,无法检测到从原型继承的方法,而 in 关键字既能检测到自身的属性,也能检测到从原型继承的方法。
总结
- in 主要用于检测对象本身以及从原型继承的属性和元素。
- hasOwnProperty 只检测对象本身的属性和元素,无法检测从原型继承的属性和元素。
希望这篇文章能够帮助你清晰地理解 JavaScript 中的 in 和 hasOwnProperty。
本文标题为:JavaScript中in和hasOwnProperty区别详解
- 简单实现ajax三级联动效果 2023-02-14
- 原生JS实现非常好看的计数器 2023-08-08
- vue 快速入门 系列 —— 侦测数据的变化 - [基本实现] 2023-10-08
- JavaScript Image对象实现原理实例解析 2023-08-08
- input submit、button和回车键提交数据详解 2022-11-13
- uniapp开发微信小程序自定义顶部导航栏功能实例 2022-10-21
- ajax获取用户所在地天气的方法 2023-02-14
- Windows上的HTML5地理定位比Linux更准确(Firefox,Chrome,[Chromium]) 2023-10-25
- AJax与Jsonp跨域访问问题小结 2022-10-18
- php – html选择多项选择输入,将它们存储在mysql db中并搜索匹配项 2023-10-26