《JS权威指南学习总结--6.4检测属性》
内容要点:
js对象可以看做属性的集合,我们经常会检测集合中成员的所属关系-----判断某个属性是否存在于某个对象中,可以通过in运算符,hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。
一.in运算符
in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true。
var o = {x:1}
"x" in o; //true,"x"是o的属性
"y" in o; //false, "y"不是o的属性
"toString" in o; //true,o继承toString 属性
二.hasOwnPproperty()方法
hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false.
var o= {x:1}
o.hasOwnProperty("x"); //true,o有一个自有属性"x"
o.hasOwnProperty("y"); //false,o中不存在属性"y"
o.hasOwnProperty("toString"); //false,toString是继承属性
三.propertyIsEnumerable()方法
propertyIsEnumerable()方法是hasOwnProperty()的增强版,只有检测到自有属性且这个属性的可枚举性为true时它才返回true.某些内置属性的是不可枚举的。通常由js代码创建的属性都是可枚举的,除非使用Es5中使用一个特殊的方法来改变属性的可枚举性。
var o = inherit({ y : 2 });
o.x=1;
o.propertyIsEnumerable("x"); //true,o有一个可枚举的自有属性
o.propertyIsEnumberable("y"); //false,y是继承来的。
Object.property.propertyIsEnumberable("toString"); //false:不可枚举
四.
除了使用in运算符之外,另一种更简单的方法是使用"!=="判断一个属性是否是undefined;
var o = {x : 1}
o.x !==undefined; //true,o中有属性x
o.y!==undefined; //false,o中没有属性y
o.toString !==undefined; //true,o继承了toString属性
五.
然而有一种场景只能使用in 运算符而不能使用上述属性访问的方式。in 可以区分不存在的属性和存在但值为undefined的属性。例如
var o = { x : undefined } //属性被显式赋值为undefined;
o.x !==undefined; //false,属性存在,但值为undefined;
o.y!==undefined; //false,属性不存在
"x" in o; //true,属性存在
"y" in o; //fasle,属性不存在
delete o.x; //删除了属性x
"x" in o; //false,属性不再存在
注意:上述代码中使用的是"!=="运算符,而不是"!="。"!=="可以区分undefined和null,有时则不必作这种区分。
//如果o中含有属性x,且x的值不是null或undefined,o.x乘以2
if(o.x!=null)o.x*=2;
//如果那个o中含有属性x,且x的值不能转换为false o.x乘以2
//如果x是undefined、null、false、" "、0或NaN,则它保存不变
if(o.x) o.x*=2;
《JS权威指南学习总结--6.4检测属性》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- BAE部署Django项目流程整理
1.首先在BAE上创建一个应用名称并付费2.把应用文件夹git到本地,此时文件夹会多出三个文件app.conf,favicon.ico,index.py3.在应用文件夹内创建本地项目:myblog,并 ...
- js Checkbox 传递多个值给后台
------前台JS "<input class=\'jTabCheck2\' type=\'checkbox\' partvguid=" + obj + " pr ...
- python爆破zip脚本
最近在提高自己编程能力,拿一些实用的小工具练下.该脚本为python语言,主要涉及模块zipfile,threadings模块. 功能:暴力猜解zip解压密码 #coding: utf-8 impor ...
- case a.ass_term_unit when '01' then (case a.ass_profit_mode when '0' then round(sum(a.ass_amount*a.ass_annual_rate/365*365*a.ass_term/100) ,2) when '1' then round(sum(a.ass_amount*a.ass_annual_rate/
--01 年 02 月 03 日 select a.ass_due_date, case a.ass_term_unit when '01' then (case a.ass_profit_mode ...
- Beego学习笔记——开始
beego简介 beego是一个快速开发Go应用的http框架,他可以用来快速开发API.Web.后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado.sinatra.fl ...
- Ansible Filter
没啥好说的. 自己看吧 http://docs.ansible.com/ansible/playbooks_filters.html
- CodeForces 669C Little Artem and Matrix GNU
模拟. 把操作记录一下,倒着复原回去. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cs ...
- re模块 | Python 3.5
https://docs.python.org/3/library/re.html http://www.cnblogs.com/PythonHome/archive/2011/11/19/22554 ...
- Chapter 17_4 终结器
Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作. 可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器. Lua用"__g ...
- Chapter 17_2 备忘录函数
一项通用的编程技术:用空间换时间. 例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果. 比如,一个普通服务器,在它收到请求中包含Lua代码,会 ...