接上篇.
5. 操作符
(1)一元操作符:
自增和自减. 分为前置型和后置型: 前置性 ++i, 先自增改变自身值, 再参与语句运算; 后置型 i++ , 用原始值参与语句运算, 运算完成后再自增.
自增和自减对任何值都适用, 规则为先将字符串, 布尔值, 或对象转换为数值, 再操作.
一元加和一元减, 对于数值就是数学中的加和减, 对于其他类型, 调用 toString()或 valueOf(), 再转换成数值或 NaN.
color=#1f497d 位操作符[/color]: 位操作符是通过操作最基本层次, 即内存中表示数值的位来操作数值. 速度很快.
(3)布尔操作符:
逻辑非. 由一个叹号表示 ! , 可以用于任何类型的值, 都会返回一个布尔值, 操作过程为先将操作数转换为一个布尔值, 再对其求反.
规则: 空字符串, 数值 0,null,undefined,NaN 返回 true, 其他返回 false.
同时使用两个逻辑非操作符会模拟 Boolean()函数, 求得操作数真正的布尔值.
逻辑与.&& 可用于任何类型的值. 逻辑与并不是将其他类型的值转换为布尔值再操作, 在有一个操作数不是布尔值的情况下, 逻辑与操作不一定返回布尔值. 遵循下列规则:
如果第一个操作数是对象, 则返回第二个操作数;
如果第二个操作数是对象, 只在第一个操作数求值结果为 true 的情况下才返回该对象;
如果两个都是对象, 则返回第二个对象(遵循第一条, 放弃第二条);
如果有一个值是 null,NaN,undefined , 则返回相应的 null,NaN,undefined.
逻辑与是一个短路操作符, 如果第一个操作数为 false, 将永远不会对第二个操作数求值.
* * 逻辑或. || 可用于任何类型的值, 同逻辑与相似, 如果有一个操作数不是布尔值, 返回值也不一定是布尔值. 遵循规则:
如果第一个操作数是对象, 则返回该对象(同逻辑与相反);
如果第一个操作数求值为 false, 返回第二个操作数;
如果两个都是对象, 则返回第一个对象(同逻辑与相反);
* 如果两个都值是 null,NaN,undefined , 则返回相应的 null,NaN,undefined.
逻辑或是一个短路操作符, 如果第一个操作数为 true, 将永远不会对第二个操作数求值. 可以利用这一行为来避免为变量赋 null 或 undefined 值. 将备选数作为第二个操作数.
(4)乘性操作符: 乘法, 除法和求模.
* 乘法, 如果参与运算的某个操作数不是数值, 则后台会先用 Number()将其转换为数值.
处理特殊值遵循的规则: 如果乘积超过 ECMAScript 的数值范围, 则根据符号返回 Infinity 或 - Infinity; 如果一个操作是 NaN, 结果是 NaN;Infinity 0 , 结果是 NaN;Infinity 与非 0 数值相乘, 根据符号返回 Infinity 或 - Infinity;Infinity (+-) Infinity, 结果是(+-)Infinity.
* 除法, 处理特殊值遵循的规则: 如果有一个操作数是 NaN,Infinity / Infinity,0 / 0 得到 NaN; 非零有限数被 0 除: 3 / 0 和 Infinity 被任何非 0 数除: Infinity / 3 结果是(+-)Infinity. 注: 测试 Infinity / 0 得到的也是 Infinity.
* ** 求模, 处理特殊值遵循的规则: Infinity % 3 , 3 % 0 ,Infinity % Infinity 结果是 NaN;3 % Infinity = 3.
(5)加性操作符: 加法, 减法.
** *** 加法特殊值的规则: 数值: 有一个操作数是 NaN, 结果是 NaN;Infinity+Infinity = Infinity;(-Infinity) +(-Infinity) = -Infinity;Infinity+(-Infinity) = NaN;+0+(+0) = +0;(-0)+(-0) = -0;+0+(-0) = +0;
有一个操作数不是数值: 将不是字符串的操作数调用 toString()取得相应的字符串的值, 再进行字符串的拼接.
* ** 减法特殊值的规则: 数值: 如果有一个操作数是 NaN, 结果是 NaN;Infinity-Infinity =NaN;(-Infinity) -(-Infinity) = NaN;Infinity-(-Infinity) = Infinity;-Infinity-Infinity =- Infinity;+0-(+0) = +0;(-0)-(-0) = -0;+0-(-0) = +0;
有一个操作数不是数值: 调用 Number()将不是数值的操作数转成数值, 进行减法操作.
(6)关系操作符:>,<,>=,<=.
非数值比较规则: 如果两个操作数都是字符串, 则比较两个字符串对应的字符编码值 (大写字母的字符编码全部小于小写字母); 如果一个是数值, 则将另一个操作数转成数值(如果转成 NaN, 则总是返回 false); 如果操作数是对象, 先用 valueOf() 或 toString()得到字符串; 如果是布尔值, 转成数值.
(7)相等操作符
** *** 相等和不相等 == 和!= : 比较两个操作数是否相等时会进行强制转型, 转型规则:
布尔值转成 0 或 1; 字符串和数字进行比较时, 字符串转成数字; 有一个操作数是对象, 调用 valueOf();null 和 undefined 相等; NaN 和任何操作数都不相等, 包括它本身; 两个都是对象时比较是否指向同一个对象.
** *** 全等和不全等 === 和!== : 不进行类型转换, 即数值和类型都要相等.
(8)条件操作符 var max = (num1>num2) ? num1 : num2 ; 判断条件是否成立, 成立返回冒号前的值, 不成立返回冒号后的值.
(9)赋值操作符 用等于号表示 = : 把右侧的值赋给左侧的变量.
(10)逗号操作符 多用于声明多个变量. 也可用于赋值, 返回表达式的最后一项, 不常见.
6. 语句
(1)if 语句 条件语句
(2)do-while 语句 后测试循环语句, 多用于循环体中的代码至少被执行一次的情形.
(3)while 语句 前测试循环语句.
(4)for 语句 前测试循环语句, 但它具有在循环之前初始化变量和定义循环后要执行的代码的能力. for 语句的功能和 while 语句相同, 只是把与循环有关的代码集中在了一个位置.
(5)for-in 语句 精准的迭代语句, 可用来枚举对象的属性. 为保证兼容性, 建议在使用 for-in 循环前, 先检测确认该对象的值是不是 null 或 undefined.( if(!json) 检测对象是否有有效值, 如果为 null 或 undefined 则返回 true).
(6)lable 语句 配合 break 和 continue 使用, 在循环嵌套的情况下, 使循环返回到指定的位置. 如果使用 label 标签, 一定要使用描述性的标签, 并不要嵌套太多循环.
(7)break 和 continue 语句 用于在循环中精确地控制代码的执行. break 会立即退出整个循环, 强制执行循环后的语句; continue 会退出本次循环, 再继续执行循环.
(8)with 语句 作用是将代码的作用域设置到一个特定的对象中. 大量使用会造成性能下降, 在开发大型应用程序时, 不建议使用.
(9)switch 语句 等同于 if...else if...else.switch 中可以使用任何数据类型, 也可以在外部声明变量, 给 switch 语句传递表达式 true, 每个 case 值返回布尔值. switch 在比较值时使用的是全等操作符, 因此不会发生类型转换.
7. 函数
通过函数可以封装任意多条语句, 而且可以在任何地方, 任何时候调用. 函数在执行完 return 后停止并立即退出, 因此, 位于 return 后面的语句永远不会执行. 如果不写 return 语句, 默认返回 undefined.
函数的参数 arguments 对象是类数组, 可以访问长度, 使用下标访问参数. 参数包括但不限于命名参数. 它的值永远与对应命名参数的值保持同步. 没有传递值的命名参数将自动被赋予 undefined 值.
第三章完
来源: http://www.qdfuns.com/article/23490/78dd7aab8ec8ec396ff0b92645d94608.html