《JS权威指南学习总结--6.5枚举属性》
内容要点:
一.for/in循环
1.for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名称赋值给循环变量。对象继承的内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的(除非用到下文中提到的一个方法将它们转化为不可枚举的)。例如:
var o = {x:1, y:2,z:3} //三个可枚举的属性
o.propertyIsEnumberable("toString"); // =>false,不可枚举
for(p in o) //遍历属性
console.log(p); //输出x,y和z,不会输出toString
2.在ES 5之前,一些新添加的方法是不能定义为不可枚举的,因此它们都可以在for/in循环中枚举出来。为了避免这种情况,需要过滤for/in循环返回的属性,下面这两种方式是最常见的:
for( p in o){
if(!o.hasOwnproperty(p)) continue; //跳过继承的属性
}
for(p in o){
if(typeof o[p]==="function") continue; //跳过方法
}
二.一些有用的工具函数来操控对象的属性,这些函数用到了for/in循环。
用来枚举属性的对象工具函数:
/*把p中的可枚举属性复制到o中,并返回o。 如果o和p中含有同名属性,则覆盖o中的属性。 这个函数并不处理getter和setter以及复制属性*/
function extend(o,p){
for( prop in p ){ //遍历p中的所有属性
o[prop]=p[prop]; //将属性添加至p
}
return o;
}
/*将p中的可枚举属性复制至o中,并返回o。如果o和p中有同名的属性,o中的属性将不受影响。这个函数并不出来getter和setter以及复制属性*/
funtion merge(o,p){
for(prop in p){ //遍历p中的所有属性
if(o.hasOwnproperty[prop]) continue; //过滤掉已经在o中存在的属性
o[prop]=p[prop]; //将属性添加至o中
}
return o;
}
/*如果o中的属性在p中没有同名属性,则从o中删除这个属性,返回o*/
function restrict(o,p){
for(prop in p){ //遍历o中的所有属性
if(!(prop in p)) delete o[prop]; //如果在p中不存在,则删除之
}
return o;
}
/*如果o中的属性在p中存在同名属性,则从o中删除这个属性,返回o*/
function substract(o,p){
for(prop in p){ //遍历p中的所有属性
delete o[prop] //从o中删除(删除一个不存在的属性不会报错)
}
return o;
}
/*返回一个新对象,这个对象同时拥有o的属性和p的属性,如果o和p中有重名属性,使用p中的属性值*/
function union(o,p){ return extend( extend({},o),p ); }
/*返回一个新对象,这个对象拥有同时在o和p中出现的属性,很像求o和p的交集,但p中属性的值被忽略*/
function intersection(o,p){return restrict(extend({},o),p);}
/*返回一个数组,这个数组包含的是o中可枚举的自有属性的名字*/
function keys(o){
if(typeof o !== "object") throw TypeError(); //参数必须是对象
var result = []; //将要返回的数组
for( var prop in o){ //遍历所有的可枚举的属性
if(o.hasOwnProperty(prop)) //判断是否是自有属性
result.push(prop); //将属性名添加至数组中
}
return result; //返回这个数组
}
三.
除了for/in循环之外,ES 5定义了两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性名称组成。
ES 5中第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Object.keys()类似,只是它返回对象的所有的自有属性的名称,而不仅仅是可枚举的属性。
《JS权威指南学习总结--6.5枚举属性》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派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 安装并启动 ...
随机推荐
- hdu1045
#include<iostream> using namespace std; int count = 0, n = 0; //判断该ch[x][y]是否可以放置 bool isOk(ch ...
- magento获取ip地址
Mage::helper('coreservice')->getRequestIp()获取IP地址
- createElement、createTextNode、setAttribute使用方法
createElement() 方法可创建元素节点. 示例:var placeholder = document.createElement("img"); createTextN ...
- linux环境下搭建环境发布web项目
在公司真是学习了一下项目环境在linux下搭建和发布的过程,这是每个程序员都应该掌握的一个技能,将整理下为以后温习用,也乐于和为掌握这些技能的猿分享: 这里主要分为5部分:1.安装jdk,并配置环境变 ...
- 原图旋转/缩放 然后画布画图 ImageProcessor
//旋转 byte[] photoBytes = File.ReadAllBytes(HttpContext.Current.Server.MapPath(diyInfo.ImageUrl)); Im ...
- centos 6.5 安装mysql 5.6错误
yum list libaio yum install libaio.i686 yum list glibc* yum install glibc.i686 yum list libstdc++* y ...
- Chapter 21_5 替换
gsub函数的第三个参数不仅是一个字符串,还可以是一个函数或table. 如果是函数,gsub会在每次找到匹配时调用该函数.调用时的参数是捕获到的内容,该函数的返回值作为要替换的字符串. 如果是tab ...
- sublime文字处理技巧
1.针对多行文本去除重复行,而不改变文本原来的顺序,即不通过排序的方式移除重复行 安装ShellCommand插件,全选文本,ctrl+alt+|调出shell执行终端,输入 awk '!x[$0]+ ...
- [SQL基础教程] 2-3 逻辑运算符
[SQL基础教程] 2-3 逻辑运算符 NOT AND OR 优先级 ( )改变优先级 AND 优先级高于 OR NULL 引入三值逻辑
- [Q]复制授权了文件但仍显示“未注册”问题(安装在非默认目录或目录包含中文)
1. 注意要将解压后的文件复制到CAD批量打图精灵安装目录,而不要复制文件夹,复制是提示是否需要覆盖,要选择覆盖. 2. 若通过第1步操作仍然显示“未注册”,则可能是由于安装目录含有中文或者不是默认目 ...