为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 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。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。

最新文章

  1. css3 perspective perspective-origin属性的理解
  2. 2012-2013 ACM-ICPC Northeastern European Regional Contest (NEERC 12)
  3. iOS 在xib或storyboard里为控件添加圆角、外框和外框颜色
  4. igraph安装(R/Python)
  5. Bzoj2705 Longge的问题
  6. JAVA Metrics 度量工具使用介绍
  7. 基于TCP协议的网络编程
  8. mysql 排序后获得某行的位置
  9. canvas粒子时钟
  10. Akka(12): 分布式运算:Cluster-Singleton-让运算在集群节点中自动转移
  11. 第一节: dingo/API 最新版 V2.0 之安装讲解(连载)
  12. OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书
  13. 使用 VSTS 进行 CI 的过程中,无法识别 .NET Core 2.x 的情况处理
  14. laravel项目安装
  15. [vue]data数据属性及ref获取dom
  16. VMware设置inter共享连接出现空值
  17. 多线程的实现及常用方法_DAY23
  18. IDEA项目搭建四——使用Mybatis实现Dao层
  19. Error:Failed to resolve: android.arch.core:common:1.1.0
  20. 常用模块:hashlib,subprocess,configparser。

热门文章

  1. 配置PL/SQL Developer连接server数据库
  2. winform最大化后不遮挡任务栏
  3. 用多年前据说买买提上理论水平最高的帖子做镇楼贴---NASA有吹牛了
  4. upf1
  5. 【2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 G】Query on a string
  6. WCF REST 基础教程
  7. 三、链路追踪系统 zipkin
  8. Html表单使用实例
  9. 中小研发团队架构实践之分布式协调器.Net版ZooKeeper
  10. php 根据给定的年份和月份获取该年份该月份的起始和结束时间