运算符 | 其他运算符/运算顺序

59 阅读2分钟

1.void 运算符 #

void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined

void 0 // undefined
void(0) // undefined

上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7

下面是void运算符的一个例子。

var x = 3;
void (x = 5) //undefined
x // 5
<script>
function f() {
  console.log('Hello World');
}
</script>
<a href="http://example.com" onclick="f(); return false;">点击</a>

上面代码中,点击链接后,会先执行onclick的代码,由于onclick返回false,所以浏览器不会跳转到 example.com。

void运算符可以取代上面的写法。

<a href="javascript: void(f())">文字</a>

下面是一个更实际的例子,用户点击链接提交表单,但是不产生页面跳转。

<a href="javascript: void(document.form.submit())">
  提交
</a>

2.逗号运算符

逗号运算符用于对两个表达式求值,并返回后一个表达式的值。

'a', 'b' // "b"

var x = 0;
var y = (x++, 10);
x // 1
y // 10

逗号运算符的一个用途是,在返回一个值之前,进行一些辅助操作。

var value = (console.log('Hi!'), true);
// Hi!

value // true

3.运算顺序

3.1优先级

JavaScript 各种运算符的优先级别(Operator Precedence)是不一样的。优先级高的运算符先执行,优先级低的运算符后执行。

3.2圆括号的作用

圆括号(())可以用来提高运算的优先级,因为它的优先级是最高的,即圆括号中的表达式会第一个运算。

如果整个表达式都放在圆括号之中,那么不会有任何效果。

(expression)
// 等同于
expression

函数放在圆括号中,会返回函数本身。如果圆括号紧跟在函数的后面,就表示调用函数。

function f() {
  return 1;
}

(f) // function f(){return 1;}
f() // 1

圆括号之中,只能放置表达式,如果将语句放在圆括号之中,就会报错。

(var a = 1)
// SyntaxError: Unexpected token var

3.3左结合与右结合

对于优先级别相同的运算符,同时出现的时候,就会有计算顺序的问题。

a OP b OP c

上面代码中,OP表示运算符。它可以有两种解释方式。

// 方式一
(a OP b) OP c

// 方式二
a OP (b OP c)
w = x = y = z;
q = a ? b : c ? d : e ? f : g;

上面代码的解释方式如下。

w = (x = (y = z));
q = a ? b : (c ? d : (e ? f : g));

上面的两行代码,都是右侧的运算数结合在一起。

另外,指数运算符(**)也是右结合。

2 ** 3 ** 2
// 相当于 2 ** (3 ** 2)
// 512