容易遗忘的JS知识点整理—hasOwnProperty相关
2024-08-27 10:01:32
为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 Object.prototype 的 hasOwnProperty方法。
hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。
// 修改Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined}; foo.bar; //
'bar' in foo; // true foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
注意: 通过判断一个属性是否 undefined 是不够的。 因为一个属性可能确实存在,只不过它的值被设置为 undefined。
hasOwnProperty 作为属性
JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部的 hasOwnProperty 函数来获取正确的结果。
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
}; foo.hasOwnProperty('bar'); // 总是返回 false // 使用其它对象的 hasOwnProperty,并将其上下文设置为foo
({}).hasOwnProperty.call(foo, 'bar'); // true
当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。 同时在使用 for in loop遍历对象时,推荐总是使用 hasOwnProperty 方法, 这将会避免原型对象扩展带来的干扰。
for in 循环
和 in 操作符一样,for in 循环同样在查找对象属性时遍历原型链上的所有属性。
注意: 由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能。
由于不可能改变 for in 自身的行为,因此有必要过滤出那些不希望出现在循环体中的属性, 这可以通过 Object.prototype 原型上的 hasOwnProperty 函数来完成。
// foo 变量是上例中的
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
推荐总是使用 hasOwnProperty。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。
最新文章
- css3 perspective perspective-origin属性的理解
- 2012-2013 ACM-ICPC Northeastern European Regional Contest (NEERC 12)
- iOS 在xib或storyboard里为控件添加圆角、外框和外框颜色
- igraph安装(R/Python)
- Bzoj2705 Longge的问题
- JAVA Metrics 度量工具使用介绍
- 基于TCP协议的网络编程
- mysql 排序后获得某行的位置
- canvas粒子时钟
- Akka(12): 分布式运算:Cluster-Singleton-让运算在集群节点中自动转移
- 第一节: dingo/API 最新版 V2.0 之安装讲解(连载)
- OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书
- 使用 VSTS 进行 CI 的过程中,无法识别 .NET Core 2.x 的情况处理
- laravel项目安装
- [vue]data数据属性及ref获取dom
- VMware设置inter共享连接出现空值
- 多线程的实现及常用方法_DAY23
- IDEA项目搭建四——使用Mybatis实现Dao层
- Error:Failed to resolve: android.arch.core:common:1.1.0
- 常用模块:hashlib,subprocess,configparser。