~ -> 它首先将值强制类型转换为32位数字,然后执行字为操作‘非’
另外一种解释: 返回2的补码,大致等于-(x+1)
作用?
- -1 是一个哨位值,js的indexOf 如果没有找到就返回-1, 但是判断的时候的
>= 0
和== -1
写法不是很好,称为‘对象渗漏’,即在代码中暴露了底层的实现细节,这些细节应该被屏蔽掉。
//原写法:
let a = "hello world"
if(a.indexOf('j') == -1){
//没有找到
}
//利用~改进
if(~a.indexOf('j')){
//没有找到
}
- 字位截取,我们可以用
~~
来截取数字值得小数部分。第一个执行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
- ""
从逻辑上说,假值列表以外的都应该是真值。
- 除了'',其他的字符串都是真值。
let a = 'false';
let b = '0';
let c = "''";
let d = Boolean(a && b && c );
d; // true
- [],{},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就返回第一个操作数的值。
- 常用的 || 用法:设置默认值
function foo(a,b){
a = a || 'hello';
b = b || 'world';
console.log(a + ' ' + b);
};
foo(1);// '1 world'
- js代码压缩工具常用的‘守护运算符’:
function foo(){
console.log(a);
};
let a = 1;
a && foo();
//当第一个操作数为真值时,&&才会选择第二个操作数作为返回值,即前面的表达式为后面的表达式'把关'