前端保留两位有效数字_web前端之JavaScript操作符上

a8fb0e9307206699ea339c1c06841925.png

ECMAScript描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、 关系操作符和相等操作符。

ECMAScript 操作符能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()或toString()方法,以便取得可以操作的值。

一、一元操作符

只能操作一个值的操作符叫做一元操作符
1. 递增和递减操作符
递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。前置型应该位于要操作的变量之前,而后置型则应该位于要操作的变量之后。

在使用前置递增操作符给一个数值加 1 时,要把两个加号(++)放在这个数值变量前面:

var age = 29; ++age;

同理,前置递减为:

var age = 29;--age;

执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。

var age = 29;var anotherAge = --age + 2;alert(age); // 输出28 alert(anotherAge); // 输出30

后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。 后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求 值之后才执行的。

var age = 29;age++;

把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语 句中还包含其他操作时,上述区别就会非常明显了。请看下面的例子:

var num1 = 2;var num2 = 20;var num3 = num1-- + num2; // 等于 22var num4 = num1 + num2; // 等于 21

在应用于不同的值时,递增和递减操作符遵循下列规则:

  • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字 符串变量变成数值变量。
  • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。
  • 在应用于布尔值 false 时,先将其转换为0再执行加减 1 的操作。布尔值变量变成数值变量。
  • 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
  • 在应用于浮点数值时,执行加减 1 的操作。
  • 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的 值,然后对该值应用前述规则。如果结果是 NaN,则在调用 toString()方法后再应用前述规则,对象变量变成数值变量。
var s1 = "2"; var s2 = "z"; var b = false; var f = 1.1; var o = {  valueOf: function() {     return -1;  } };s1++; //值变成数值 3s2++; //值变成 NaNb++; //值变成数值 1f--; //值变成 0.10000000000000009(由于浮点舍入错误所致)o--; // 值变成数值-2
86c9fe560ae22af96b6f33bddd843202.png

二、位操作符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。

对于有符号的整数,32 位中的前 31 位用于表示整数的值。第 32 位用于表示数值的符号:0 表示正 数,1 表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以 纯二进制格式存储,31 位中的每一位都表示 2 的幂。

1. 按位非(NOT)

按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码

var num1 = 25;var num2 = -num1 - 1; alert(num2); // "-26"

按位非操作的本质:操作数的负值减 1

2. 按位与(AND)

按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作就是将两 个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行 AND 操作:

第一个数值的位 第二个数值的位 结果

1 1 1

1 0 0

0 1 0

0 0 0

按位与操作只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0。

var result = 25 & 3; 6 alert(result); //1

3. 按位或(OR)

按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或操作遵循下面这个真值表。

第一个数值的位 第二个数值的位 结果

1 1 1

1 0 1

0 1 1

0 0 0

按位或操作在有一个位是 1 的情况下就返回 1,而只有在两个位都是 0 的情况下才返回 0。

var result = 25 | 3; alert(result); //27

4. 按位异或(XOR)

按位异或操作符由一个插入符号(^)表示,也有两个操作数。以下是按位异或的真值表

第一个数值的位 第二个数值的位 结 果

1 1 0

1 0 1

0 1 1

0 0 0

按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个 1 时才返回 1,如果对 应的两位都是 1 或都是 0,则返回 0。

var result = 25 ^ 3;alert(result);    //26

5. 左移

左移操作符由两个小于号(<

如果将数值 2(二进制码为 10)向左移动 5 位,结果就是 64(二进制码为 1000000)

var oldValue = 2; // 等于二进制的10var newValue = oldValue << 5; // 等于二进制的1000000,十进制的64

注意,左移不会影响操作数的符号位

6. 有符号的右移

有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即

正负号标记)。有符号的右移操作与左移操作恰好相反,即如果将64向右移动5位,结果将变回 2:

var oldValue = 64; // 等于二进制的1000000var newValue = oldValue >> 5; // 等于二进制的10 ,即十进制的2

同样,在移位过程中,原数值中也会出现空位。只不过这次的空位出现在原数值的左侧、符号位的 右侧。而此时 ECMAScript 会用符号位的值来填充所有空位,以便得到一个完整的值。

7. 无符号右移

无符号右移操作符由 3 个大于号(>>>)表示,这个操作符会将数值的所有 32 位都向右移动。对正 数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将 64 无符号右移5位,结果仍然还是 2:

var oldValue = 64;// 等于二进制的1000000var newValue = oldValue >>> 5;// 等于二进制的10 ,即十进制的2

但是对负数来说,情况就不一样了。首先,无符号右移是以 0 来填充空位,而不是像有符号右移那 样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大。

var oldValue = -64; // 等于二进制的11111111111111111111111111000000 var newValue = oldValue >>> 5; // 等于十进制的 134217726
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值