在学习 整理一些运算符

一元运算符

x++

会只按数值运算,不会进行字符拼接

var x=3;
console.log(x++);        //x++等同于 x=x+1,它和 x+=1 不同	
var x="4";
console.log(x++);		//5
console.log(x+=1);		//字符串41

x++ 和 ++x

对x来说是一样的,但是它俩的返回值是不同的

var x=1;
console.log(x++);			 // 1  先返回x,再让x+1
console.log(++x); 			 // 2  先让x+1,然后返回x+1的结果
// 同理,--x 与 x-- 也是如此
var x=1;
var y=x+++x+++x+++x---x+x+++x+++x-x+++2;
console.log(x,y);

关系运算符

关系运算符 > >= < <= == ==== != !== 关系运算符返回的是布尔值

隐式转换为数值

var a="5";
console.log(a>6);		//false    与6进行比较,将字符串"5"转换为数值5,再与6比较,输出false
var a="b";
console.log(a>4);		//NaN    与数值4进行比较,将变量a转换为数值,转换后是NaN,NaN与任何数值比较都是false
// 如果关系运算符两边都是字符串,那么就会隐式转换为Unicode编码后再进行比较
console.log("a">"F");	//true
console.log("aa">"ab");		//true	第一个比完就比第二个
console.log(true>null);		// true  true会转换为1,null转换为0
console.log(1>false);		//true    false会隐式转换为0
console.log(true>undefined);		//false		undefined转换为字符串,然后转换为数值,转换后是NaN,NaN与任何数值比较都是false

有数组参与

console.log([]>-2);		//true	[]转换为数值是0,0>-2
console.log(![]>0);		//false    ![]的意思是布尔型,而![]转换为布尔型是false,再用false 和0进行比较,false转换为0,比较结果false
console.log(![]>[]);		//false		![]是false,[]转换为布尔型是true,再进行比较,转换为数值false为0,true为1

涉及到优先级的关系运算符运算

var x=3;
var y=3;
//	优先级中,赋值是最低的    赋值 低于 > < 低于 + - 
x+=3-x>2;	// 先算3-x为0,再算0>2为false,最后x+=false,即x+=0
console.log(x);		//3

y+=(3-x>2)+"";		// 先算括号里的,括号里的先算3-x为0,再算0>2为false,然后再加上空字符串隐式转换为字符串类型,即x+="false"
console.log(y);		// 字符串 3false

判断相等

两种方法

  1. == 判断的时候会把两边的内容进行主动地隐式转换,转换之后再进行比较
  2. === 进行判断的时候是直接进行比较
// 两边内容类型相同,直接比较内容
console.log({}=={a:1});		// false  类型相同,都是对象,内容不同

// 两边类型不同,隐式转换成字符串或数值或布尔型
console.log("[object Object]"=={a:1});		// true 进行隐式转换,对象转换换为[object Object]
console.log([1]==1);		// true  前面是数组,后面是数值,进行隐式转换,数组转换为数值1
console.log([]==0);		// true  前面是空数组,后面是数值,隐式转换,空数组转换为0

// 两个空数组,比较地址
console.log([]==[]);		// false


console.log(![]==[]);		// false
// ![]是布尔值,[]为true,![]为false       
// 此时,要把右边的[]也转换为布尔值   []先转字符串"",再由""转为布尔型false

console.log(5+([]+0));		// 字符串50  加法,转换为字符串    

var y=3;
var x=y>3;
console.log(x);		// false
==的隐式转换规则:
0==false;
0=="";
false=="";
undefined==null;		//undefined和null在进行相等判断时是相等的,都是表示变量没有值

 var x=1;
if(!x){
// 能进来的有   "" NaN  null undefined 0 false
}

if(x==undefined){
// 能进来的有null  undefined
}

if(x===undefined){
// 能进来的  undefined
}

//因为 == 的转换规则很麻烦,所以在比较时一律使用 ===

逻辑运算符

逻辑与 &&

// true   && true      true    
// true   && false     false
// false  && true      false
// false  && false     false   

// &&  遇到false即返回,没有false继续往后找直到最后

console.log(1 && 0);
console.log("" && "a");

console.log(3 && 5);
console.log(0 && "");

var x=3;
var y=x-3 && 3;			// 当x=3时y返回值为0,其他情况y返回值都是3
var y=x-3 && x-2 && 3;		// 当x=3时或y=2时y返回值为0,其他情况y返回值都是3
console.log(y);

逻辑或 ||

