第四章 表达式和运算符

        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. com.Goods.ForEach

    com.Goods.ForEach(g => { g.TransactionPrice = getUnitPriceByProductId(g.ProductID); g.ExpressMone ...

  2. C# 生成XML 多级节点

    直接上代码: 在应用程序中 class Program { //public static JsonServiceClient Service = new JsonServiceClient(Conf ...

  3. MYSQL procedure

    没怎么接触过mysql procedure,今天建个calendar表还磨磨唧唧的,记录一下: CREATE PROCEDURE `new_procedure` (start_date DATA,en ...

  4. 从JetBrains公司产品给我的商业模式启示

    JetBrains是捷克一家公司,专门从事IDE工具的开发,运营的产品有十几个.我因为使用JavaScript IDE工具而了解了WebStorm.进而了解了开发WebStorm的公司JetBrian ...

  5. 软件工程随堂作业--随机产生30到四则运算(c语言)

    #include "stdio.h" #include "math.h" #include "stdlib.h" #include" ...

  6. JS中的apply,call,bind深入理解

    在Javascript中,Function是一种对象.Function对象中的this指向决定于函数被调用的方式.使用apply,call 与 bind 均可以改变函数对象中this的指向,在说区别之 ...

  7. 在Mac中如何显示和隐藏文件

    1.显示Mac隐藏文件的命令: 在终端中输入"defaults write com.apple.finder AppleShowAllFiles YES":  鼠标单击窗口左上角 ...

  8. git的初步了解

    其实git我也不熟,请两天假回来宿友告诉我,我们有一份高大尚的作业.我问她们才知道原来是让我们以博客的形式写两份作业交上去.git还是我在网上查找到的,才对它有一些的了解. git是一个开源分布式版本 ...

  9. 2011 Asia Fuzhou Regional Contest

    Xiangqi http://acm.hdu.edu.cn/showproblem.php?pid=4121 模拟,用高内聚低耦合的思想来写模拟题还是很好的,提高了函数的可重用性,程序的可读性,正确性 ...

  10. Windows+Apache+MySQL+PHP(WAMP)环境搭建

    运行操作系统:Windows Server 2008 R2 Apache版本:Apache 2.2 MySQL版本:MySQL 5.5 PHP版本:PHP 5.6.14(当前最新版) 更新日期:201 ...