1.1 语法
1.1.1 区分大小写
ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
1.1.2 标识符
所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。
- 第一个字符必须是一个字母、下划线(_)或一个美元字符($)
- 其他字符可以是字母、下划线、美元符号或数字
** 最佳实践:标识符采用驼峰大小写格式(即第一个字母小写,剩下的每个单词的首字母大写) **
1.2 变量
var
操作符定义的变量将成为定义该变量的作用域中的局部变量。不过,假如省略var
操作符,将会创建一个全局变量。
1.3 数据类型
ECMAScript中有5种简单数据类型:
- Undefined
- Null
- Boolean
- Number
- String
1.3.1 typeof 操作符
- "undefined"——如果这个值未定义;
- "boolean"——如果这个值是布尔值;
- "string"——如果这个值是字符串;
- "number"——如果这个值是数值;
- "object"——如果这个值是对象或null;
- "function"——如果这个值是函数。
** 注意:typeof 是一个操作符而不是函数,因此圆括号不是必须的。 **
1.3.2 Undefined 类型
Undefined类型只有一个值,即特殊的undefined
。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined
。
对于尚未声明的变量,只能执行一项操作,即使用typeof
操作符检测器数据类型。然而,令人困惑的是:对未初始化的变量执行typeof
操作符同样也会返回undefined
值。
1.3.3 Null 类型
Null类型也是只有一个值,这个特殊的值是null
。从逻辑的角度讲,null
值表示一个空对象指针,而这也是使用typeof
操作符检测null
值会返回"object"的原因。如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null
而不是其他值。
1.3.4 Boolean 类型
该类型只有两个字面值:true
和false
。ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。下表给出了各种数据类型及其对应的转换规则。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数字值(包括无穷大) | 0和NAN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
1.3.5 Number 类型
除了以十进制表示外,整数还可以通过八进制或十六进制的字面值表示。其中,八进制字面值的第一位必须是0,然后是八进制数字序列(0~7)。如果字面值中的数值超过范围,前导零将被忽略,后面的数值将被当作十进制数值解析。注意:八进制字面量在严格模式下是无效的。
十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母A~F可以大写,也可以小写。
1. 浮点数值
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会适时地将浮点数值转换为整数值。如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样地,如果浮点数值本身就是一个整数(如1.0),那么该数值也会被转换为整数。
对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数表示。用e表示法表示的数值等于e前面的数值乘以10的指数次幂。注意:由于浮点数值计算有精度误差,因此永远不要测试某个特定的浮点数值。
2. 数值范围
ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,能够表示的最大数值保存在Number.MAX_VALUE中。如果某次计算的结果得到一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。
3. NaN
NaN,即非数值(Not a Number)。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,例如,0除以0会返回NaN。
NaN本身有两个非同寻常的特点:
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等
针对这两个特点,ECMAScript定义了isNaN()函数。该函数接收一个值之后,会尝试将这个值转换为数值,而任何不能被转换为数值的值都会导致这个函数返回true。请看下面例子:
alert(isNaN(NaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false
alert(isNaN("0isfalse")); // true
alert(isNaN(true)); // false
4. 数值变换
有三个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数可以用于任何数据类型,而另两个函数则专门可用于把字符串转换为数值。
Number()函数的转换规则如下:
- 如果是Boolean值,true和false将被分别转换为1和0。
- 如果是数字值,只是简单的传入和返回。
- 如果是null值,返回零。
- 如果是undefined,返回NaN。
- 如果是字符串,遵循下列规则:
- 如果字符串中只包含数字(包含前面带正号或负号的情况),则将其转换为十进制数值,即"1"会变成1,而"011"会变成11(注意:前导的零被忽略了)
- 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零)
- 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值
- 如果字符串是空的(不包含任何字符),则将其转换为0
- 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
- 如果是对象,则调用valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
parseInt()函数的转换规则如下:
该函数会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者正负号,parseInt()就会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
如果字符串以"0x"开头且后跟数字字符,就会将其当作一个十六进制整数。但是在ECMAScript 5 JavaScript引擎中,parseInt()已经不具有解析八进制值的能力,因此前导的零会被认为无效。
为了消除在使用parseInt()函数可能导致的疑惑,可以为这个函数提供第二个参数:转换时使用的基数。** 注意:为了避免错误的解析,建议无论在什么情况下都明确指定基数。**
parseFloat()函数的转换规则如下:
parseFloat()函数也是从第一个字符开始解析直至遇到第一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了。parseFloat()函数始终都会忽略前导的零。同时,该函数只解析十进制值,因此它没有用第二个参数指定基数的用法。最后还要注意的是,如果字符串包含的是一个可解析为整数的数,那么将会返回整数。
1.3.6 String类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。
字符串可以由双引号(")或单引号(')表示。
1. 字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列。
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
' | 单引号 |
" | 双引号 |
\xnn | 以十六进制代码nn表示的一个字符 |
\unnnn | 以十六进制代码nnnn表示的一个Unicode 字符 |
这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解释。任何字符串的长度都可以通过访问其length属性取得。
2. 字符串的特点
ECMAScript中的字符串是不可变的,也就是说,字符一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,例如:
var lang = "Java";
lang = lang + "Script";
以上示例中的变量lang开始时包含字符串"Java"。而第二行代码把lang的值重新定义为"Java"与"Script"的结合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10个字符的字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",这个过程是在后台发生的。
3.转换为字符串
要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。数值、布尔值、对象和字符串值(每个字符串值也都有一个toString()方法。但null和undefined值没有这个方法。)
在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。默认情况下,toString()方法以十进制格式返回数值的字符串表示。而通过传递参数,toString()可以输出任意有效进制格式表示的字符串值。
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:
- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
- 如果值是null,则返回"null"
- 如果值是undefined,则返回"undefined"
** 要把某个值转换为字符串,可以使用加号操作符把它与一个字符串("")加在一起。**
3.4.7 Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象,如下图所示:
var o = new Object();
在ECMAScript中,有一个重要的思想必须理解:**Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法:
- constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()。
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。