一, 基本概念
1. 语法: ECMAScript 的语法大量借鉴了 C 及其他类 C 语言 (如 Java 和 Perl) 的语法.
2. 区分大小写: ECMAScript 中的一切变量, 函数名, 操作符都区分大小写.
3. 标识符: 标识符指的是变量, 函数, 属性, 函数参数等, 按以下规则组合:
a. 第一个字符必须是一个字母, 下划线, 或美元符号 $;
b. 其他字符可以是字母, 下划线, 美元符号或数字;
c. 按照惯例, ECMAScript 标识符采用驼峰大小写格式, 第一个字母小写, 剩下的每个有意义的单词的首字母大写;
d. 不能把关键字, 保留字, true,false,null 作为标识符;
4. 严格模式: 在脚本顶部添加 "use strict", 它作为编译指示, 告诉浏览器引擎切换到严格模式; 在函数内部的上方包含这条编译指示, 可以指定函数在严格模式下执行.
5. 语句: ECMAScript 中的语句以一个分号结尾, 如果省略, 则由解析器确定语句的结尾.
6. 变量: ECMAScript 中的变量是仅仅是一个用于保存值的占位符, 可保存任何类型的数据.
7. 数据类型: Undefined,Null,Boolean,Number,String 和一种复杂数据类型 Object.(ES6 引入了新的一种原始型数据类型 Symbol, 表示独一无二的值, 则有七种数据类型.)
二, 数据类型
1.Undefined 类型:
Undefined 类型只有一个值, 即特殊的 undefined. 在使用 var 声明变量但未对其加以初始化时, 这个变量的值就是 undefined.
2.Null 类型:
Null 类型是第二个只有一个值的数据类型, 这个特殊的值是 null.null 值表示一个空对象指针, 所有 typeof 操作符检测时会返回'object'. 如果定义的变量准备在将来用于保存对象, 那么最好将该变量初始化为 null, 而不是其他值.
注: null==undefined //true null===undefined //false
3.Boolean 类型:
该类型只有两个字面值: true 和 false;
能转化为 true 的值: true,string(非空字符串),number(任何非 0 的数字值),object(任何对象);
能转化为 false 的值: false,''(空字符),number(0 和 NaN),null,Undefined
4.Number 类型:
(1)浮点型: 数值中必须包含一个小数点, 且小数点后面必须至少有一位数字.
a. 保存浮点型数值需要的内存空间是保存整数的两倍, 因此对于小数点后面没有任
何数字, 或者浮点数本身表示的就是一个整数, 那么这些数值都会被转化为整数保
存(如 1. 或 10.0 ).
b. 对于极大或极小的数值, 可以用 e 表示法 (科学计数法) 表示, 如 3.125e7 表示
3.125 乘以 10 的 7 次方.
c. 数值范围: 由于内存限制, ECMAScript 能够表示的最小数值保存在 number.MIN_VALUE 中, 这个值是 5e-324;ECMAScript 能够表示的最大数值保存在 number.MAX_VALUE 中, 这个值是 1.7976931348623157e+308. 如果计算结果超出
JavaScript 的范围, 将自动转化为 Infinity 值, 负值为 - Infinity(负无穷), 正值 Infinity(正无穷).
d.Infinity 是不能够参与计算的, 想判断一个数值是不是又穷的可以使用 isFinite()函数, 参数位于最小值与最大值之间返回 true, 否则 false.
(2)NaN: 即非数值, 是一个特殊的数值,. 这个数值用于表示一个本来要返回数值的操作未返回数值的情况(这样不会抛出错误).
a. 任何涉及 NaN 的操作, 都会返回 NaN;NaN 与任何值都不相等, 包括 NaN 本身.
b.isNaN()接受一个参数, 判断这个参数是否 "不是数值", 任何不能转换为数值的
值都会返回 true.
(3)数值转换: Number(),parseInt(),parseFloat()这三个函数可以把非数值转换为数值.
Number()转换规则:
a. 如果是 boolean 值, true 和 false 将分别转换为 1 和 0.
b. 如果是数字值, 只是简单的传入和返回.
c. 如果是 null 值, 返回 0.
d. 如果是 undefined, 返回 NaN.
e. 如果是字符串:
e1: 如果字符串只包含数字(包括前面带正负号的情况), 则将其转换为十进制数值; 字符串前面有 0 会被忽略.
e2: 如果字符串中包含有效的浮点格式, 则将其转换为对应的浮点数值; 字符串前面有 0 会被忽略.
e3: 如果字符串中包含有效的十六进制格式, 则将其转换为相同大小的十进制整数值.
e4: 空字符串则将其转换为 0.
e5: 如果字符串中包含除上述格式以外的字符, 则将其转化为 NaN.
f: 如果是对象, 则调用对象的 valueof()方法, 然后依照前面的规则转换, 如果转换的结果是 NaN, 则调用对象的 toString()方法. 再次依照前面的规则转换.
parseInt()转换规则:
a. 忽略字符串前面的空格, 直到第一个不是数字或者负号的字符为止, 返回 NaN.(空字符返回 NaN). 如果第一个字符是数字字符, 则继续解析第二字符, 直到解析完所有后续字符或者遇到一个非数字字符.
b. 如果字符符合八进制和十六进制, 则正常解析出整数.
c. 这个函数可接受第二个参数, 表示转换时的基数(即是多少进制的), 如
var num = parseInt('0xAF',16); //175
parseFloat()转换规则:
a. 从第一个字符开始解析, 直到第一个无效的浮点数字字符位置为止.
b. 只解析十进制数值, 没有第二个参数.
5.String 类型:
String 类型由零或多个 16 位 Unicode 字符组成的字符序列, 即字符串. 字符串可以由双引号和单引号表示.
1. 转义字符(字符字面量):
String 数据类型包含一些特殊的字符字面量, 也叫转义序列, 用于表示非打印字符, 或者有其他用途的字符.
\n 换行
\t 制表
\b 空格
\r 回车
\\ 斜杠
\' 单引号
\" 双引号
\xnn 以十六进制码 nn 表示的一个字符(其中 n 为 0-F)
\unnnn 以十六进制码 nnnn 表示的一个 Unicode 字符(其中 n 为 0-F)
这些转义字符可以出现在字符串的任意位置, 而且被当做一个字符来解析, 则长度
为一.
2. 转换为字符串:
toString()方法: 返回相应值的字符串表现.
a. 除了 null 和 undefined 以外每个值都有该方法.
b. 接受一个参数, 指定转换基数, 可以输出二进制, 八进制, 十六进制的字符串. 默认输出十进制的值.
如: var num = 10;
- num.toString();//'10'
- num.toString(2);//'1010'
- num.toString(8);//'12'
- num.toString(16);//'a'
String(): 可以将任意值转为字符串.
6.Object 类型
Object 类型是所有它的实例的基础, 它所具有的任何属性和方法也同样存在于更具
体的对象中.
Object 的每个实例都具有下列属性和方法:
a. constructor: 保存用于创建当前对象的函数.
b. hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中是否存在(而不是在实例的原型中), 参数 propertyName 必须以字符串的形式指定.
c. isPropertyOf(object): 用于检查传入的对象是否是另一个对象的原型.
d. propertyIsEnumerable(propertyName): 用于检查给定的属性是否可以使用 for-in 语句来枚举, 参数 propertyName 必须以字符串的形式指定.
e. toLocaleString(): 返回对象的字符串表示, 该字符串与执行环境的地区对应.
f. toString(): 返回对象的字符串表示.
g. valueOf(): 返回对象的字符串, 数值或布尔值表示. 通常与 toString()方法的返回值相同.
三, 操作符
1. 一元操作符: 只能操作一个值的操作叫一元操作符
1.1 递增递减操作符:
++,- -, 有前置型和后置型
规则:
a. 递增与递减要与其他数值进行运算时, 前置递增和前置递减会先递增和递减后再参与运算, 后置递增和递减则先运算再执行递增和递减.
b. 应用于包含一个有效数字字符的字符串时, 先将其转换为数字值, 再执行加减 1
操作. 字符串变量变成数值变量.
c. 应用于一个不包含有效数字字符的字符串是, 将变量的值设置为 NaN. 字符串变
量变成数值变量.
d. 应用于布尔值值 true 和 false 时, 将变量转换为 1 和 0 再执行加减操作. 布尔值变量变成数值变量.
e. 应用于对象, 先调用对象的 valueOf()方法, 取得可供操作的值, 再进行操作
1.2 一元加减操作符:
执行数学加减操作. 对非数值变量时, 该操作符对变量进行像 Number()函数一样的值转换再运算.
2. 布尔操作符: 与(&&), 非(!), 或(||)
2.1 逻辑与(&&):
有两个操作数, 属于短路操作, 即如果第一个操作数能决定结果, 则不会对第二个操作数求值.
遵循以下规则:
a. 如果第一个操作数是对象, 则返回第二操作数
b. 如果第二个操作数是对象, 则只有在第一个操作数的求值结果为 true 时才返回该对象
c. 如果两个操作都是对象, 则返回第二个操作数
d. 如果有一个操作数是 null/NaN/undefined, 则返回 null/NaN/undefined
2.2 逻辑非(!):
可以应用于 ECMAScript 中的任何值, 逻辑非会先将操作数转换为布尔值, 再对其求反, 最后会返回布尔值.
遵循以下规则:
a. 操作数是对象 / 非空字符 / 非 0(包括 Infinity), 返回 false
b. 操作数是 null/NaN/undefined/0 / 空字符串, 返回 true
2.3 逻辑或(||):
有两个操作数, 属于短路操作. 即如果第一个操作数求值为 true, 则不会对第二个操作数求值.
遵循以下规则:
a. 如果第一个操作数是对象, 则返回第一个操作数
b. 如果第一个操作数的求值结果为 false, 则返回第二个操作数
c. 如果两个操作数都是对象, 则返回第一个操作数
d. 如果两个个操作数是 null/NaN/undefined, 则返回 null/NaN/undefined
3. 乘性操作符: 乘, 除, 求模. 在操作数为非数值的情况下会自动执行类型转换.
3.1 乘法:(*)
规则:
a. 如果操作数都是数值, 执行常规乘法计算. 如果乘积超过了 ECMAScript 数值的范围, 则返回正负 Infinity
b. 如果有一个操作数是 NaN, 则结果是 NaN
c. 如果是 Infinity 与 0 相乘, 则结果是 NaN
d. 如果是 Infinity 与非 0 数值相乘, 则结果是 Infinity
e. 如果是 Infinity 与 Infinity 相乘, 则结果是 Infinity
3.2 除法:(/)
规则:
a. 如果操作数都是数值, 执行常规除法计算. 如果商超过了 ECMAScript 数值的范围, 则返回正负 Infinity
b. 如果有一个操作数是 NaN, 则结果是 NaN
c. 如果是 Infinity 被 Infinity 除, 则结果是 NaN
d. 如果是 0 被 0 除, 则结果是 NaN
e. 如果是非 0 的有限数被 0 除, 则结果是正负 Infinity
f. 如果是 Infinity 被非 0 除, 则结果是正负 Infinity
3.3 求模(%): 取余数
规则:
a. 如果操作数都是数值, 执行常规除法计算, 返回除得的余数
b. 如果被除数是无穷大而除数是有限大, 则结果是 NaN
c. 如果被除数是有穷大而除数是 0, 则结果是 NaN
d. 如果是 Infinity 被 Infinity 除, 则结果是 NaN
f. 如果被除数是有限大而除数是无穷大, 则结果是被除数
e. 如果被除数是 0, 则结果是 0
4. 加性操作符:
4.1 加法:
规则:
a. 如果两个操作数都是数值, 执行常规的加法计算.
b. 如果是 Infinity 加 Infinity, 则结果是 Infinity
c. 如果是 - Infinity 加 - Infinity, 则结果是 - Infinity
d. 如果是 Infinity 加 - Infinity, 则结果是 NaN
e. 如果是 + 0 加 + 0, 则结果是 + 0
f. 如果是 - 0 加 - 0, 则结果是 - 0
g. 如果是 + 0 加 - 0, 则结果是 + 0
h. 如果两个操作数都是字符串, 则进行字符串拼接
i. 如果有一个操作数是字符串, 一个操作数是非字符串, 则调用它们的 toString()方法或 String()方法取得相应的字符串进行拼接.
4.2 减法
规则:
a. 如果两个操作数都是数值, 执行常规的减法计算
b. 如果有一个操作数是 NaN, 则结果是 NaN
c. 如果是 Infinity 减 Infinity, 则结果是 NaN
d. 如果是 - Infinity 减 - Infinity, 则结果是 NaN
e. 如果是 Infinity 减 - Infinity, 则结果是 Infinity
f. 如果是 - Infinity 减 Infinity, 则结果是 - Infinity
g. 如果是 + 0 减 + 0, 则结果是 + 0
h. 如果是 + 0 减 - 0, 则结果是 - 0
i. 如果是 - 0 减 - 0, 则结果是 + 0
j. 如果有一个操作数是字符串, 布尔值, null 或 undefined, 则先调用 Number()函数将其转化为数值, 再根据之前的规则计算. 如果转换的结果是 NaN, 则减法的结果是 NaN
k. 如果有一个操作数是对象, 则调用对象的 valueOf()或 toString()方法以取得表示该对象的数值计算
5. 关系操作符: 小于 (<), 大于(>), 小于等于(<=) 和大于等于(>=), 都返回布尔值
关系操作符是对数值进行比较, 当使用了非数值操作数, 要进行数据转换.
规则:
a. 如果两个操作数都是数值, 则执行数值比较
b. 如果两个操作数都是字符串, 则比较字符串对应的字符编码值大小(两个操作数的大小写一致)
c. 如果一个操作数是数值, 则将另一个操作数转换为一个数值, 然后执行数值比较
d. 如果一个操作数是对象, 要使用 valueOf()或者 toString 方法, 取得结果比较
e. 如果一个操作数是布尔值, 则将其转换为数值, 再比较
f. 任何操作数与 NaN 比较都会返回 false
5.1 相等和不相等:==,!= , 这两个操作数都会先转换操作数(通常称为强制转换), 再比较
规则:
a. 布尔值, true 和 false 先转换为 1 和 0, 再比较
b. 有一个操作数是字符串, 先将字符串转换为数值
c. 有一个操作数是对象, 先调用对象的 valueOf()方法, 得到基本类型值再比较
d.null 和 undefined 相等
e. 有一个操作数是 NaN, 则相等返回 false; 不相等返回 true
f. 如果两个操作数都是对象, 则比较他们是不是同一个对象
5.2 全等和不全等:===,!==, 比较时不会转换数据类型.
代码中建议使用全等和不全等比较
6. 三目运算符:
variable = boolean_expression ? true_value : false_value
7.typeof 操作符: 检测给定变量或数值字面量的数据类型
四, 语句
- 1.do-while:
- do{
- statement
- }while(expression)
循环体内的代码至少会被执行一次
- 2.while
- while(expression){
- statement
- }
循环体内的代码可能永远不会被执行
3.break 和 continue:
break: 退出整个循环;
continue: 退出当前循环, 执行下一个循环
4.switch 语句:
- switch(expression){
- case value1:statement
- break;
- case value2:statement
- break;
- default:statement
- }
如果 expression 等于 value1/value2, 则执行 statement.break 会导致代码执行流跳出 switch. 如果省略 break, 导致执行完当前 case 会继续执行下一个 case.default 用于 expression 不匹配任何值时执行机动代码.
注: switch 语句比较时使用全等比较, 不会转换数据类型
来源: http://www.qdfuns.com/article/46690/0b725d692eb6abaab472de0c04712a2f.html