Javascript之表达式和运算符

表达式

JavaScript 表达式主要有以下几种形式

  • 原始表达式:常量、变量、保留字。
  • 对象、数组初始化表达式:var obj={a:1,b:2};,var arr=[1,2,3];
  • 函数定义表达式:var fn=function(){}
  • 属性访问表达式:Math.abs
  • 调用表达式:alert('hello');
  • 对象创建表达式:new object();

运算符

JavaScript 中的运算符用于算术表达式比较表达式逻辑表达式赋值表达式

下表列出了 JavaScript 中所有的运算符
按照运算符的优先级排序的,前面的运算符优先级要高于后面的运算符优先级
标题为 A 的列表示运算符的结合性(Associativity)L 表示从左至右、R 表示从右至左
标题为 N 的列表示操作数的个数(Number

运算符 操作 A N
++ 前/后增量 R 1
-- 前/后增量 R 1
- 求反 R 1
+ 转换为数字 R 1
~ 按位求反 R 1
! 逻辑非 R 1
delete 删除属性 R 1
typeof 检测类型 R 1
void 返回undefined R 1
*/% 乘、除、求模 L 2
+- 加、减 L 2
+ 字符串连接 L 2
<< 左移位 L 2
>> 有符号右移 L 2
>>> 无符号右移 L 2
<<=>>= 比较数字顺序 L 2
<<=>>= 比较字母顺序 L 2
instanceof 测试对象类 L 2
in 测试属性是否存在 L 2
== 判断相等 L 2
!= 判断不等 L 2
=== 判断恒等 L 2
!== 判断不恒等 L 2
& 按位与 L 2
^ 按位异或 L 2
| 按位或 L 2
&& 逻辑与 L 2
|| 逻辑或 L 2
? : 条件运算符 R 3
= 赋值 R 2
+=-=*=/=%=&=^=|=<<=>>=>>>= 运算且赋值 R 2
, 忽略第一个操作数,返回第二个操作数 L 2

关卡

var a = b = c = 5 console.log(a, b, c) // 5 5 5
var x = 1; if (!!function f() {}) { x += typeof f; } console.log(x); // "1undefined" /** * function f(){} 是Function类型,取非后为false,再取非后为true,所以会执行if语句里面的表达式 * f 没有定义(注意!!function f() {}不是定义函数,只是if用来判断的条件),所以 typeof f 为 "undefined" * 1 + "undefined" 就是 "1undefined" */
(function f(f){ console.log(typeof f()); // "number" })(function(){return 1;}); /** * (function f(){})() 这是一个自执行函数 * f(f) 括号里面的这个f是传的参数,函数体里面调用的参数就是这个传的参数,给起个其他名字直观点 * (function f(func){ * console.log(typeof func()); * })(function(){return 1;}); * func() 返回的结果是1 * typeof 1 结果为 "number" */
console.log(typeof 2*3); // NaN console.log(typeof 2+3); // "number3" /** * 运算符优先级里面 typeof 的优先级要高于 * 和 +,所以先计算 typeof 2 * typeof 2 结果为 "number" * "number" * 3 为 NaN * "number" + 3 为 "number3" */
var a = 0, b = 0; console.log(a+++b); // 0 console.log(a); // 1 console.log(b); // 0 /** * ++ 的优先级最高 a+++b相当于 (a++) + b * ++在a的后面,先保留a的运算,a全部运算完后a才自加 * 0 + 0 = 0, 所以 a+++b 为 0 * 计算完之后,a自加,a就变成了1 * b没有变化 */
var a,b,c; a=b==c; console.log(a); // true /** * 赋值运算符(=)的优先级小于相等运算符(==),所以先计算b==c * b 和 c 都是 undefined,undefined = undefined 结果为 true * 将 true 赋值给 a */
console.log(1 && 3); // 3 console.log(1 && "foo" || 0); // "foo" console.log(1 || "foo" && 0); // 1 /** * && 前面的值为true的时候,继续执行后面的;前面的值为false的时候,不再继续执行,结束 * || 前面的值为false的时候,继续执行后面的;前面的值为true的时候,不再继续执行,结束 * 1为true 所以 1 && 3 继续执行,结果为 3 * 1为true 所以 1 && "foo" 继续执行;"foo" 为true,所以 1 && "foo" || 0 结束,结果为 "foo" * 1为false 所以 1 || "foo" 结束,结果为 1 */
var a=1; var b=(a=(2,4,6))+a++ console.log(b); // 12 /** * a=(2,4,6) 取最后面的,所以a = 6 * ++在a的后面,先保留a的运算,a全部运算完后a才自加 * b = a + a 即 12 * 运算完之后a自加 变成 7 */
var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing'); // "Something" /** * + 优先级高于三目运算符优先级 */
console.log(1 + - + + + - + 1); // 2 /** * 相当于 console.log(1 + 0 - 0 + 0 + 0 + 0 - 0 + 1); */

创作不易,若本文对你有帮助,欢迎打赏支持作者!

 分享给好友: