《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 安装并启动 ...
随机推荐
- mvc架构和mvp架构
mvc,mvp其实是复合模式,是多个设计模式的组合:将多个模式结合起来形成一个框架,已解决一般性问题. mvc: 既然mvc是复合模式,那么是由哪些设计模式组合的呢? 观察者设计模式:view和con ...
- Santa Claus and Tangerines
Santa Claus and Tangerines 题目链接:http://codeforces.com/contest/752/problem/E 二分 显然直接求答案并不是很容易,于是我们将其转 ...
- [Bzoj]1012最大数maxnumber
题目如上(线段树???),蒟蒻第二眼想法(其实这道题正解是单队的说,但蒟蒻刚学线段树,于是...就) 献上黑历史: RE是因为蒟蒻数组开太小:第一次开110000:第二次开200000:结果就………… ...
- orm2
数据库连接 var orm = require("orm"); orm.connect("mysql://username:password@host/database& ...
- 启动web项目,报内存不足错误的解决方法
Initialization of bean failed; nested exception is java.lang.OutOfMemoryError: Java heap space 原因: 在 ...
- Smail语法
1.数据类型 2.函数: Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type 注意参数与参数之间没有任何分隔符 3.函数调用: 4.关于s ...
- Java学习笔记-File
//文件操作 //2015年4月30日15:40:21 package com.alfredsun.first.main; import java.io.File; import java.io.IO ...
- 2. SpringMVC 上传文件操作
1.创建java web项目:SpringMVCUploadDownFile 2.在项目的WebRoot下的WEB-INF的lib包下添加如下jar文件 com.springsource.com.mc ...
- Java 四舍五入并小数点后保存两位,千分位分隔
import java.text.DecimalFormat; public class FileTest { public static void main(String[] args) { ...
- Unity3D脚本使用:Random
实例: 为集合变量赋值,并运行,点击按钮,运行结果如图