操作符
一元操作符
只能操作一个值的操作符
一元递增、递减操作符
前置型递增操作符
// 题1
var num1=11,num2=12;
var num3 = ++num1 + num2; //?
答案是 24。原理:
var num1=11,num2=12;
var num1 = num1 + 1; // 前置
var num3 = num1 + num2; //24
后置型递增操作符
// 题2
var num1=11,num2=12;
var num3 = num1++ + num2; //?
答案是 23。原理:
var num1=11,num2=12;
var num3 = num1 + num2; //23
var num1 = num1 + 1; // 后置
扩展: php
中
<?php
$num1 = 11;
$num2 = 12;
// $num3 = ++$num1 + $num2; //24
// $num3 = $num1++ + $num2; //23
一元加、减操作符
注意这里不要和 ⌈加法⌋ 混淆,var a = 1 + 1
这是加性操作符,一元加操作符将 +
号放在一个值的前面。
var num = +25;
var num = +(-25); // -25
在数学中这不会引起变化,但当被操作的值为非数值时,会将这个值转换为 Number
类型
var s = "123"
var n = +s; // 123
console.log(typeof n); // "number"
而一元减操作符用于表示负数。
var num = -(-25); // 25
布尔操作符
逻辑非操作符
!
操作符先将任意值转为布尔值,再对其取反。
和一元减操作符类似,先转数值类型,再取负值。
!!
代表 ⌈取反⌋ 再 ⌈取反⌋,得到真实的布尔值,和 Boolean()
是一致的。
!!false === Boolean(false)
逻辑与和逻辑或操作符
逻辑与和逻辑或操作符是一个 ⌈短路操作符⌋,啥是 ⌈短路⌋?
⌈短路⌋ 就是连接灯泡两侧的导线,电流顺着较短的路直接通过,而不再经过灯泡,叫灯泡被短路了。
回归正题,逻辑与例子所示:
var result = false && doSomething()
如果第一个操作数能够决定结果,那么就不再对第二个操作数求值。上方例子中第一个操作数求值为 false
那么不会再对 doSomething()
函数求值,相当于 doSomething()
被短路了。
这里忽略了一个东西,我们大多应用于这样的场景,
// 布尔值判断
if (a && b) {
// ..
}
// 或者根据 a 作为条件是否执行 b()
a && b();
实际上 a && b
是有返回值的,并不一定是布尔值。
var a = {"a":1};
var b = {"b":1};
var c = a && b;
console.log(c); // {b: 1}
var b = {"b":1};
var c = 0 && b;
console.log(c); // 0
var a = []; // 注意:[] {} 转为布尔值为 true
var b = function(){return 123};
var c = a && b();
console.log(c); // 123
逻辑或 如果第一个操作符的求值结果为 true
,就不会对第二个操作数求值,它仍是一个 ⌈短路操作符⌋。比如自定义配置覆盖默认配置
function fc(options) {
var conf = {
debug: options.debug || false,
timeout: options.timeout || 30000
}
console.log(conf);
}
fc({
timeout: 10000
})
//{debug: false, timeout: 10000}
上方例子中,如果未传 debug
,则 options.debug
为 undefined
,则继续求值,最终 debug
被设置为 false
的默认值;而 options.timeout
的求值结果为 true
,因此不再往下求值,最终 timeout
的配置为传入的 10000
。