第四章 表达式和运算符

        4.2 对象和数组的初始化表达式

               数组: []   [3,7] [1+2,3+4] [[1,2,3,],[4,5,6],[7,8,9]]

               对象:   {x:2.3,y:4.5}

        4.4 属性访问表达式

               js有两种属性访问方式   expression.identifier     expression[expression]

        4.8.1 "+"运算符

               尽量转换为字符串再计算

        4.9.1

                ==  相等运算符    ===  恒等运算符

                !=                     !==

                "==="  严格相等运算符首先计算其操作数的值,然后比较这两个值(没有任何类型转换)

                   类型不同不相等                  

                   有NaN,不相等

                   0=-0

                   引用值指向同一个对象、数组或函数,相等

                "==" 比较不严格,如果比较的不是同一类型,会尝试进行类型转换,转换规则如下:

                    一个字符串,一个数字,字符串尝试转换为数字再比较

                    如果有"true",则将其转换为1再进行比较

          4.9.2 比较运算符

                  1.可以比较任何类型,但真正执行比较操作的只有数字和字符串,其他类型都转换成原始值

                  2.如果一个类型是数字,则原始值转换成数字

                  3.如果其中一个操作数是NaN,比较总返回false

                  4.字符串比较区分大小写   大写  <  小写

          4.9.3  in运算符                   

                  左操作符是一个字符串或可以转换成字符串,有操作数是一个对象

                  若对象有字符串同名的属性名,则返回true

var point={x:1,y:1};

x in point;// true

z in point;// false

toString in point;// true  默认继承toString方法

           4.9.4 instanceof运算符

                   做操作符是一个对象,右操作符标识对象的类

                   若对象是右侧类的实例,则返回true(会判断父类)

           4.10

                    运算顺序自左向右

                     逻辑运算符会在任何希望使用布尔值的地方返回一个真值或假值,这也意味着逻辑运算符不一定只返回true,false。

var i=1&&2&&3;

alert(i);//3 因为运算顺序自左向右

           4.12.1 eval()

                    eval最重要的是它使用了调用它的变量作用域环境

                    全局eval(),这种特性不仅保障了别名eval在函数作用域的安全性,还可以在函数中执行一些对上下文没有依赖的全局脚本代码段

var geval=eval;

var x="global",y=”global”;

function f(){

         var x=”local”;

         eval(”x+=’changed’”);

         return x;

}

