操作符

未匹配的标注

一元操作符

只能操作一个值的操作符

一元递增、递减操作符

前置型递增操作符

// 题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.debugundefined,则继续求值,最终 debug 被设置为 false 的默认值;而 options.timeout 的求值结果为 true,因此不再往下求值,最终 timeout 的配置为传入的 10000

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~