《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 安装并启动 ...
随机推荐
- SQL server Cannot find one or more
最近刚安装完sqlserver,新鲜感还没过,却出现了一大堆错误,令人头疼,其中有一个错误:在启动Microsoft SQL Server Management Studio时,出现如下错误提示,程序 ...
- gridcontrol如何根据值来动态设置某一行的颜色
应用场景:当我们使用devexpress gridcontrol wpf控件时.可要会要根据这一行要显示的值来设置相应的颜色 可以通过下面方法来实现 一.先定义一个style <local:Co ...
- hadoop bug 笔记
1.sqoop从mysql导入数据到hdfs的时候,总是在本地运行,而没有运行在集群上 sqoop 配置文件的问题 在 /usr/lib/sqoop/conf 目录下新增文件 sqoop-env.s ...
- angular-file-upload+springMVC的使用
最近项目中需要用到文件上传,使用了angular-file-upload插件完成 首先来介绍下这个插件的一些属性(参考官方文档) FileUploader 属性 url {String}: 上传文件的 ...
- Unity3DGUI:鼠标click
Input函数监测鼠标操作 鼠标点击事件 鼠标双击事件
- 基于React Native的58 APP开发实践
React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...
- python绝技 — 用Scapy测试无线网卡的嗅探功能
代码 #!/usr/bin/python #--*--coding=utf-8--*-- from scapy.all import * def pktPrint(pkt): if pkt.hasla ...
- Zeppelin使用Spark的yarn-client模式
Zeppelin版本0.6.2 1. Export SPARK_HOME In conf/zeppelin-env.sh, export SPARK_HOME environment variable ...
- Java源程序结构
完整的java源程序应该包括下列部分: 1.package语句 l java编译器为每个类生成一个字节码文件,且文件名与类名相同,这就会带来一个问题:同名的类会发生冲突. l 所以package的两个 ...
- QDataStream对QVector的序列化
最近发现QDataStream这个好东东,序列化发送数据很方便,与大家分享一下. 客户端: line.h #ifndef LINE_H #define LINE_H #include <QStr ...