对象:

通过引用(而非值)来操作对象:  

  1. var obj = {"x":1,"y":2};
  2. var copyObj = obj;
  3. copyObj.x = 5;
  4. console.log(obj);//{x:5,y:2}

对象最常见的用法是创建、设置、查找、删除、检测、枚举它的属性:

(一)、创建对象

(1).对象直接量创建   

  1. var empty = {};
  2. var point = {x:1, y:2};
  3. var point2 = {x:point.x,y:point.y};
  4. var book = {
  5.   "main title":"Javascript",//属性名有空格,必须用引号括起来
  6.   "sub-title":"object",//属性名有连字符,必须用引号括起来
  7.   "for":"all reader",//属性名是关键字,必须用引号括起来
  8.   author:{//属性名是一个对象,不加引号
  9.     firstname:"Dvaid",
  10.     lastname:"Benjemin"
  11.   }
    };

(2).通过new创建对象

  1. var o = new Object();//相当于{}
  2. var a = new Array();//相当于[]
  3. var d = new Date();
  4. var r = new RegExp("js");//相当于/js/

(二)、属性的查询和设置

(1).可以通过.或者[]来访问对象的属性,.右侧必须是一个属性名称,[]内的属性名必须以""括起来。 

  1. var lastname = author.lastname;
  2. var firstname = author["firstname"];

(2).通过.或[]创建新的属性,或者给属性赋值。在ECMAScript3中,.后面的标识符不能使保留字,如for、class,[]内的表达式必须是字符串或者可以转换成字符串的值。

  1. book.page = 200;//新建page属性
  2. book["type"] = "computer";//给type属性赋值

(3).继承  通过inherit函数继承来的对象,修改对象的属性不会影响到原型链原对象的属性值。

  1. function inherit(p){
  2. if(p == null) throw TypeError();
  3. if(Object.create) return Object.create(p);
  4. var t = typeof(p);
  5. if(t !== "object" || t !== "function") throw TypeError();
  6. function f(){};
  7. f.prototype = p;
  8. return new f();
  9. }
  10.  
  11. var accessor = {r:1,s:5};
  12. var o = inherit(accessor);
  13. o.x = 7;
  14. o.y = 9;
  15. o.r = 2
  16. console.log("s:"+o.s);//s:5
  17. console.log("r:"+o.r);//r:2
  18. console.log("accessor.r:"+accessor.r);//accessor.r:1

(4).属性访问错误:查询一个不存在的属性不会报错,只是返回一个undefined,如果查询一个不存在的对象的属性就会报错。

  避免出错的方法:

  1. var len = book && book.subtitle && book.subtitle.length;//获取子对象的长度

(5).删除属性:delete只能删除自有属性,不能删除继承属性。

  1. var a = {p:{x:1}};
  2. var b = a.p;
  3. delete a.p;
  4. console.log(a);//{}
  5. console.log(b);//{x:1}

因此,在销毁对象的时候要遍历对象中的属性并依次删除,避免内存泄露。

在严格模式下删除不可配置的属性会报语法错误,比如通过变量声明和函数声明穿件的全局对象的属性。在非严格模式下返回false,eg:

  1. delete Object.prototype;//不能删除不可配置属性
  2. var x = 1;
  3. delete this.x;//不能删除全局对象的属性
  4. function f(){}
  5. delete this.f;//不能删除全局函数

(6).检测属性:

in运算符:如果对象的自有属性或继承属性中包含这个属性,则返回true。

hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性,对于继承属性,它将返回false。

propertyIsEnumerable()只检测自有属性,且这个属性的可枚举性为true的时候才返回true。

  1. var o = {x:1,y:2};
  2. "x" in o;//true
  3. "z" in o;//false
  4. "toString" in o;//true
  5.  
  6. var p = {x:1};
  7. p.hasOwnProperty("x");//true
  8. p.hasOwnProperty("toString");//false

(7).枚举属性:

for/in循环遍历对象中所有可枚举的属性(包括自身的和继承的),对象继承的内置方法是不可枚举的。

