JavaScript高级程序设计(第3版)第三章读书笔记

第三章  基本概念express

  1. ECMAScript中的一切(变量、函数名和操做符)都区分大小写。
  2. 标识符是指变量、函数、属性的名字,或者函数的参数。
  3. 标识符的组成规则是:第一个字符必须是一个字母、下划线(_)或一个美圆符号($);其余字符能够是字母、下划线、美圆符号或数字。
  4. ECMAScript标识符采用驼峰大小写格式。
  5. ECMAScript注释包括单行注释(//)和块级注释(/*  *  */)。
  6. ECMAScript 5引入了严格模式的概念,严格模式是为JavaScript定义了一种不一样的解析与执行模型。
  7. 在严格模式下,ECMAScript3中的一些不肯定的行为将获得处理,并且对某些不安全的操做会抛出错误。在整个脚本中启动严格模式,可在定都添加”use strict”;也可指定函数在严格模式下执行。
  8. 严格模式下,JavaScript的执行结果会有很大不一样。支持严格模式的浏览器包括IE10+、Firefox4+、Safari5+、Opera12+和Chrome。
  9. ECMAScript中的语句以一个分号结尾,若是省略分号,则由解析器肯定语句的结尾。加上分号会在某些状况下增进代码的性能,由于这样解析器就没必要再花时间推测应该在哪里插入分号了。
  10. 关键字和保留字不能用做标识符。(见书21页)
  11. ECMAScript的变量是松散类型的,能够用来保存任何类型的数据。用var操做符定义的变量将成为定义该变量的做用域中的局部变量,未经初始化的变量会保存一个特殊的值——undefined。在严格模式下,不能定义名为eval或arguments的变量,不然会致使语法错误。
  12. ECMAScript有5中基本数据类型:Undefined、Null、Boolean、Number、String,一种复杂类型:Object,Object本质上是由一组无序的名值对组成。
  13. 对一个值使用typeof操做符可能返回下列某个字符串:

“undefined”——若是这个值为定义;数组

“boolean”——若是这个值是布尔值;浏览器

“string”——若是这个值是字符串;安全

“number”——若是这个值是数值;函数

“object”——若是这个值是对象或者null;性能

“function”——若是这个值是函数。测试

经过typeof操做符来区分函数和其余对象是有必有的。编码

  1. Undefined类型只有一个值,即特殊的undefined。对未初始化的变量执行typeof操做符会返回undefined值,而对未声明的变量执行typeof操做符一样也会返回undefined值。
  2. Null类型也只有一个值,即特殊的null。从逻辑角度来看,null表示一个空对象指针,所以,typeof操做符检测null会返回”object“。
  3. null == undefined会返回true,这是由于==操做符处于比较的目的会转换其操做数。
  4. 区分null和undefined,显示地初始化变量为undefined,保存对象的变量在没有真正保存对象时,明确该变量保存null值。
  5. Boolean类型仅两个字面值:true和false,true不必定等于1,false不必定等于0。
  6. 各类数据类型与Boolean类型的转换规则

数据类型spa

转换为true的值指针

转换为false的值

Boolean

true

False

String

任何非空字符串

“”(空字符串)

Number

任何非零数字值(包括无穷大)

0和NaN

Object

任何对象

null

Undefined

n/a(不适用)

undefined

  1. Number类型使用IEEE754格式来表示整数和浮点数值。八进制字面量在严格模式下是无效的,会致使支持该模式的JavaScript引擎抛出错误。
  2. 保存浮点数值须要的内存空间是保存整数值的两倍,所以ECMAScript会尽量地将浮点数转换为整数值。能够用isFinite( )函数判断一个数值是否是有穷的。ECMAScript的最小数值为Number.MIN_VALUE=5e-324,最大数值为Number.MAX_VALUE=1.797693134623157e+308。
  3. NaN,即非数值( Not a Number),是一个特殊的数值,用于表示一个原本要返回数值的操做数为返回数值的状况。任何数值除以0都会返回NaN,且在ECMAScript中不会影响其余代码的执行。
  4. NaN两大特色:任何涉及NaN的操做,都会返回NaN;NaN与任何数值都不相等,包括NaN自己。
  5. IsNaN( )函数用来判断接收的参数是否“不是数值”。
  6. 有3个函数能够把非数值转换为数值:Number( )、parseInt( )和parseFloat( )
  7. Number( )函数能够用于任何数据类型转换。其转换规则以下:

若是是Boolean值,true和false将分别被转换为1和0;

若是是数字值,知识简单的传入和返回;

若是是null值,返回0;

若是是undefined,返回NaN。

  1. 字符串的转换规则以下:

若是字符串中只包含数字(包括前面带正号或负号的状况),则将其转换为十进制数值(前导的零被忽略);

若是字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(前导的零被忽略);

若是字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;

若是字符串是空的(不包含任何字符),则将其转换为0;

若是字符串中包含除上述格式以外的字符,则将其转换为NaN。

  1. 若是是对象,则调用对象的valueOf( )方法,而后依照前面的规则转换返回的值。若是转换的结果是NaN,则调用对象的toString( )方法,而后再次依照前面的规则转换返回的字符串值。
  2. 若是第一个字符不是数字字符或者符号,parseInt( )函数就会返回NaN。转换时最好指明基数,例如var num1 = parseInt(“10”,2); //输出结果是2。
  3. parseFloat( )与parseInt( )的两个区别:字符串中的第一个小数点对parseFloat( )是有效的,对parseInt( )是无效的;parseFloat( )始终会忽略前导的零,即其只能解析十进制值,没有用第二个参数指定基数的用法。特例:parseFloat(“1234.00”)=1234,参数没有小数点或者小数点后都是零,返回整数。
  4. String类型用于表示由零或多个16为Unicode字符组成的字符序列,由单引号(’)或双引号(”)表示。
  5. 字符字面量

字面量

含义

\n

换行

\t

指标

\b

退格

\r

回车

\f

进纸

\\

斜杠

\’

单引号(’),在用单引号表示的字符串中使用,例如:’He said,\’hey.\’ ’

\”

双引号(“),在用双引号表示的字符串中使用,例如:”He said,\”hey.\” ”

\xnn

以十六进制代码nn表示一个字符(其中n为0~F)。例如,\x41表示”A”

\unnn

以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。

  1. 把一个值转换为一个字符串有两种方式:toString( )方式,数值、布尔值、对象和字符串值都可,但null和undefined无此方法。toString( )方法可设置转换基数。
  2. 在不肯定要转换的值是否是null或undefined的状况下,还可使用转型函数String( ),此方式能将任意类型的值转换为字符串,其遵照如下转换规则:

若是值有toString( )方法,则调用该方法(没有参数)并返回相应的结果;

若是值是null,则返回”null”;

若是值是undefined,则返回”undefined”。

  1. 在ECMAScript中,Object类型是全部它的实例的基础,即Object类型所具备的任何属性和方法也一样存在于更具体的对象中。存在如下属性和方法:

Constructor:保存着用于建立当前对象的函数。

hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在,其中,属性名必须以字符串的形式指定,例如o.hasOwnProperty(“name”)。

isPrototypeOf(object):用于检查对象是不是传入对象的原型。

propertyIsEnumerable(propertyName):用于检查给定的属性是否可以使用for-in语句来枚举。

toLoacleString( ):返回对象的字符串表示,该字符串与执行环境的地区对应。

toString( ):返回对象的字符串表示。

valueOf( ):返回对象的字符串、数值或布尔值表示。一般与toString( )方法的返回值相同。

  1. 只能操做一个值的操做符叫作一元操做符,包括递增(++)和递减(--)操做符,都可前置和后置。这些操做符在应用与非整数类型时,遵照如下规则:

在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操做。字符串变量变成数值变量。

在应用于一个不包含有效数字字符的字符串时,将变量的值设为NaN,字符串变量变为数值变量。

在应用于布尔值false时,先将其转换为0再执行加减1的操做,布尔值变量变为数值变量。

在应用于布尔值true时,先将其转换为1再执行加减1的操做,布尔值变量变成数值变量。

在应用于浮点数值时,执行加减1的操做。

在应用于对象时,先调用对象的valueOf( )方法,以取得一个可供操做的值,而后对该值应用前述规则,若是结果是NaN,则再调用toString( )方法后应用前述规则。对象变量变成数值变量。

  1. 一元加操做符以一个加号(+)表示,放在数值前面,不会对数值产生任何影响,但对非数值应用一元加操做符时,该操做符会像Number( )转型函数同样对这个值进行转换。
  2. 一元减操做符以一个减号(-)表示,放在数值前面,该值变成负数,当应用于非数值时,一元减操做符遵循与一元加操做符相同的规则,最后再将获得的数值转换为负数。
  3. 位操做符用于在最基本的层次上,即按内存中表示数值的位来操做数值。对于有符号的整数,32位中的前31为用于表示整数的值,第32位用于表示数值的符号:0表示正数,1表示负数。求负数的话,使用二进制补码,即首先求出对应正数的二进制码,而后求其二进制反码,最后二进制反码加1。注意:在处理有符号正数时,是不能访问位31(即符号位,从0开始)的。
  4. 对于无符号正数而言,第32位再也不表示符号,所以无符号数只能是正数,且无符号整数的值能够更大,由于多出的一位再也不表示符号,能够用来表示数值。
  5. 按位非(NOT)操做符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。按位非的本质是:操做数的负值减1。
  6. 按位与(AND)操做符由一个和号字符(&)表示,按位与操做只在两个数值的对应为都是1时才返回1,任何一位是0,结果都是0。
  7. 按位或(OR)操做符由一个竖线符号(|)表示,按位或操做在有一个位是1的状况下就返回1,而只是在两个位都是0的状况下才返回0。
  8. 按位异或(XOR)操做符由一个插入符号(^)表示,此操做在两个数值对应位上只有一个1时才返回1,若是对应的两位都是1或都是0,则返回0。
  9. 左移操做符由两个小于号(<<)表示,这个操做符会将数值的全部位向左移动指定的位数。左移不会影响操做数的符号位,且以0来填充右边空位。
  10. 有符号的右移操做符由两个大于号(>>)表示,这个操做符会将数值向右移动,但保留符号位,此时,左侧空位会用符号位的值来填充全部空位。
  11. 无符号右移操做符由三个3个大于号(>>>)表示,此操做符会将数值的全部32位都向右移动,对正数而言,此方法同有符号位右移,但对负数而言,无符号右移是0来填充空位。且无符号右移会将负数的二进制码当成正数的二进制码,以至结果很大。
  12. 逻辑非操做符由一个叹号(!)表示,可用于ECMAScript中的任何值。逻辑非操做符遵循下列规则:

若是操做数是一个对象,返回false;

若是操做数是一个空字符串,返回true;

若是操做数是一个非空字符串,返回false;

若是操做数是数值0,返回true;

若是操做数是任意非0数值(包括Infinity),返回false;

若是操做数是null,返回true;

若是操做数是NaN,返回true;

若是操做数是undefined,返回true。

  1. 同时使用两个逻辑非操做符,即模拟了Boolean( )转型函数的行为。
  2. 逻辑与操做符由两个和号(&&)表示,能够应用于任何类型的操做数,而不只仅是布尔值。在有一个操做数不是布尔值的状况下,逻辑与操做就不必定返回布尔值,此时,它遵循如下规则:

若是第一个操做数是对象,则返回第二个操做数;

若是第二个操做数是对象,则只有在第一个操做数的求值结果为true的状况下才会返回该对象;

若是两个操做数都是对象,则返回第二个操做数;

若是有一个操做数是null,则返回null;

若是有一个操做数是NaN,则返回NaN;

若是有一个操做数是undefined,则返回undefined。

逻辑与是短路操做,即若是第一个操做数可以决定结果,则不会对第二个操做数求值。

  1. 逻辑或操做符由两个竖线符号(||)表示,若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值,此时,其遵循如下规则:

若是第一个操做数是对象,则返回第一个操做数;

若是第一个操做数的求值结果是false,则返回第二个操做数;

若是两个操做数都是对象,则返回第一个操做数;

若是两个操做数都是null,则返回null;

若是两个操做数都是NaN,则返回NaN;

若是两个操做数都是undefined,则返回undefined。

逻辑或也是短路操做。可利用逻辑或的这一行为来避免为变量赋null或undefined值。

  1. 乘法操做符由一个星号(*)表示,用于计算两个数值的乘积。在处理特殊值的状况下,乘法操做符遵循如下规则:

若是操做数都是数值,执行常规的乘法计算。若是乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity;

若是有一个操做数是NaN,则结果是NaN;

若是是Inifinity与0相乘,则结果是NaN;

若是是Inifinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操做数的符号;

若是有一个操做数不是数值,则在后台调用Number( )将其转换为数值,而后再应用上面的规则。

  1. 除法操做符由一个斜线符号(/)表示,执行第二个操做数除第一个操做数的计算,其对特殊值处理的规则以下:

若是操做数都是数值,执行常规的除法计算,若是商超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity;

若是有一个操做数是NaN,则结果是NaN;

若是是Infinity被Infinity除,则结果是NaN;

若是是零被领出,则结果是NaN;

若是是非零的有限数被零除,则结果是Infinity或-Infinity,取决于有符号操做数的符号;

若是是Infinity被任何非零数值除,则结果是Infinity或-Infinity,取决于有符号操做数的符号。

若是有一个操做数不是数值,则在后台调用Number( )将其转换为数值,而后再应用以前的规则。

  1. 求模(余数)操做符由一个百分号(%)表示,对特殊值的处理规则以下:

若是操做数都是数值,执行常规的除法计算,返回除得的余数;

若是被除数是无穷大值而除数是有限大的数值,则结果返回NaN;

若是被除数是有限大的数值而除数是零,则结果是NaN;

若是是Infinity被Infinity除,则结果是NaN;

若是被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;

若是被除数是零,则结果是零;

若是有一个操做数不是数值,则在后台调用Number( )将其转换为数值,再应用以上规则。

  1. 加法操做符(+),若是两个操做数都是数值,执行常规的加法计算,而后根据如下规则返回结果:

若是有一个操做数是NaN,则结果是NaN;

若是是Infinity加Infinity,则结果是Infinity;

若是是-Infinity 加-Infinity,则结果是-Infinity;

若是是Infinity加-Infinity,则结果是NaN;

若是是+0加+0,则结果是+0;

若是是-0加-0,则结果是-0;

若是是+0加-0,则结果是+0;

若是有一个操做数是字符串,则应用如下规则:

若是两个操做数都是字符串,则将第二个操做数与第一个操做数拼接起来;

若是只有一个操做数是字符串,则将另外一个操做数转换为字符串,而后再将两个字符串拼接起来。

若是有一个操做数是对象、数值或布尔值,则调用它们的toString( )方法取得相应的字符串值,而后再运用前面的关于字符串的规则。对于undefined和null,则分别调用String( )函数并取得字符串”undefined”和”null”。

  1. 减法操做符(-)在处理各类该数据类型转换时,遵照的特殊规则以下:

若是两个操做符都是数值,则执行常规的算术减法操做并返回结果;

若是有一个操做数是NaN,则结果是NaN;

若是是Infinity减Infinity,则结果是NaN;

若是是-Infinity减-Infinity,则结果是NaN;

若是是Infinity减-Infinity,则结果是Infinity;

若是是-Infinity减Infinity,则结果是-Infinity;

若是是+0减+0,则结果是+0;

若是是+0减-0,则结果是-0;

若是是-0减-0,则结果是+0;

若是有一个操做数是字符串、布尔值、null或undefined,则先在后台调用Number( )函数将其转换为数值,而后再根据前面的规则执行减法计算。若是转换的结果是NaN,则减法的结果就是NaN;

若是有一个操做数是对象,则调用对象的valueOf( )方法以取得表示该对象的数值。若是获得的值是NaN,则减法的结果就是NaN。若是对象没有valueOf( )方法,则调用其toString( )方法并将获得的字符串转换为数值。

  1. 关系比较符有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。规则以下:

若是两个操做数都是数值,则执行数值比较。

若是两个操做数都是字符串,则比较两个字符串对应的字符编码值;

若是一个操做数是数值,则将另外一个操做数转换为数值,而后执行数值比较;

若是一个操做数是对象,则调用这个对象的valueOf( )方法,用获得的结果按照前面的规则比较,若无valueOf( )方法,则用toString( )方法,同上。

若是一个操做数是布尔值,则先将其转换为数值,而后再执行比较。

注意:任何操做数与NaN进行关系比较,结果都是false。

  1. 相等(==)和(!=),会先转换操做数,而后再比较它们的相等性。

转换不一样的数据类型是,规则以下:

若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值——false转换为0,true转换为1;

若是一个操做数是字符串,另外一个操做数是数值,在比较相等性以前先将字符串转换为数值;

若是一个操做数是对象,另外一个操做数不是,则调用对象的valueOf( )方法,用获得的基本类型值按照前面的规则进行比较。

两个操做符在进行比较时则要遵循下列规则:

null和undefined是相等的。

要比较相等性以前,不能将null和undefined转换为其余任何值。

若是有一个操做数是NaN,则相等操做符返回false,而不相等操做符返回true。即便两个操做数都是NaN,相等操做符也返回false。

若是两个操做数都是对象,则比较它们是否是同一个对象,若是都指向同一个对象,则相等操做符返回true,不然,返回false。

  1. 全等(===)和不全等(!==),仅在比较以前不转换操做数,其余方面与相等和不相等操做符没区别。注意:null==undefined会返回true,但null===undefined会返回false。由于他们是不一样类型的值。
  2. 条件操做符与Java语法相同。 Variable = a ? b:c;
  3. 简单的赋值操做符由等于号(=)表示,即把右侧的值付给左侧的变量。
  4. 复杂赋值操做符主要有:

乘/赋值 (*=);

除/赋值 (/=);

模/赋值 (%=);

加/赋值 (+=);

减/赋值 (-=);

左移/赋值 (<<=);

有符号右移/赋值 (>>=);

无符号右移/赋值 (>>>=)。

  1. 逗号操做符用于声明多个变量,在用于赋值时,逗号操做符总会返回表达式中的最后一项,如var num =(5,4,3,2,1) //num=1.
  2. if语句的语法是: if  (condition) statement1 else statement2
  3. do-while语句是一种后测试循环语句,即只有在循环体中的代码执行以后,才会测试出口条件。在对条件表达式求值以前,循环体内的代码至少会被执行一次。
  4. while语句属于前测试循环语句,在循环贴内的代码被执行以前,就会对出口条件求值,所以,循环体内的代码有可能用于不会被执行。
  5. for语句也是一直前测试循环语句,但它具备在执行循环以前初始化变量和定义循环后要执行的代码的能力。在循环内部定义的变量也能够在外部访问到。
  6. for-in语句是一种精准的迭代语句,能够用来枚举对象的属性。语法以下:

for (property in expression) statement

    在使用for-in循环以前,先检测确认该对象的值不是null或undefined。

  1. 使用label语句能够在代码中添加标签,以便未来使用。语法为:

Label : statement

加标签的语句通常都要与for语句等循环语句配合使用。

  1. break 和continue语句用于在循环中精确地控制代码的执行,其中,break语句会当即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是当即退出循环,但退出循环后会从循环的顶部继续执行。
  2. break和continue语句均可以与label语句联合使用,从而返回代码中特定的位置。应用于循环嵌套的状况。
  3. with语句的做用是将代码的做用域设置到一个特定的对象中。语法以下:

with (expression) statement

严格模式下,不容许使用with语句,不然将视为语法错误。大量使用with语句会致使性能降低,也会给调试代码形成困难,不建议在大型应用程序中使用。

  1. switch语句,可使用任何数据类型,其次每一个case的值不必定是常量,能够是变量,甚至是表达式。Switch语句在比较值时使用的是全等操做符,所以不会发生类型转换。
  2. 任何函数在任什么时候候均可以经过return语句后跟要返回的值来实现返回值,位于return语句以后的任何代码都永远不糊执行。
  3. 严格模式对函数有一些限制:

不能把函数命名为eval或arguments;

不能把参数命名为eval或arguments;

不能出现两个命名参数同名的状况。

不然会致使语法错误,代码没法执行。

  1. ECMAScript中的参数在函数内部用一个数组表示,在函数体内能够经过arguments对象来访问这个参数数组,从而获取传递给函数的每个参数。arguments对象只是与数组相似,它并非Array的实例,可以使用方括号语法来访问它的每个元素,用length属性来肯定传递进来多少个参数。所以,命名参数只提供便利,但不是必需的。且arguments对象能够与命名参数一块儿使用。且arguments的值用于与对应命名参数的值保持同步(在ECMAScript 5中无效)。
  2. 因为不存在函数签名的特性,ECMAScript函数没有重载,即定义了两个名字相同的函数,则该名字只属于后定义的函数。
相关文章
相关标签/搜索