JavaScript中四种不同的属性检测方式比较

1. 用in方法

var o = {x:1};
"x" in o; //true
"y" in o; //false
"toString" in o; //true,继承属性可以被检测到
"toString" in Object.prototype; //true,不可枚举的属性可以被检测到

2. hasOwnProperty()方法

var o = {x:1};
o.hasOwnProperty("x"); //true
o.hasOwnProperty("y"); //false
o.hasOwnProperty("toString"); //false,无法检测继承属性
Object.prototype.hasOwnProperty("toString"); //true,不可枚举的属性可以被检测到

3. propertyIsEnumerable()方法

var o = Object.create({y:2});
o.x = 1;
o.propertyIsEnumerable("x"); //true,x是可枚举的属性
o.propertyIsEnumerable("y"); //false,继承属性,不可枚举
Object.prototype.propertyIsEnumerable("toString"); //false,不可枚举的属性无法被检测

4. !== undefined方法

var o = {x : 1};
o.x !== undefined; //true,o中有属性x
o.toString !== undefined; //true,继承属性也可以被检测到

这种方法的一个弱点是,无法区分不存在的属性和存在但值为undefined的值,如:

var o = {x : undefined};
o.x !== undefined; //false
"x" in o; //true

注意这里用的是"!=="而不是"!=",因为"!=="可以区分undefined和null。 
但有时候不用区分"null"和"undefined",只要判断一个属性不是null或undefined即可。

//如果o含有属性x,且x的值不是undefined或null,o.x乘以2
if(o.x != null) o.x *= 2;

继承属性是不可枚举的,所以能检测继承属性的,肯定也能检测到不可枚举属性。 
×表示无法检测,√表示可以检测

检测方法 不可枚举属性? 继承属性?
in
hasOwnProperty ×
propertyIsEnumerable × ×
!==

JavaScript中四种不同的属性检测方式比较的更多相关文章

  1. [转]Javascript中几种较为流行的继承方式

    出处:http://www.jianshu.com/p/a6c005228a75 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascrip ...

  2. Python中四种运行其他程序的方式

    原文地址:http://blog.csdn.net/jerry_1126/article/details/46584179 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在 ...

  3. Python黑科技 | Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  4. 浅谈Javascript 中几种克隆(clone)方式

    clone就是把原来的东西原样复制一份,新复制的东西和以前的东西没有任何关系 一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了: var sStr = "kingw ...

  5. css样式表中四种属性选择器

    学习此连接的总结http://developer.51cto.com/art/201009/226158.htmcss样式表中四种属性选择器1> 简易属性 tag[class]{ font-we ...

  6. Javascript的四种继承方式

    在Javascript中,所有开发者定义的类都可以作为基类,但出于安全性考虑,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击. 选定基类后,就可 ...

  7. JavaScript中两种类型的全局对象/函数【转】

    Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...

  8. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  9. [转]C++中四种类型转换符的总结

    C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操 ...

随机推荐

  1. JavaBIO利用装饰器模式来组织和扩展接口

    Stream接口,它直接负责字节流的传输. Reader/Writer接口,它本身不能读直接读写数据,而是以Stream接口为内部核心,在外围装饰增强,负责字符流的读写.字符和字节的转换过程必须指定字 ...

  2. Android实战项目——家庭记账本(六)

    今天完成的主要任务如下: 1.设置页功能的布局 2.云服务器的部署 3.成功将一个本地Javaweb项目部署到阿里云 没什么特别说明的,直接上图: 首先是侧边栏功能的布局:               ...

  3. [更新ing]zzy的家里蹲网课日记

    前言 精神小(ge)伙(zi)终于记起了他的博客密码...... 寒假以来,积累了巨多的好想法想要写博客,往往都是因为各种原因半途而废--在学习生活上甚至也有各种拖延的毛病:爱欠作业不早睡,不见成绩不 ...

  4. 为spring cloud config实现刷新动态掉的坑

    正常搭建配置中心,网上教程多,这里不讨论,只记坑也是为了后来者少花时间在这里,由于是当时研究了好久才写的文章,所以只能提供问题的原因,当然会给出印证的思路,闲话不多说进入正题! 版本spring bo ...

  5. wondiws+centos 双系统

    任务:在windows下安装CentOS 1.下载CentOS镜像文件,准备一个未格式化的空间. 2.使用UltraISO将要安装的系统写入U盘. 3.用U盘启动,将系统装入一个空的分区下(未格式化) ...

  6. 怎样在GitHub上新建一个文件夹

    GitHub如何创建文件夹 创建新文件的时候名字后面加个斜杠(/)就可以了 点击新建文件,输入文件名的时候后面加上斜杠/就是创建了一个文件夹,没有斜杠就是创建了一个文 创建好后点提交 Commit n ...

  7. Centos 7 firewall的防火墙的规则

    这是官方文档: http://www.firewalld.org/documentation/man-pages/firewall-cmd.html 想使用iptables的规则,firewall也可 ...

  8. centos7&python3.6uwsgi安装

    yum install python3-devel.x86_64 pip install uwsgi

  9. html里面用Jquery移除tr元素后,滚动条会回到顶部问题处理

    问题如下图,删除一行后,滚动条会自动回到顶部,即使先把滚动条禁止也还是会回到顶部 参考这个 https://bbs.csdn.net/topics/392233437 发现确实自己的按钮事件写在了a标 ...

  10. gulp常用插件之wiredep使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 wiredep这是一款gulp插件,能够将js.css文件自动插入到html中. 更多使用文档请点击访问wiredep工具官网. Bower是一个 ...