经典操作符示例
经典操作符示例
1、【~】操作符
var ret = 15;
console.log(ret); //15
ret = ~ret;
// 00000000 00000000 00000000 00001111 这是正数15在计算机里面的原码(符号位是0)
// 10000000 00000000 00000000 00001111 这是负数15在计算机里面的原码(符号位是1)
// 10000000 00000000 00000000 00010000 减去1后(相当于加负数1)
console.log(ret); //-16
2【+】转number操作
var s ='50';
console.log(typeof s);//string
console.log(s===+s);
//false
s =50;
console.log(s===+s);//true
3【+】字符连接
console.log(3+5);//8
console.log(3+'5');// '35'
console.log('2'+7);// '27'
console.log(true+false);// 1
console.log(3+null);// 3
4【<<】按位左移
var val =5;
//00000000 00000000 00000000 00000101 这是正数5在计算机里面的原码(符号位是0)
//00000000 00000000 00000000 00010100 ← 丢弃左边 右边补0
var ret = val<<2;
console.log(ret);
// 20
val =-5;
//10000000 00000000 00000000 00000101 这是负数5在计算机里面的原码(符号位是1)
//11111111 11111111 11111111 11111010 这是负数5在计算机里面的反码(符号位不变,其他位取反)
//11111111 11111111 11111111 11111011 这是负数5在计算机里面的补码(反码+1)
//11111111 11111111 11111111 11101100 ← 丢弃左边 右边补0
//10000000 00000000 00000000 00010011 转为反码(符号位不变,其他位取反)
//10000000 00000000 00000000 00010100 转为补码(反码+1)
var ret = val<<2;
console.log(ret);// -20
5【>>】按位右移
var val =5;
//00000000 00000000 00000000 00000101 这是正数5在计算机里面的原码(符号位是0)
//00000000 00000000 00000000 00000001 →[01]→丢弃→左边补0
var ret = val>>2;
console.log(ret);
//1
val =-5;
//10000000 00000000 00000000 00000101 这是负数5在计算机里面的原码(符号位是1)
//11111111 11111111 11111111 11111010 这是负数5在计算机里面的反码(符号位不变,其他位取反)
//11111111 11111111 11111111 11111011 这是负数5在计算机里面的补码(反码+1)
//11111111 11111111 11111111 11111110 →[11]→丢弃→左边补1
//10000000 00000000 00000000 00000001 转为反码(符号位不变,其他位取反)
//10000000 00000000 00000000 00000010 转为补码(反码+1)
var ret = val>>2;
console.log(ret);// -2
6【>>>】按位无符号右移
var val =5;
//00000000 00000000 00000000 00000101 这是正数5在计算机里面的原码(符号位是0)
//00000000 00000000 00000000 00000001 →[01]→丢弃→左边补0
var ret = val>>>2;
console.log(ret);
//1
val =-5;
//10000000 00000000 00000000 00000101 这是负数5在计算机里面的原码(符号位是1)
//11111111 11111111 11111111 11111010 这是负数5在计算机里面的反码(符号位不变,其他位取反)
//11111111 11111111 11111111 11111011 这是负数5在计算机里面的补码(反码+1)
//00111111 11111111 11111111 11111110 →[11]→丢弃→左边补0
var ret = val>>>2;
console.log(ret);// 1073741822
7【in】判断属性的归属
var obj ={ x:20, y:30};
console.log('x' in obj); //true 注意必须加引号
console.log('y' in obj); //true 注意必须加引号
console.log('z' in obj); //false 注意必须加引 var arr = [2,'a',5];//该数组的索引是:0、1、2
console.log(0 in arr); //true
console.log('0' in arr); //true
console.log(1 in arr); //true
console.log('1' in arr); //true
console.log(2 in arr); //true
console.log('2' in arr); //true
console.log(5 in arr); //false 因为没有5这个索引
console.log('5' in arr); //false 因为没有5这个索引
8【==】和【===】
//思考一下,它如何比较?
//如果以布尔型比较,则两个操作数都需要转换
//如果以字符型比较,则只需要把0转换为'0'即可,发现不可能
//如果以数字型比较,则只需要吧''转换为0即可。
//通过对象,它是以数字型去比较。
console.log(0=='');//true
//不转型,直接比较
console.log(0==='');//false
console.log(null==undefined);//true 【==】操作符先把null和undefined都转型为false后才比较。
console.log(null===undefined);//false 【===】操作符直接比较,不做转型。
//无论如何比较,NaN都不等于它本身。
console.log(NaN==NaN);//false
console.log(NaN===NaN);//false //怎么理解?//你可以把NaM它想象为字面量对象,//每当你写下一个字面量对象的时候,//它都是世界上独一无二的!
console.log({x:1,y:2}=={x:1,y:2}); //false
console.log({x:1,y:2}==={x:1,y:2});//false
9、三元运算
//当第一个表达式是真值的时候,
//返回表达式2,否则返回表达式3
var rs =0?'真值':'假值';
console.log(rs);// '假值'
10、delete操作符
//示例:删除对象属性
var obj ={ a:2, b:3, c:4, d:5};
console.log(obj);
//Object {a: 2, b: 3, c: 4, d: 5}
var rt =delete obj['c'];
// 或者这样:delete obj.c;
console.log(obj);//Object {a: 2, b: 3, d: 5}
var rs ='c' in obj;
console.log(rs);//false
//示例:删除数组元素
var arr =['a','b','c',4,5,6];
console.log(arr);// ["a", "b", "c", 4, 5, 6]
var rs =delete arr[2];//删除第三个元素,即c元素
console.log(arr);// IE:a,b,,4,5,6 chrome:["a", "b", 3: 4, 4: 5, 5: 6]
11、debugger
function fn(a){
if(!a){
debugger;
//相当于在这一行手动打了个断点
var a,b=3;
console.log(b);
}}
fn(0);
publicclass A{
publicstaticvoid main(String[] args){
int a=10;
System.out.println(~a);
}
}
//输出结果为-11(~是按位取反操作符)
此题输出结果为什么是-11呢?要解决此问题,
得明白整型在计算机是怎么存储的,
它是以二进制补码形式存储的,占4个字节即32位。
10二进制表示为: 00000000 00000000 00000000 00001010 (第一位代表符号位,0为正,1为负)
10补码保持不变: 00000000 00000000 00000000 00001010
~10二进制表示为: 11111111 11111111 11111111 11110101
~10补码取反加1为:10000000 00000000 00000000 00001011(负数第一位符号位保留)
即结果为-11