标识符
指 变量、函数、属性的名字,或者 函数的参数,可以是按下列规则组合起来的 一个或多个字符:
- 首字符 为字母、下划线(_)或 美元符号($);
- 其他字符可以是 字母、下划线、美元符号 或 数字;
- 采用 驼峰大小写 格式。
注意:
不能把 关键字、保留字、true、false、null 用作标识符。
关键字:
break, case, catch, continue, debugger, default, delete, do, else, finally, for, function, if, in, instanceof, new, return, switch, this, throw, try, typeof, var, void, while, with
保留字:
abstract, boolean, byte, char, class, const, debugger, double, enum, export, extends, final, float, goto, implements, import, int, interface, long, native, package, private, protected, public, short, static, super, synchronized, throws, transient, volatile
注释
单行注释:
// 单行注释
块级注释:
/*
* 多行(块级)注释
*/
变量
ECMAScript 的变量是松散类型的,可以用来保存 任何类型 的数据。定义变量时,使用 var 操作符,此时定义的变量是 定义该变量的作用域 中的 局部变量。省略 var 操作符可以定义全局变量。
var message; // 未经初始化的变量,值为 undefined
var message = 'hi';
数据类型
ECMAScript 有 5 种基本数据类型(分别为 Undefined、Null、Boolean、Number 和 String)和 1 种复杂数据类型(Object 类型),不支持任何创建自定义类型的机制。
Undefined 类型
仅有一个值 undefined。未经初始化的变量 值为 undefined。一般而言,不需要显式地把一个变量设置为 undefined。
Null 类型
仅有一个值 null,表示一个 空对象指针。意在保存对象的变量,建议初始化为 null。
Boolean 类型
有两个字面值:true 和 false。可以对任何数据类型的值调用 Boolean() 函数,且总会返回一个 Boolean() 值。在 流控制语句(如 if 语句)中,会 自动执行 相应的 Boolean 转换。
各种数据类型对应的 转换规则 如下:
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” (空字符串) |
Number | 任何非零数字值(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | —— | undefined |
Number 类型
Number 类型采用 IEEE-754 格式表示 整数和浮点数值。其中,整数 数值字面量格式可以是 八进制、十进制、十六进制,但在进行算术计算时,统一使用十进制数值。另外,由于 浮点数值 所需内存空间是保存整数的两倍,因此,在下列情况下,数值会作为整数值来保存:
- 小数点后没有跟任何数字
- 浮点数值本身表示的就是一个整数
对于 极大 或 极小(小数点后有6个以上的0) 的数值,可使用 e表示法 表示。
其中,转型函数 Number() 的转换规则 如下:
- Boolean 值 true 和 false 分别返回 1 和 0;
- 数字值 只是简单的传入和返回;
- null 值返回 0;
- undefined 值返回 NaN;
- 对于 字符串:
1. 只包含 数字,则将其转换为 十进制数;
2. 包含 有效的浮点格式,则转换为对应的 浮点数值;
3. 包含 有效的十六进制格式,则转换为相同大小的十进制整数;
4. 空字符串 转换为 0;
5. 包含除上述格式之外的字符,转换为 NaN; - 对于 对象,先调用 valueOf() 并转换,若转换结果为 NaN,再调用 toString() 方法并进行转换。
在处理 整数 时,我们常用 parseInt() 函数,对于字符串,其 转换规则 如下:
- 从 第一个非空格字符 开始转换(始终忽略前导零);
- 若第一个字符不是 数字字符 或 负号,则返回 NaN(即 parseInt() 对空字符串返回 NaN);
- 解析过程 直到完成所有后续字符 或 遇到非数字字符;
- 为避免转换过程中,由整数的进制问题导致错误,建议使用时在 parseInt() 的第二个参数中 明确指定基数。
对于 parseFloat() 函数,转换规则与 parseInt() 类似,不同点如下:
- 字符串中 第一个小数点 有效;
- 只解析 十进制值;
- 若字符串包含的是可解析为整数的数,则返回整数。
String 类型
String 类型用于表示由零或多个 16位 Unicode字符 组成的字符序列,即字符串。
对于 转型函数 toString() ,可用于 数值、布尔值、对象和字符串值,其中,在调用数值的 toString() 方法时,可传递一个参数:输出数值的基数(默认十进制)。
由于 null 和 undefined 值没有 toString() 方法,在不确定要转换的值是否为 null 或 undefined 时,可使用 转型函数 String(),该函数可将任何类型的值转换为字符串,转换规则 如下:
- 该值有 toString() 方法,则调用该方法并返回相应结果;
- 值为 null,则返回 “null”;
- 值为 undefined,则返回 “undefined”。
Object 类型
ECMAScript 中的对象 其实就是一组数据和功能的集合。Object 类型是所有它的实例的基础。Object 的每个实例 都具有下列属性和方法:
- constructor:保存着 用于创建当前对象的函数;
- hasOwnProperty( propertyName ):用于检查 给定的属性 在当前对象实例中是否存在,propertyName 为字符串格式;
- isPrototypeOf( object ):用于检查 传入的对象是否是当前对象的原型;
- propertyIsEnumerable( propertyName ): 用于检查 给定的属性是否可使用 for-in 语句;
- toLocaleString() :返回对象的 字符串表示,该字符串与执行环境的地区对应;
- toString() :返回对象的 字符串表示;
- valueOf() :返回对象的 字符串、数值 或 布尔值 表示。
typeof 操作符
typeof 操作符用于检测 给定变量的数据类型,对一个值使用 typeof 操作符可能返回下列某个字符串:
- "undefined" —— 值 未定义,或 变量未初始化;
- "boolean" —— 值是 布尔值;
- "string" —— 值是 字符串;
- "number" —— 值为 数值;
- "object" —— 值为 对象 或 null;
- "function" —— 值为 函数。
操作符
ECMAScript 规定的操作符有以下 10 种:
- 一元操作符:
- 位操作符:
- 布尔操作符:
- 乘性操作符:
- 加性操作符:
- 关系操作符:
- 相等操作符:
- 条件操作符:
条件操作符 语法如下:
value = boolean_expression ? true_value : false_value ;
- 赋值操作符:
- 逗号操作符:
逗号操作符 多用于:
- 声明多个变量;
- 赋值(返回表达式中最后一项)
流控制语句
EXMAScript 规定的语句有以下几种:
if 语句
if (condition) statement1 else statement2
if (condition1) {
// statement1
} else if (condition2) {
// statement2
} else {
// statement3
}
do-while 语句
循环体内的代码至少会被执行一次(后测试循环语句)。
do {
// statement
} while (expression);
while 语句
循环体内的代码有可能永远不会被执行(前测试语句)。
while (expression) statement
for 语句
前测试循环语句。
for (initialization; expression; post-loop-expression) {
// statement
}
for-in 语句
for-in 语句用来 枚举对象的属性。通过 for-in 循环输出的属性名的顺序是不可预测的。另外,建议在使用 for-in 循环之前,先检测确认该对象的值 不是 null 或 undefined。
for (property in expression) {
// statement
}
label 语句
使用 label 语句可以在代码中添加标签。加标签的语句一般与 for 语句、break 和 continue 语句等联合使用,从而在执行中返回 代码特定位置(这种联合使用 多发生在 嵌套循环 的情况下)。
如果使用 label 语句,一定要使用描述性的标签,同时不要嵌套过多的循环。
label: statement
with 语句
with 语句用于将代码的作用域设置到一个特定的对象中,以简化多次编写同一个对象的工作。【不建议使用】
代码示例如下:
with(location) {
var qs = search.substring(1); // 即 location.search.substring
var hostName = hostname;
var url = href;
}
switch 语句
当有多个判别条件时,可以使用 switch 语句。在 switch 语句中可以使用任何数据类型,每个 case 的值也可以是 常量、变量或表达式。需要注意的是,switch 语句在比较值时,使用的是 全等操作符。
switch (expression) {
case value: statement
break;
case value: statement
break;
default: statement
}
函数
函数的基本语法如下:
function functionName (arg0, arg1, ..., argN) {
statements
}
关于 return 语句:
- 任何函数 在任何时候 都可通过 return语句后跟要返回的值 来实现返回值;
- 函数在定义时不必指定是否返回值(未指定返回值的函数,返回 undefined);
- return 语句也可以不带任何返回值;
- 函数体内 return 语句后的语句不再执行;
- 要么让函数 始终都返回一个值,要么 永远都不要返回值【推荐做法】
关于 函数参数:
- ECMAScript 中的参数在内部使用一个 数组 来表示的(也就是说,函数参数 可以有任意个,也可以是任何数据类型);
- 在函数体内可通过 arguments 对象 来访问该函数的参数数组,从而获取传递给函数的每一个参数;
- 命名的参数只提供便利,但不是必须的。解析器不会验证命名参数;
- 通过访问 arguments 对象的 length 属性,可获知有多少个参数传递给了函数(也就是说,arguments 对象的长度,由传入的参数个数决定,而非定义函数时的命名参数个数);
- arguments 对象 可以与 命名参数 一起使用。其中,arguments 对象的值永远与对应的命名参数保持同步(内存空间相独立,但 值同步);
- 没传递值的命名参数,将自动被赋予 undefined 值;
- 参数传递的是 值,不可能通过 引用 传递参数。
关于 函数重载:
- 由于不存在 函数签名(参数类型和数量) 的概念,ECMAScript函数不能重载;
- 通过检查传入函数中的 参数的类型和数量 并作出不同的反映,可以模仿方法的重载。
更多内容,欢迎访问 FU的博客