经典操作符示例
经典操作符示例
1、【~】操作符
var ret = 15;console.log(ret); //15ret = ~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);//stringconsole.log(s===+s);//falses =50;console.log(s===+s);//true
3【+】字符连接
console.log(3+5);//8console.log(3+'5');// '35'console.log('2'+7);// '27'console.log(true+false);// 1console.log(3+null);// 3
4【<<】按位左移
var val =5;//00000000 00000000 00000000 00000101 这是正数5在计算机里面的原码(符号位是0)//00000000 00000000 00000000 00010100 ← 丢弃左边 右边补0var ret = val<<2;console.log(ret);// 20val =-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]→丢弃→左边补0var ret = val>>2;console.log(ret);//1val =-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]→丢弃→左边补0var ret = val>>>2;console.log(ret);//1val =-5;//10000000 00000000 00000000 00000101 这是负数5在计算机里面的原码(符号位是1)//11111111 11111111 11111111 11111010 这是负数5在计算机里面的反码(符号位不变,其他位取反)//11111111 11111111 11111111 11111011 这是负数5在计算机里面的补码(反码+1)//00111111 11111111 11111111 11111110 →[11]→丢弃→左边补0var 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、2console.log(0 in arr); //trueconsole.log('0' in arr); //trueconsole.log(1 in arr); //trueconsole.log('1' in arr); //trueconsole.log(2 in arr); //trueconsole.log('2' in arr); //trueconsole.log(5 in arr); //false 因为没有5这个索引console.log('5' in arr); //false 因为没有5这个索引
8【==】和【===】
//思考一下,它如何比较?
//如果以布尔型比较,则两个操作数都需要转换
//如果以字符型比较,则只需要把0转换为'0'即可,发现不可能
//如果以数字型比较,则只需要吧''转换为0即可。
//通过对象,它是以数字型去比较。
console.log(0=='');//true//不转型,直接比较console.log(0==='');//falseconsole.log(null==undefined);//true 【==】操作符先把null和undefined都转型为false后才比较。console.log(null===undefined);//false 【===】操作符直接比较,不做转型。//无论如何比较,NaN都不等于它本身。console.log(NaN==NaN);//falseconsole.log(NaN===NaN);//false //怎么理解?//你可以把NaM它想象为字面量对象,//每当你写下一个字面量对象的时候,//它都是世界上独一无二的!console.log({x:1,y:2}=={x:1,y:2}); //falseconsole.log({x:1,y:2}==={x:1,y:2});//false
9、三元运算
//当第一个表达式是真值的时候,//返回表达式2,否则返回表达式3var 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




浙公网安备 33010602011771号