过滤继承的属性,跳过方法:

  1. for(p in o) {
  2. if(!o.hasOwnProperty(p)) continue;//跳过继承的属性
  3. }
  4.  
  5. for(p in o) {
  6. if(typeof(p) === "function") continue;//跳过方法
  7. }

ECMAScript 5定义了两个枚举属性的函数:

Object.keys()方法返回一个数组,数组由对象可枚举的自有属性组成。Object.getOwnPropertyNames()返回对象所有的自有属性的名称(不仅仅是可枚举的属性)组成的数组。

javascript权威指南笔记--javascript语言核心(四)的更多相关文章

  1. javascript权威指南笔记--javascript语言核心(一)

    1.javascript的数据类型分为两类:原始类型和对象类型. 原始类型包括字符串.数字.布尔值.null.undefined. 对象是属性的集合,每个对象都由“名/值”对构成.数组和函数是特殊的对 ...

  2. javascript权威指南笔记--javascript语言核心(三)

    1.var用来声明一个或多个变量.全局变量是全局对象的属性,它无法通过delete删除. 如果var语句中的变量没有指定初始化表达式,那么这个变量的初始值为undefined. 变量声明语句会被提前到 ...

  3. javascript权威指南笔记--javascript语言核心(二)

    1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的.这意味着在变量声明之前甚至已经可用. *“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部. fu ...

  4. javascript权威指南笔记--javascript语言核心(六)

    通过ECMAScript 3创建的属性都是可写的.可枚举的.可配置的. 在ECMAScript 5中,数据属性的4个特性分别是它的值.可写性.可枚举性.可配置性.存取器属性的特性是读取.写入.可枚举性 ...

  5. javascript权威指南笔记--javascript语言核心(五)--getter和setter属性

    getter和setter属性: var p = { x:1.0, y:1.0, get r(){ return Math.sqrt(this.x*this.x + this.y * this.y); ...

  6. 1.语言概述-JavaScript权威指南笔记

    上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...

  7. 2.语言概述-JavaScript权威指南笔记

    上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...

  8. javascript权威指南笔记

    最近每天工作之余看下js的细节部分,时间不是很多,所以看的进度也不会太快,写个博客监督自己每天都看下. 以前不知道的细节或者以前知道但是没注意过的地方都会记录下来,所以适合有一定基础的,不适合零基础新 ...

  9. 2.词法结构-JavaScript权威指南笔记

    今天是第二章.所谓词法结构(lexical structure),就是写代码中最基本的东西,变量命名,注释,语句分隔等,这是抄书抄的... 1.字符集,必须是Unicode,反正Unicode是ASC ...

随机推荐

  1. Linux的视频编程(V4L2编程)【转】

    本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11472073 一.什么是video4linuxVideo4linux2(简称V4L2), ...

  2. JavaScript调试技巧之console.log()详解

    JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...

  3. IO流认识

    处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写能力.  BufferedWriter/BufferedReader(缓冲流)是处理流中的一种 OutputS ...

  4. 复利计算--4.0 单元测试之JAVA版-软件工程

    复利计算--4.0 单元测试-软件工程 前言:由于本人之前做的是C语言版的复利计算,所以为了更好地学习单元测试,于是将C语言版的复利计算修改为JAVA版的. 一.主要的功能需求细分: 1.本金为100 ...

  5. java基础:网络编程TCP,URL

    获取域名的两种方法: package com.lanqiao.java.test; import java.net.InetAddress;import java.net.UnknownHostExc ...

  6. Moo University - Financial Aid

    Moo University - Financial Aid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6020 Accep ...

  7. Argus

    Argus Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10186 Accepted: 4801 Description A ...

  8. HDU(4734),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...

  9. Git学习笔记03--git reset

    摘自<Git权威指南> Git reset 是Git最常用的命令之一,也是最危险最容易误用的命令. 用法一:git reset [-q] [<commit>] [--] < ...

  10. Mybaits 之根据集合查询和逗号分隔的子查询

    这是我们的mapper要根据传入一个集合进行查询: List<ExtKeywordCategory> findListByIds(List<ExtKeywordFkCategory& ...