JavaScript基本概念——各种操作符详解之一元操作符(加、减)转换规则、位操作符、布尔操作符详解

操作符:用于操作数据值,包括算数操作符、位操作符、关系操作符等等。
一元操作符符:只能操作一个数据值。
  1. 递增递减操作符:++,- -
    分为前置操作和后置操作。
    前置操作:先进行自增自减操作在进行数值运算。
	var age = 18;
	var age1 = ++age;	//age1 = 19,age = 19
	var age2 = --age;	//age2 = 18,age = 18;

后置操作:先进行数值运算再自增或是自减。

	var age = 18;
	var age1 = age++;	//age1 = 18,age = 19;
	var age2 = age--;	//age2 = 19;age = 18

自增和自减操作不仅是用于整数,还适用于字符串、布尔值、浮点数值和对象。在应用自增自减操作时遵循如下转换规则:

  • 包含有效数字字符的字符串:先将其转换为数字值,在自增自减。字符串变量—>数值变量。
  • 不包含有效数字字符的字符串:转换为NaN。字符串变量—>数值变量。
  • 应用布尔值false,转为0,true转为1。布尔值—>数值变量。
  • 应用浮点数值:直接自增自减
  • 应用对象:先调用对象的valueof方法,取得一个可以操作的值,再应用前面的规则。
2. 一元加和一元减操作符

对于数值数据与数学完全一样。
对于非数值数据遵循一定的转换规则。规则如下:

  • 包含有效数字的字符串转为数值
  • 不包含有效数字的字符串转为NaN
  • 布尔值false转为0,true转为1
  • 对象应用valueof()方法获得可操作的值在应用前面的转换规则。
3. 位操作符

  按内存中表示数值的位来操作数值,用二进制表示,遵循二进制的转换规则。
对于有符号的整数,32位中的前31位用于表示整数的值。第32位表示数值的符号:0表示正整数,1表示负整数。未用到的位计算机中以0填充。
 负数以二进制补码方式存储。计算如下:

  • 求负数绝对值的二进制码
  • 求二进制的补码
  • 将二进制补码+1.

(1)按位非(NOT):符号 ~ ,将1改为0,0改为1

	var num1 = 9;	
	var num2 = ~num1; //二进制为 0110

(2)按位与(AND):符号 & ,有两个操作数,将两个数值的二进制码对齐,如果两者都是1,结果为1,否则都为0.

	var num1 =  25 & 3;
	alert(num1)

(3)按位或(OR):符号 | ,有两个操作数,将两个数值的二进制码对齐,如果两者中至少有1个是1,结果为1,否则为0.

  var num1 = 9 | 3;
  alert(num1);

(4)按位异或(XOR):符号 ^ ,有两个操作数,将两个数值的二进制码对齐,如果两者中只有一个为1,结果为1,否则为0.

  var num1 = 25^3
  alert(num1);

(5)左移,符号 << ,将数值的所有位向左移动指定的位数,左移后右侧空出的位置补0.

 var num1 =  2;
 var newNum = num<<5;		// newNum = 64;2的5次方

左移不会影响操作数的符号位,2左移5位,结果64,-2左移5位,结果-64.
(6)有符号的右移,符号 >> ,将数值的所以位向右移动指定的位数,右移后左侧空出的位置补1,但是符号位保留,即保留正负号

  var num1 =  64;
  var newNum = num>>5;		// newNum = 2;64的-5次方

(7)无符号的右移,符号 >>> ,将数值的所以32位向右移动指定的位数。
 对于正数,无符号的右移与有符号的右移结果相同
  对于负数,无符号的右移是以0来填充空位,而不是像有符号右移那样以符号位的值来填充空位。无符号右移操作会把负数的二进制码当成正数的二进制码,以其绝对值的二进制补码形式表示,会导致无符号右移后的结果非常大。

	var num1 =  -64;		//二进制码为 11111111111111111111111111000000
	var newNum = num>>>5;		
	// newNum = 134217726 ,二进制码为00000111111111111111111111000000
4布尔操作符

(1)逻辑非:符号 !,可以用于js中的任何值,结果返回一个布尔值,先将操作符转为布尔值在对其求反,转换遵循以下规则:

  • 操作数为对象,返回false
  • 操作数是空字符串,返回true
  • 操作数非空字符串,返回false
  • 操作数是数值0,返回true
  • 操作数是任意非0数值(包括Infinity,-Infinity),返回false
  • 操作数是null,返回true
  • 操作数是NaN,返回true
  • 操作数是undefined,返回true

对其两次应用即可获得相对应的布尔值。var s = !!false,结果就是false。

(2)逻辑与:符号&&,有两个操作数,只有当两者均为true,结果为true,否则为false。操作数可为任何值,返回值遵循如下规则:

  • 第一个操作数为对象,返回第二个操作数
  • 第二个操作数为对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
  • 两个操作数均为对象,则返回第二个操作数
  • 第一个操作数为null,返回null
  • 第一个操作数为NaN,返回NaN
  • 第一个操作数是undefined,返回undefined

逻辑与属于短路操作,如果第一个操作数能够决定结果,就不会再对第二个操作数求值例如:

	var s1 = true;
	var s2 = (s1 && someUndefined);		//会发生错误,第二个操作数未定义
	alert(s2);			//不会执行
	
    var b1 = false;
    var b2 = (s1 && SomeUndefined);			//不会发生错误
    alert(b2);				//false

(3)逻辑或:符号 || ,只有两个操作数均为false,结果为false,否则为true。遵循如下转换规则:

  • 第一个操作数是对象,返回第一个操作数
  • 第一个操作的求值结果为false,返回第一个操作数
  • 两个操作数都是对象,返回第一个操作数
  • 两个操作数都是null,返回null
  • 两个操作数都是NaN,返回NaN
  • 两个操作数都是undefined,返回undefined
    逻辑或也是一个短路操作符,如果第一个操作数求值结果为true,就不会对第二个操作数求值,例如:
 	var s1 = true;
 	var s2 = (s1 || someUndefined);		//不会发生错
 	alert(s2);			//执行,true
 	
	 var b1 = false;
	 var b2 = (s1 && SomeUndefined);			//会发生错误
	 alert(b2);				//不会执行

逻辑或的这一个特性可以用来避免为变量赋null或undefined,例如:
var o = preferredObject || defaultObject;
如果preferredObject包含有效值,则赋值给o,否则将defaultObject赋值给o。


欢迎大家一起讨论,进步!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daisy_JuJuJu

你们的鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值