~ -> 它首先将值强制类型转换为32位数字,然后执行字为操作‘非’


另外一种解释: 返回2的补码,大致等于-(x+1)


作用?

  1. -1 是一个哨位值,js的indexOf 如果没有找到就返回-1, 但是判断的时候的 >= 0== -1 写法不是很好,称为‘对象渗漏’,即在代码中暴露了底层的实现细节,这些细节应该被屏蔽掉。

//原写法:
let a = "hello world"
if(a.indexOf('j') == -1){
	//没有找到
}

//利用~改进

if(~a.indexOf('j')){
	//没有找到
}

  1. 字位截取,我们可以用~~来截取数字值得小数部分。第一个执行ToInt32并反转字位,然后第二个~再进行一次字位反转,将所有字位反转回原来的值。
~~49.5; // 49
~~-49.5; // -49

~~x 能将值截除为一个32位整数,利用 x | 0 也可以实现相似的效果,但是需要考虑优先级


~~1E20 /10; //166199296
1E20 | 0 / 10;//1661992960
( 1E20 | 0 ) / 10;//166199296



ES5规范9.2定义了抽象操作ToBoolean,列举了布尔强制类型转换所有可能出现的结果。

  • undefined
  • null
  • false
  • +0,-0 和 NaN
  • ""

从逻辑上说,假值列表以外的都应该是真值。

  1. 除了'',其他的字符串都是真值。
let a  = 'false';
let b = '0';
let c = "''";

let d = Boolean(a && b && c );
d; // true
  1. [],{},fucntion(){}都不在假值列表里,所以他们都是真值。
let a  = [];
let b = {};
let c = function(){};

let d = Boolean(a && b && c );
d; // true

真值列表是无限长的,我们只能根据假值列表作为参考,可以理解位假值列表以外的值都是真值。


|| 和 && 逻辑运算符?不不不,称它们为"选择器运算符"或者"操作数选择器运算符"更恰当些。

|| 和 && 首先会对第一个操作数执行条件判断,如果其不是布尔值,就先进行ToBoolean强制类型转换,然后再执行条件判断。


对于 || 来说,如果条件判断结果为true就返回第一个操作数(a和c)的值,如果是false就返回第二个操作数的值。

&&相反的,如果条件判断结果为true就返回第二个操作数(a和c)的值,如果是false就返回第一个操作数的值。


  1. 常用的 || 用法:设置默认值
function foo(a,b){
    a = a || 'hello';
    b = b || 'world';

    console.log(a + ' ' + b);
};

foo(1);// '1 world'


  1. js代码压缩工具常用的‘守护运算符’:

function foo(){
    console.log(a);
};

let a = 1;
a && foo(); 
//当第一个操作数为真值时,&&才会选择第二个操作数作为返回值,即前面的表达式为后面的表达式'把关'