重温《js权威指南》 第4、5、6章

第四章 表达式和运算符

        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的环境中使用这些函数

posted @ 2013-12-04 14:15  ζ老豆角  阅读(236)  评论(0编辑  收藏  举报