第三章 基本概念
- ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
- 标识符是指变量、函数、属性的名字,或者函数的参数。
- 标识符的组成规则是:第一个字符必须是一个字母、下划线(_)或一个美元符号($);其他字符可以是字母、下划线、美元符号或数字。
- ECMAScript标识符采用驼峰大小写格式。
- ECMAScript注释包括单行注释(//)和块级注释(/* * */)。
- ECMAScript 5引入了严格模式的概念,严格模式是为JavaScript定义了一种不同的解析与执行模型。
- 在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全的操作会抛出错误。在整个脚本中启动严格模式,可在定都添加”use strict”;也可指定函数在严格模式下执行。
- 严格模式下,JavaScript的执行结果会有很大不同。支持严格模式的浏览器包括IE10+、Firefox4+、Safari5+、Opera12+和Chrome。
- ECMAScript中的语句以一个分号结尾,如果省略分号,则由解析器确定语句的结尾。加上分号会在某些情况下增进代码的性能,因为这样解析器就不必再花时间推测应该在哪里插入分号了。
- 关键字和保留字不能用作标识符。(见书21页)
- ECMAScript的变量是松散类型的,可以用来保存任何类型的数据。用var操作符定义的变量将成为定义该变量的作用域中的局部变量,未经初始化的变量会保存一个特殊的值——undefined。在严格模式下,不能定义名为eval或arguments的变量,否则会导致语法错误。
- ECMAScript有5中基本数据类型:Undefined、Null、Boolean、Number、String,一种复杂类型:Object,Object本质上是由一组无序的名值对组成。
- 对一个值使用typeof操作符可能返回下列某个字符串:
“undefined”——如果这个值为定义;
“boolean”——如果这个值是布尔值;
“string”——如果这个值是字符串;
“number”——如果这个值是数值;
“object”——如果这个值是对象或者null;
“function”——如果这个值是函数。
通过typeof操作符来区分函数和其他对象是有必有的。
- Undefined类型只有一个值,即特殊的undefined。对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。
- Null类型也只有一个值,即特殊的null。从逻辑角度来看,null表示一个空对象指针,因此,typeof操作符检测null会返回”object“。
- null == undefined会返回true,这是因为==操作符处于比较的目的会转换其操作数。
- 区分null和undefined,显示地初始化变量为undefined,保存对象的变量在没有真正保存对象时,明确该变量保存null值。
- Boolean类型仅两个字面值:true和false,true不一定等于1,false不一定等于0。
- 各种数据类型与Boolean类型的转换规则
数据类型 |
转换为true的值 |
转换为false的值 |
Boolean |
true |
False |
String |
任何非空字符串 |
“”(空字符串) |
Number |
任何非零数字值(包括无穷大) |
0和NaN |
Object |
任何对象 |
null |
Undefined |
n/a(不适用) |
undefined |
- Number类型使用IEEE754格式来表示整数和浮点数值。八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。
- 保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会尽可能地将浮点数转换为整数值。可以用isFinite( )函数判断一个数值是不是有穷的。ECMAScript的最小数值为Number.MIN_VALUE=5e-324,最大数值为Number.MAX_VALUE=1.797693134623157e+308。
- NaN,即非数值( Not a Number),是一个特殊的数值,用于表示一个本来要返回数值的操作数为返回数值的情况。任何数值除以0都会返回NaN,且在ECMAScript中不会影响其他代码的执行。
- NaN两大特点:任何涉及NaN的操作,都会返回NaN;NaN与任何数值都不相等,包括NaN本身。
- IsNaN( )函数用来判断接收的参数是否“不是数值”。
- 有3个函数可以把非数值转换为数值:Number( )、parseInt( )和parseFloat( )
- Number( )函数可以用于任何数据类型转换。其转换规则如下:
如果是Boolean值,true和false将分别被转换为1和0;
如果是数字值,知识简单的传入和返回;
如果是null值,返回0;
如果是undefined,返回NaN。
- 字符串的转换规则如下:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值(前导的零被忽略);
如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(前导的零被忽略);
如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;
如果字符串是空的(不包含任何字符),则将其转换为0;
如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
- 如果是对象,则调用对象的valueOf( )方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString( )方法,然后再次依照前面的规则转换返回的字符串值。
- 如果第一个字符不是数字字符或者符号,parseInt( )函数就会返回NaN。转换时最好指明基数,例如var num1 = parseInt(“10”,2); //输出结果是2。
- parseFloat( )与parseInt( )的两个区别:字符串中的第一个小数点对parseFloat( )是有效的,对parseInt( )是无效的;parseFloat( )始终会忽略前导的零,即其只能解析十进制值,没有用第二个参数指定基数的用法。特例:parseFloat(“1234.00”)=1234,参数没有小数点或者小数点后都是零,返回整数。
- String类型用于表示由零或多个16为Unicode字符组成的字符序列,由单引号(’)或双引号(”)表示。
- 字符字面量
字面量 |
含义 |
\n |
换行 |
\t |
指标 |
\b |
退格 |
\r |
回车 |
\f |
进纸 |
\\ |
斜杠 |
\’ |
单引号(’),在用单引号表示的字符串中使用,例如:’He said,\’hey.\’ ’ |
\” |
双引号(“),在用双引号表示的字符串中使用,例如:”He said,\”hey.\” ” |
\xnn |
以十六进制代码nn表示一个字符(其中n为0~F)。例如,\x41表示”A” |
\unnn |
以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。 |
- 把一个值转换为一个字符串有两种方式:toString( )方式,数值、布尔值、对象和字符串值均可,但null和undefined无此方法。toString( )方法可设置转换基数。
- 在不确定要转换的值是不是null或undefined的情况下,还可以使用转型函数String( ),此方式能将任意类型的值转换为字符串,其遵守以下转换规则:
如果值有toString( )方法,则调用该方法(没有参数)并返回相应的结果;
如果值是null,则返回”null”;
如果值是undefined,则返回”undefined”。
- 在ECMAScript中,Object类型是所有它的实例的基础,即Object类型所具有的任何属性和方法也同样存在于更具体的对象中。存在以下属性和方法:
Constructor:保存着用于创建当前对象的函数。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在,其中,属性名必须以字符串的形式指定,例如o.hasOwnProperty(“name”)。
isPrototypeOf(object):用于检查对象是否是传入对象的原型。
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
toLoacleString( ):返回对象的字符串表示,该字符串与执行环境的地区对应。
toString( ):返回对象的字符串表示。
valueOf( ):返回对象的字符串、数值或布尔值表示。通常与toString( )方法的返回值相同。
- 只能操作一个值的操作符叫做一元操作符,包括递增(++)和递减(--)操作符,均可前置和后置。这些操作符在应用与非整数类型时,遵守以下规则:
在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
在应用于一个不包含有效数字字符的字符串时,将变量的值设为NaN,字符串变量变为数值变量。
在应用于布尔值false时,先将其转换为0再执行加减1的操作,布尔值变量变为数值变量。
在应用于布尔值true时,先将其转换为1再执行加减1的操作,布尔值变量变成数值变量。
在应用于浮点数值时,执行加减1的操作。
在应用于对象时,先调用对象的valueOf( )方法,以取得一个可供操作的值,然后对该值应用前述规则,如果结果是NaN,则再调用toString( )方法后应用前述规则。对象变量变成数值变量。
- 一元加操作符以一个加号(+)表示,放在数值前面,不会对数值产生任何影响,但对非数值应用一元加操作符时,该操作符会像Number( )转型函数一样对这个值进行转换。
- 一元减操作符以一个减号(-)表示,放在数值前面,该值变成负数,当应用于非数值时,一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数。
- 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。对于有符号的整数,32位中的前31为用于表示整数的值,第32位用于表示数值的符号:0表示正数,1表示负数。求负数的话,使用二进制补码,即首先求出对应正数的二进制码,然后求其二进制反码,最后二进制反码加1。注意:在处理有符号正数时,是不能访问位31(即符号位,从0开始)的。
- 对于无符号正数而言,第32位不再表示符号,因此无符号数只能是正数,且无符号整数的值可以更大,因为多出的一位不再表示符号,可以用来表示数值。
- 按位非(NOT)操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。按位非的本质是:操作数的负值减1。
- 按位与(AND)操作符由一个和号字符(&)表示,按位与操作只在两个数值的对应为都是1时才返回1,任何一位是0,结果都是0。
- 按位或(OR)操作符由一个竖线符号(|)表示,按位或操作在有一个位是1的情况下就返回1,而只是在两个位都是0的情况下才返回0。
- 按位异或(XOR)操作符由一个插入符号(^)表示,此操作在两个数值对应位上只有一个1时才返回1,如果对应的两位都是1或都是0,则返回0。
- 左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。左移不会影响操作数的符号位,且以0来填充右边空位。
- 有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位,此时,左侧空位会用符号位的值来填充所有空位。
- 无符号右移操作符由三个3个大于号(>>>)表示,此操作符会将数值的所有32位都向右移动,对正数而言,此方法同有符号位右移,但对负数而言,无符号右移是0来填充空位。且无符号右移会将负数的二进制码当成正数的二进制码,以致结果很大。
- 逻辑非操作符由一个叹号(!)表示,可用于ECMAScript中的任何值。逻辑非操作符遵循下列规则:
如果操作数是一个对象,返回false;
如果操作数是一个空字符串,返回true;
如果操作数是一个非空字符串,返回false;
如果操作数是数值0,返回true;
如果操作数是任意非0数值(包括Infinity),返回false;
如果操作数是null,返回true;
如果操作数是NaN,返回true;
如果操作数是undefined,返回true。
- 同时使用两个逻辑非操作符,即模拟了Boolean( )转型函数的行为。
- 逻辑与操作符由两个和号(&&)表示,可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值,此时,它遵循以下规则:
如果第一个操作数是对象,则返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
如果两个操作数都是对象,则返回第二个操作数;
如果有一个操作数是null,则返回null;
如果有一个操作数是NaN,则返回NaN;
如果有一个操作数是undefined,则返回undefined。
逻辑与是短路操作,即如果第一个操作数能够决定结果,则不会对第二个操作数求值。
- 逻辑或操作符由两个竖线符号(||)表示,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值,此时,其遵循以下规则:
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果是false,则返回第二个操作数;
如果两个操作数都是对象,则返回第一个操作数;
如果两个操作数都是null,则返回null;
如果两个操作数都是NaN,则返回NaN;
如果两个操作数都是undefined,则返回undefined。
逻辑或也是短路操作。可利用逻辑或的这一行为来避免为变量赋null或undefined值。
- 乘法操作符由一个星号(*)表示,用于计算两个数值的乘积。在处理特殊值的情况下,乘法操作符遵循以下规则:
如果操作数都是数值,执行常规的乘法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
如果有一个操作数是NaN,则结果是NaN;
如果是Inifinity与0相乘,则结果是NaN;
如果是Inifinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
如果有一个操作数不是数值,则在后台调用Number( )将其转换为数值,然后再应用上面的规则。
- 除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算,其对特殊值处理的规则如下:
如果操作数都是数值,执行常规的除法计算,如果商超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
如果有一个操作数是NaN,则结果是NaN;
如果是Infinity被Infinity除,则结果是NaN;
如果是零被领出,则结果是NaN;
如果是非零的有限数被零除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
如果是Infinity被任何非零数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号。
如果有一个操作数不是数值,则在后台调用Number( )将其转换为数值,然后再应用之前的规则。
- 求模(余数)操作符由一个百分号(%)表示,对特殊值的处理规则如下:
如果操作数都是数值,执行常规的除法计算,返回除得的余数;
如果被除数是无穷大值而除数是有限大的数值,则结果返回NaN;
如果被除数是有限大的数值而除数是零,则结果是NaN;
如果是Infinity被Infinity除,则结果是NaN;
如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
如果被除数是零,则结果是零;
如果有一个操作数不是数值,则在后台调用Number( )将其转换为数值,再应用以上规则。
- 加法操作符(+),如果两个操作数都是数值,执行常规的加法计算,然后根据以下规则返回结果:
如果有一个操作数是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”。
- 减法操作符(-)在处理各种该数据类型转换时,遵守的特殊规则如下:
如果两个操作符都是数值,则执行常规的算术减法操作并返回结果;
如果有一个操作数是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( )方法并将得到的字符串转换为数值。
- 关系比较符有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。规则如下:
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
如果一个操作数是数值,则将另一个操作数转换为数值,然后执行数值比较;
如果一个操作数是对象,则调用这个对象的valueOf( )方法,用得到的结果按照前面的规则比较,若无valueOf( )方法,则用toString( )方法,同上。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
注意:任何操作数与NaN进行关系比较,结果都是false。
- 相等(==)和(!=),会先转换操作数,然后再比较它们的相等性。
转换不同的数据类型是,规则如下:
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1;
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf( )方法,用得到的基本类型值按照前面的规则进行比较。
两个操作符在进行比较时则要遵循下列规则:
null和undefined是相等的。
要比较相等性之前,不能将null和undefined转换为其他任何值。
如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。即使两个操作数都是NaN,相等操作符也返回false。
如果两个操作数都是对象,则比较它们是不是同一个对象,如果都指向同一个对象,则相等操作符返回true,否则,返回false。
- 全等(===)和不全等(!==),仅在比较之前不转换操作数,其他方面与相等和不相等操作符没区别。注意:null==undefined会返回true,但null===undefined会返回false。因为他们是不同类型的值。
- 条件操作符与Java语法相同。 Variable = a ? b:c;
- 简单的赋值操作符由等于号(=)表示,即把右侧的值付给左侧的变量。
- 复杂赋值操作符主要有:
乘/赋值 (*=);
除/赋值 (/=);
模/赋值 (%=);
加/赋值 (+=);
减/赋值 (-=);
左移/赋值 (<<=);
有符号右移/赋值 (>>=);
无符号右移/赋值 (>>>=)。
- 逗号操作符用于声明多个变量,在用于赋值时,逗号操作符总会返回表达式中的最后一项,如var num =(5,4,3,2,1) //num=1.
- if语句的语法是: if (condition) statement1 else statement2
- do-while语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。在对条件表达式求值之前,循环体内的代码至少会被执行一次。
- while语句属于前测试循环语句,在循环贴内的代码被执行之前,就会对出口条件求值,因此,循环体内的代码有可能用于不会被执行。
- for语句也是一直前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。在循环内部定义的变量也可以在外部访问到。
- for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。语法如下:
for (property in expression) statement
在使用for-in循环之前,先检测确认该对象的值不是null或undefined。
- 使用label语句可以在代码中添加标签,以便将来使用。语法为:
Label : statement
加标签的语句一般都要与for语句等循环语句配合使用。
- break 和continue语句用于在循环中精确地控制代码的执行,其中,break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。
- break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。应用于循环嵌套的情况。
- with语句的作用是将代码的作用域设置到一个特定的对象中。语法如下:
with (expression) statement
严格模式下,不允许使用with语句,否则将视为语法错误。大量使用with语句会导致性能下降,也会给调试代码造成困难,不建议在大型应用程序中使用。
- switch语句,可以使用任何数据类型,其次每个case的值不一定是常量,可以是变量,甚至是表达式。Switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。
- 任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值,位于return语句之后的任何代码都永远不糊执行。
- 严格模式对函数有一些限制:
不能把函数命名为eval或arguments;
不能把参数命名为eval或arguments;
不能出现两个命名参数同名的情况。
否则会导致语法错误,代码无法执行。
- ECMAScript中的参数在函数内部用一个数组表示,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。arguments对象只是与数组类似,它并不是Array的实例,可使用方括号语法来访问它的每一个元素,用length属性来确定传递进来多少个参数。因此,命名参数只提供便利,但不是必需的。且arguments对象可以与命名参数一起使用。且arguments的值用于与对应命名参数的值保持同步(在ECMAScript 5中无效)。
- 由于不存在函数签名的特性,ECMAScript函数没有重载,即定义了两个名字相同的函数,则该名字只属于后定义的函数。