function y(){

          var y=”local”;

          geval("y+=’changed’”);

          return y;

}

console.log(f(),x);

console.log(y(),y);

        4.13.2 typeof运算符

                 一元操作符,返回操作数的类型

        4.13.3 delete运算符

                 一元操作符,删除对象属性或者数组元素

第五章  语句

         5.3 声明语句

                多次声明同一个变量是无所谓的

第六章  对象

         对象是个复合值,它将很多值聚合在一起,可通过名字访问这些值;对象也可看做是属性的无序集合,每个属性都是一个键值对。

         javascript三类对象和两类属性:

         内置对象:数组,函数,日期,正则表达式

         宿主对象:js解释器所嵌入的宿主环境定义的。

         自定义对象:js代码创建的对象

         自由属性:直接在对象中定义的属性

         继承属性:在对象的原型对象中定义的属性

         6.1 创建对象

               6.1.1 对象直接量

                        对象直接量是由若干键值对组成的映射表,属性名可以是标识符也可以是字符串直接量,属性值随意。

                        对象直接量是一个表达式,这个表达式每次运算都创建并初始化一个新的对象

               6.1.2 通过new创建对象

                        关键字new后跟随一个函数调用,这个函数称作构造函数

               6.1.3 原型

                        每一个js对象都和另一个对象相关联,“另一个对象”就是原型,每一个对象都从原型继承属性。

               6.1.4 Object.create()

                        var i=Object.create({x:1,y:2});

                        var j=Object.create(Object.prototype);//相当于new Object()

                        var m=Object.create(null);//不继承任何属性和方法

function inherit(p){
       if(p==null) throw new TypeError();

       if(Object.create) return Object.create(p);

       var getType=typeof p;

       if(p!='object'&&p!='function') throw new TypeError();

       function f(){};

       f.prototype=p;

       return new f();     
}

        6.2 属性的查询和设置

              object.property=object['property'];

              在js中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性。

              在非严格模式中,给一个只读的属性赋值,不会报错,属性也不会被修改。

        6.3 delete属性

               delete运算符可以删除对象的属性。

               delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性

var a={p:{x:1}};

var b=a.p;// b指向 a.p

alert(delete a.p);//true

alert(a.p);//undefined

alert(b.x);//1    只是删掉了a.p的引用,但是b还是指向a.p。销毁对象时,要遍历属性中的属性,依次删除,防止内存泄漏

        6.4 检测属性

                可以通过in,hasOwnPreperty(),propertyIsEnumerable()方法来检测属性

                 in检测对象的自有属性或继承属性是否包含指定名称属性

                 hasOwnProperty()检测对象的自有属性是否包含指定名称的属性

var o={x:1};

"x" in o;// true

"y" in o;// false

"toString" in o;//true

o.hasOwnProperty('x');//true

o.hasOwnProperty('y');//false

o.hasOwnProperty('toString');//false

o.propertyIsEnumerable('x');//true

o.propertyIsEnumerable('y');//false

o.propertyIsEnumerable('toString');//false

        6.5 枚举属性

               for in

               Object.keys()

               Object.hasOwnPropertyNames();

        6.6 属性getter和setter(ECMAScript5 后启用)

               对象直接量方式创建

var test={

x:"asd",

get y(){return "get"+this.x;},//若不用this,则无法访问y

set y(value){ this.x=value;}

}

alert(test.x);

alert(test.y);

test.y="opq";

alert(test.y);

alert(test.x);

        6.7 属性的特性

              通过属性setter和getter的设置,可以实现属性的读、写、可枚举、可配置的特性

              Object.getOwnPropertyDescriptor()可以获得某个对象特定的自有属性的属性描述,      

Object.getOwnPropertyDescriptor({x:'1'},"x");

//返回 {value:1,writeable:true,enumerable:true,configurable:true}

               Object.definePeoperty(),设置属性的特性,或者想让新建属性具有某种特性

var o={};

Object.defindePeoperty(o,"x",{value:"abc",writeable:true,enumerable:false,configurable:true});

o.x;//1  有值

Object.keys(o)// {}   不可枚举

Object.definePeoperty(o,"x",{enumerable:true});

Object.keys(o)//{x:"abc"}

              Object.definePeoperties(),  可以设置多个属性的版本

              若给不可创建或修改的属性使用definePeoperty,会报错

/*不可枚举的extend()方法

*

*/

Object.definePeoproty(Object.prototype,"extend",{

           writeable:true,

           enumerable:true,

           configurable:true,

           value:function(o){

                 var names=Object.getOwnpropertyNames(o);

                 for(var i=0;i<names.length;i++)
                {

                      //若属性已存在,则跳过

                      if(names[i] in this)continue;

                      var desc=Object.getOwnPropertyDescriptor(o,names[i]);

                      Object.defineProperty(this,names[i],desc);
                }

           }

});

        6.8 对象的三个属性

           6.8.1 原型属性

               创建:

对象直接量,使用Object.prototype作为原型

new,使用 构造函数的prototype作为原型

Object.create(),使用 传入的第一个参数作为原型

               查找:

Object.getPrototypeOf()//ECMAScript 5

o.constructor.prototype//ECMAScript 3

          6.8.2 类属性

                对象的类属性是一个字符串,用以表示对象的类型信息

function (){

    if(o===null) return "Null";

    if(o===undefined) return "undefined";

    return Object.prototype.toString.Call(o).slice(8,-1);
}

        6.9 序列化对象

               JSON.stringify();

               JSON.parse();

               注:ECMAScript 5中的这些函数的本地实现和http://json.org/json2.js 基本一样,所以可以引入json2.js在ECMAScript的环境中使用这些函数

重温《js权威指南》 第4、5、6章的更多相关文章

  1. 《JS权威指南学习总结--第8章 函数知识》

    内容要点: 1.函数表达式定义后立即调用: var tensquared = ( function(x){ return x*x ;}(10) ); 2.嵌套函数:       在JS里,函数可以嵌套 ...

  2. 《JS权威指南学习总结--第7章 数组》

    内容要点: 一. JS数组是无类型的:数组元素可以是任意对象,并且同一个数组中的不同元素也可能有不同的类型.数组的元素甚至也可能是对象或其他属性,这允许创建复制的数据结构,如对象的数组和数组的数组. ...

  3. 《JS权威指南学习总结--第六章 对象》

    内容要点: 一.对象定义 对象是JS的基本数据类型.对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 对象也可看做是属性的无序集合,每个属性都是一个名/值对. 属性 ...

  4. 《JS权威指南学习总结--第五章语句》

    内容要点: 一.throw语句     所谓异常是当发生了某种异常情况或错误时产生的一个信号.     抛出异常就是用信号通知发生了错误或异常状况.     捕获异常时指处理这个信号,即采取必要的手段 ...

  5. 《JS权威指南学习总结--第三章类型、值和变量》

    第三章 类型.值和变量 内容要点 一.数据类型 1.在编程语言中,能够表示并操作的值的类型称做数据类型 2.JS的数据类型分为两类: 原始类型:数字.字符串和布尔值 对象类型 3.JS中有两个特殊的原 ...

  6. 《JS权威指南学习总结--第7章 数组概念、稀疏数组》

    一.数组概念 数组是值的有序结合.每个值叫做一个元素,而每个元素在数组中都有一个位置,用数字表示,称为索引. JS数组是无类型的:数组元素可以是任意对象,并且同一个数组中的不同元素也可能有不同的类型. ...

  7. 《JS权威指南学习总结--第四章4.9.1相等和严格相等》

    内容要点:       一. 严格相等运算符"==="  首先计算其操作数的值,然后比较这两个值,比较过程没有任何类型转换:            1.如果两个值类型不同,则它们不 ...

  8. 《JS权威指南学习总结--1.1语言核心》

    1.1语言核心 --本节主要介绍<js权威指南>基础部分各章讲解内容和一些简单的示例 本小节内容: 一.第二章讲解js注释.分号和Unicode,第三章主要讲解js变量和赋值 简单示例: ...

  9. 【vue.js权威指南】读书笔记(第一章)

    最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...

  10. 《JS权威指南学习总结》

    JS权威指南学习总结:http://www.cnblogs.com/ahthw/category/652668.html

随机推荐

  1. scjp考试准备 - 6 - 父类构造器的引用

    题一,如下代码的执行结果: class Person{ String name = "No name"; public Person(String nm){name = nm;} ...

  2. CentOS 6.3 安装以及配置Apache php mysql

    准备篇: 1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dp ...

  3. 以Lockbits的方式访问bitmap

    转载自:http://www.cnblogs.com/xiashengwang/p/4225848.html 2015-01-15 11:38 by xiashengwang, 585 阅读, 0 评 ...

  4. < java.util >-- Collection接口

    Collection:    |--List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引.元素可以重复.    |--Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素.必须 ...

  5. Postgresql 存储过程调试 1

    看来人真的有些力不从心,半个月前还很得意掌握的简单的Postgresql 存储过程的调试,一段时间没使用,做新功能就忘了! Postgresql 在开源的数据库里面算是很强悍的了,但现在就是不方便调试 ...

  6. 读《JavaScript语言精粹》的一些感言

    最近看了<JavaScript语言精粹>,并且连着看了两遍,如果非要用言语形容的话,那我只能用4个字来形容:相见恨晚.其中的一些经验经过这么多年的摸索其实也了然,但是作者用这么浅薄的书把有 ...

  7. javascript面向对象分层思维

    js本身不是面向对象语言,在我们实际开发中其实很少用到面向对象思想,以前一直以为当要复用的时候才封装成对象,然而随着现在做的项目都后期测试阶段发现面向对象的作用不仅仅只是复用,可能你们会说面向对象还有 ...

  8. jira的插件

    jira的插件开发流程实践   怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项 ...

  9. 站立会议 ~NO.1

    Yesterday:None Today: Search for offline maps of our school and testify the veracities of it Problem ...

  10. 阿里云:linux 一键安装web环境

    参考地址:http://www.cnblogs.com/ada-zheng/p/3724957.html