表达式
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);
*/
发表评论