语法
区分大小写
ECMAScript中的一切都区分大小写。
标识符
标识符指变量、函数、属性、参数的名字,有如下规则:
- 第一个字符必须是字母、下划线或$
- 其他字符可以是字母、下划线、$ 或数字
- 不能把关键字、保留字、
true
、false
、null
用作标识符
标识符中的字符可以是扩展的ASCII或Unicode字符,但不推荐
按照惯例,标识符采用驼峰大小写格式
注释
两个斜杠//
开头表示行级注释
以/*
开头,以*/
结尾的表示块级注释
严格模式
在脚本顶部或函数内第一行添加如下代码开启严格模式:
"use strict;"
语句
ECMAScript语句以分号结尾,可以省略,但不推荐,添加分号不仅可以降低压缩代码时出错的概率,也可以提升性能(解析器不用花时间判断哪里需要分号)
关键字和保留字
保留字在ECMAScript中没有任何特定用途,但将来可能被用作关键字。
以下是ECMAScript全部的关键字,标注星号的是ECMAScript 5提出来的:
以下是全部保留字:
变量
ECMAScript中的变量是松散型的,可以保存任何类型的数据。
var name;
在当前作用域中定义了一个名为name
的局部变量,也可以在定义时顺便赋值var name = 'Sue';
,但这样并不会给name
标注成字符串类型的变量。
如果我们给一个未定义的变量赋值,非严格模式下,我们会创建一个全局变量,严格模式下,会抛出ReferenceError
。
可以使用一条语句定义多个变量:
var name = 'Sue',
age = '24';
数据类型
ECMAScript中有5中基本数据类型:Number Boolean String Null Undefined,一种复杂数据类型:Object,所有值都是这6种类型之一。
typeof
由于ECMAScript变量是松散的,因此需要一种手段来告诉我们变量存储的值的类型,于是就有了typeof,typeof操作符可以返回如下结果:
-
"undefined"
:值未定义 -
"boolean"
:布尔值 -
"string"
:字符串 -
"object"
:对象或null
-
"number"
:数值 -
"function"
:函数
typeof
操作符的操作数可以是变量也可以是数值字面量。
有几个地方可能会让人迷惑:
-
typeof null
时返回"object"
,这是因为null
被认为是空对象的引用 - Safari5及之前版本、Chrome7及之前版本,
typeof /^d$/
返回"function"
,其他浏览器返回"object"
-
function
属于object
却被区别对待,这是因为function
比较特殊,有必要去识别它
Undefined
类型
Undefined
类型只有一个值undefined
,声明时未被赋值的变量会为其赋予undefined
,最初设计这个类型是为了区分空指针和未初始化变量,因此不存在需要为一个变量显式地赋予undefined
值的情况。
对未初始化和未声明的变量调用typeof
都会返回undefined
,这是由于这两种都不可能执行真正的操作,但为了使typeof
能够反应一个变量是否被声明,我们最好在定义一个变量时为它赋值。
Null
类型
Null
类型只有一个值null
,它是一个空指针对象,undefined
派生自null
,因此:
undefined == null; //true
前面提到过,不存在需要为一个变量显式地赋值undefined
的情况,但我们如果声明了一个将来要保存对象类型的变量,我们最好在这个变量被定义时给它赋予null
,
Boolean
类型
Boolean
类型只有两个值true
false
,可以对任何数据类型调用Boolean()
,返回结果是true
or false
数据类型 | 转化为true 的值 |
转化为false 的值 |
---|---|---|
Boolean | true |
false |
String | 任何非空字符串 | 空字符串""
|
Number | 任何非0数值 | 0和NaN
|
Object | 任何非空对象 | 空对象null
|
Undefined | N/A | undefined |
Number类型
Number类型使用IEEE754表示整数和浮点数
整数
- 十进制整数
var num = 55;
- 八进制整数,第一位必须是0,然后是0~7,如果超出范围,前导0会被忽略,后面的数值当做十进制整数解析。严格模式下八进制无效,会抛出错误。
var num1 = 070; // 7*8 + 0 = 56
var num2 = 079: // 79
- 十六进制整数,前两位是0x,后面跟0 ~ 9和A~F(or a~f),如果超出范围,会抛出错误。
var num = 0x15a; //1*16*16 + 5*16 + 10 = 346
在进行算术计算时,八进制和十六进制都会转化为十进制:
var num1 = 10;
var num2 = 071;
var num3 = 0x56A;
num1 + num2; //67
num2 + num2; //114
num2 + num3; // 1553
num3 + num3; //2772
浮点数
浮点数值即数值中包含小数点,且小数点后必须有至少以为数字,注意小数点前可以没有数字,但不推荐。
由于保存浮点数需要的空间是整数的两倍,因此如果可以,ECMAScript会将浮点数保存为整数,比如:
var num1 = 1.0; // 1
var num2 = 1.; // 1
对于极大或极小的数值,可以用科学技术法表示(e或E):
var num = 2.34e6; //2.34 * Math.pow(10, 6)
在进行算术运算时,浮点数的精度远远不如整数,会有舍入误差,比如:
0.1 + 0.2 // 0.30000000000000004
所以永远不要测定某个浮点数值
数值范围
由于内存的限制,ECMAScript 并不能保存世界上所有的数值。ECMAScript 能够表示的最小数值保存在Number.MIN_VALUE 中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE 中——在大多数浏览器中,这个值1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的Infinity 值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。
以上引用了原文中的一段话,笔者亲自试验发现不是这样,在chrome 63.0.3239.132和Microsoft Edge中打开调试工具,做了如下运算:
Number.MAX_VALUE + 1; // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 291); // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 292); // Infinity
关于Number.MIN_VALUE
说的也不是很准确,准确来说,这个变量保存了最小的大于零的数值
NaN
NaN
, Not a Number,用于表示非数值。
- 0 / 0 =
NaN
- 任何涉及
NaN
的运算都会返回NaN
-
NaN
与任何数值包括NaN
都不相等
可以通过isNaN()
来判断任何数据类型是否是非数值,isNaN()
在接收到一个参数后,如果它是基本数据类型,会尝试将其转化为数值,如果它是object
,会先调用它的valueof()
,再确定返回值是否能转化成数值,如果不能,则基于返回值调用toString()
,然后再尝试转化成数值。
isNaN(NaN); // true
isNaN(10); // false
isNaN("10"); // false
isNaN("blue"); // true
isNaN(true); // false
isNaN([1, 2]); // true, [1, 2].valueof()返回[1, 2], [1, 2].toString() 返回 "1, 2"
isNaN([1]): // false, [1].valueof()返回[1], [1].toString() 返回 "1"
数值转换
Number()
数据类型 | 值 |
---|---|
Boolean |
true 为1, false 为0 |
Number | 输入即输出 |
Null | 0 |
Undefined | 0 |
可以用于任何数据类型, 规则如下:
数据类型 | 值 |
---|---|
Boolean |
true 为1, false 为0 |
Number | 输入即输出 |
Null | 0 |
Undefined | 0 |
String
类型比较负责,规则如下:
- 如果只包含数字,包括前面带正负号的情况,将其转化为数字(前导0被忽略)
- 如果包含有效的十六进制格式,将其转化为十进制
- 如果包含有效的浮点格式,将其转化为浮点数值
- 空字符串转化为0
- 如果以上情况均不满足,转化为
NaN
举一些例子:
Number(true); // 1
Number(false); //0
Number(null); // 0
Number(undefined); //0
Number(3); // 3
Number(""); //0
Number("05"); // 5 不会把它当做八进制
Number("5.21"); //5.21
Number("0x43A"); // 1082
Number("num"); // NaN
parseInt()
parseInt()
接收字符串参数,有如下规则:
- 会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个非空格字符不是数字或正负号,那么返回
NaN
- 如果第一个非空格字符是数字,那么继续解析下一个字符,直至遇到不是数字的字符或者解析完后续所有字符,注意小数点并不是有效的数字字符
- 可以识别十进制,八进制,十六进制,ECMAScript 5中,需要为其传入第二个参数指明进制,才可以识别八进制。在指明进制的情况下八进制可以不带前导0,十六进制可以不带0x。
举一些例子:
parseInt(""); //NaN
parseInt(".23); //NaN
parseInt("23.4"); //23
parseInt("23abc"); //23
parseInt("+23"); //23
parseInt("-23"); //-23
parseInt("070"); //70, ECMAScript
parseInt("0x7A"); //122
parseInt("070", 8); //56
parseInt("7A", 16); //122
parseFloat()
parseFloat() 与 parseInt() 很类似,有两点区别:
- parseFloat() 字符串第一个小数点是有效的,第二个是无效的,后面的也不会解析
- parseFloat() 不能识别八进制和十六进制,符合八进制的字符串会忽略前导0,符合十六进制的字符串会被解析为0
- parseFloat() 可以识别科学计数法
举一些例子:
parseFloat("23.24.5"); //23.24
parseFloat("3.4e5"); //340000
parseFloat("0x8A"); //0
parseFloat("045"); //45
String类型
有0或多个16位Unicode字符字符组成的字符序列,即字符串,可由单引号或双引号表示。
转义序列
表示非打印或有其他用途的字符
转义序列 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\ | 斜杠 |
' | 用于在单引号表示的字符串中显示单引号 |
" | 用于在双引号表示的字符串中显示双引号 |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ |
转义序列可以出现在字符串的任何地方,作为一个字符来解析,可以通过length
属性获得字符串的长度
字符串的特点
var lang = "Java";
lang = lang + "Script";
以上示例中的变量lang 开始时包含字符串"Java"。而第二行代码把lang 的值重新定义为"Java"与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10 个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。
转化为字符串
-
toString()
Number、Boolean、Object、String都有toString()
方法,Number的toString()
可以接收 进制参数,以相应的进制格式输出。 - 由于
null
和undefined
没有toString()
方法,因此对null
orundefined
调用toString()
会报错,我们可以使用转型函数String()
,它遵循以下规则:
- 如果带
toString()
,则调用toString()
- 如果是
null
, 则返回"null" - 如果是
undefined
,则返回"undefined"
Object类型
对象就是一组数据和功能的集合,可以通过new
后跟要创建的对象类型来创建,比如:
var array = new Array(10);
如果没有参数,可省略括号。
Object
是所有它的实例的基础,每个实例都有如下属性和方法:
- constructor,是用于创建对象的函数,对于上述例子,是
Array
函数
- hasOwnProperty(propertyName) 给定的属性在当前实例而非原型中是否存在,作为参数的属性名必须是字符串
- isPrototypeOf(object) 检查object是否是实例对象的原型
- propertyIsEnumerable(propertyName) 给定的属性是否可以使用
for-in
来枚举,作为参数的属性名必须是字符串 - toLocaleString() 返回对象与执行环境相对应的字符串表示
- toString() 返回对象的字符串表示
- valueOf() 返回对象的字符串、布尔值、数值表示
ECMAScript中对象的行为不适用于DOM、BOM中的对象。
网友评论