// true   || true      true   
// true   || false     true
// false  || true      true
// false  || false     false
// 遇到true直接返回第一个true      没有true则继续向后找,直到最后

console.log(0 || "");		// ""

var o={a:10};
console.log(o=o || {a:1});		// {a:10}
// 这句 o=o || {a:1} 其实就相当于下面的这个条件判断
if(!o){			// 如果为false    因为o是对象,布尔值为true,!o就是false
    o={a:1};		// 对o进行赋值操作
}
// 使用逻辑或就可以实现以下功能
class Box{
    static _instance;
    static getInstance(){
        return Box._instance || (Box._instance=new Box());		// 如果Box._instance为空,那么就创建一个新的Box._instance
    }
}

位运算符

进制运算

// 二进制
// 1  0
// 八进制	
//	0	1	 2	  3	 	4	  5		 6		7
//	0	1	10	 11	   100	  101	 110	111
// 二进制和十六进制的转换		三位一分
// 111 011 010 110
// 7	3	2	6        
// 转换结果 二进制数 111011010110 就是八进制数 7326
// 十六进制
//	0	1	 2	  3	 	4	  5		 6		7		8		9	  10    11	 12	  13   14	15
//	0	1	10	 11	   100	  101	 110	111		1000	1001	a	 b	  c    d	e	 f
// 二进制和十六进制的转换		四位一分
// 110 1011 0110 1101 0110
// 6	 b	  6	  d		6
// 转换结果 二进制数 110101101101101011 转换为十六进制为 6b6d6

位与运算 &

// 1	&	1	=	1
// 1	&	0	=	0
// 0	&	1	=	0
// 0	&	0	=	0
// 同时为 1 则为1    表现出 0 的特征

var a=true;
for(var i=10;i<100;i++){
    console.log(i&1);		// 实现开关的效果    即交叉输出 true 和 false
    // console.log(a=!a);		
}

位或运算 |

// 1	|	1	=	1
// 1	|	0	=	1
// 0	|	1	=	1
// 0	|	0	=	0
// 同时为 0 才为 0		表现出 1 的特征

for(var i=1;i<100;i++){
    console.log(i|7);		// 输出值的间隔是8      7 是 111  所以可以进行锁位
}

var x=3;  
x&=2;		//x=x&2
console.log(x);		// 2

var x=7;
x|=10;		//x=x|10;
console.log(x);		// 15

异或运算

异或加密
// 	1	^	1	=	0
// 	0	^	1	=	1
//	1	^	0	=	1
//	0	^	0	=	0
// 异或运算,相同为 0,不同为 1 


//用来加密		确定密钥后,异或一次得到密文,再异或一次即可实现解密

// 设置 秘钥 key 53672
console.log(43657^53672);		// 密码
console.log(31521^53672);		// 解密

var str="i love javascript";
// String.fromCharCode(i)   将第i个的Unicode编码转换为字符串
// String.charCodeAt(i)     将第i个字符转化为Unicode编码
// 随便设置一个  密钥  如下面的是设的173
var s="";
for(var i=0;i<str.length;i++){
    s+=String.fromCharCode(str.charCodeAt(i)^173);
}
console.log(s);     // 得到密文

var s1="";
for(var j=0;j<s.length;j++){
    s1+=String.fromCharCode(s.charCodeAt(j)^173);
}
console.log(s1);        // 进行解密

位非操作 ~

对数值

简单来说,对数值,位非操作就是对数值 +1 再取相反数 根据这个,就可以用它作为条件进行判断

var arr=[1,2,3,4,5];
// array.indexOf(x)  在数组array中查找x,找到就返回1,没找到就会返回-1
if(~(arr.indexOf(-2))){		// 数组中没有2,返回值是-1    位非操作后是0  那么这个的意思就是,如果是false,就输出aaa
	console.log("aaa");
}
~~

~~可以实现取整功能

// 在取整的时候不会进行四舍五入
console.log(~~3.25);
console.log(~~278.7812);
// 过大数据不要使用     会发生错误
console.log(~~127312371237123.23);

位移操作

// << 左移     >> 右移
console.log(1<<8);
console.log(1<<4);
console.log(1<<16);
console.log(1<<3);
console.log(1<<31);
console.log(256>>6);
console.log(17>>1);

三目运算符

var x=3;
// y=条件?条件是true返回这个结果:条件是false返回这个结果
var y=x>2 ? 4 : 5;
x+=x>0 ? 3 : 4;
console.log(x);

x+=5 ? x+=3 : 4;
console.log(x);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值