js中这些符号是什么意思:&,||,===,!,++

js中这些符号是什么意思:&,||,===,!,++,第1张

&:逻辑与,&&同样可以表示逻辑与;

||:逻辑或,|也可以表示逻辑或;

===:先判断左右两边的数据类型,如果数据类型不一致,直接返回false;

!:逻辑非;

++:自加符号,在原有的基础上加上1;

js运算符双竖杠“||”的用法

1、JS双竖线运算符:是或比较。如null||‘1’,返回’1’;‘2’||‘1’,返回’2’。即或运算符中,第一个为真,后面的就不用计算了,所以得’2’。

2、js中使用双竖线运算符"||",返回第一个有效值

varobjOne=undefined||1||null||newDate();

varobjTwo=newDate();

varobjThree=objOne||objTwo;

alert(objThreetoString());//output“1”

扩展资料:

1、逻辑运算符&&、||和&、|性能上的比较

逻辑运算符&&||中,如果&&的第一个运算数是false,就不再考虑第二个运算数,直接返回false;

如果||的第一个运算数是true,也不再考虑第二个运算数,直接返回true。而&和|运算符却不是这样的,它们总是要比较两个运算数才得出结果,因而性能上&&和||会比&和|好。

2、功能用法

&&和||只能进行逻辑运算,而&和|除了可以进行"逻辑运算"外,还可以进行位运算。

3、位运算

&和|本是位运算符,之所以可以进行"逻辑运算",是由于JS是无类型的语言、各数据类型可以自由转换这一特性决定的,当用&和|进行"逻辑运算"时,实际上true被转换成1,false被转换成0,再进行逐位运算:

documentwrite(true&false);//JS,结果为0

++和--这是算数运算符。

比如 x=5 ,y=++x,y=6

比如 x=5 ,y=--x,y=4
+= 是赋值运算符。

比如  x+=y,相当于x=x+y

=    比如  x=y,相当于x=xy

类似的符号:还有

1、除法 (/)

除法运算符的结果是 *** 作数的商 ,左 *** 作数是被除数,右 *** 作数是除数。

2、求余 (%)

求余运算符返回第一个 *** 作数对第二个 *** 作数的模,即 var1 对 var2 取模,其中 var1 和 var2 是变量。取模功能就是 var1 除以 var2 的整型余数。

3、幂 ()

幂运算符返回第一个 *** 作数做底数,第二个 *** 作数做指数的乘方。即, var1var2 ,其中 var1和 var2 是其两个 *** 作数。幂运算符是右结合的。

4、一元负号 (-)

一元负号运算符位于 *** 作数前面,并转换 *** 作数的符号。

扩展资料

分类

C的运算符有以下几类:

注意:条件运算符是C语言中惟一一个三目(三元)运算符

参考资料来源:百度百科:运算符

前两天看了小胡子哥写了一篇js中浮点数运算的一个比较特殊的 01+02 的问题, 揭秘 01 + 02 != 03 ,略感小胡子哥写的还是稍微粗略,于是查各种资料,将包括IEEE754关于浮点数二进制的只是又整理一下,做此记录。

上图是IEEE对浮点数表示的说明,这里分单精度与双精度之分,如下图:

对于单精度浮点数,采用32位存储,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
对于双精度浮点数,采用64位存储,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
在单精度浮点格式中,s、exp和frac字段分别为 1 位、k = 8 位和 n = 23 位,得到一个 32 位的表示。 在双精度浮点格式(C 语言中的 double)中,s、exp 和 frac 字段分别为 1 位、k = 11 位和 n = 52 位,得到一个 64 位的表示。

根据 exp 的值,被编码的值可以分成三种不同的情况(最后一种情况有两 个变种)。下图说明了对单精度格式的情况。

好了,下面我们重点关注一下情况1,并举例来看,不然实在头大啊。以单精度举例。

浮点数转换成二进制,我们要将整数部分和小数部分分开,整数部分采用除2取余,小数部分采用乘2取整。
例如,13125 转换为二进制:
1整数部分

逆序将余数拼上得到13的二进制:1101

2小数部分

得到小数部分的二进制:0001

两部分相加,得到13125的二进制: 1101001

好了,到现在,我们知道了如何将浮点数转换为二进制表示,也知道了IEEE中浮点数的存储方式,那么,我们接下来用13125这个例子来看看计算机中具体是如何表示的呢。

二进制 1101001 可以写成 1101001 2^3 ,即这里 M 为 1101001,E为3,s为0。
单精度下,符号位s即为0,阶码字段exp的值e=E+127,即e=3+127=130,130的二进制表示为 10000010
小数字段,frac为尾数M的二进制,即1101001
那么,在单精度下,计算机中的表示为:

好了,关于浮点数转换二进制,以及浮点数的表示我们都知道了,那么,现在我们来看看,为什么 01+02!=03 的吧。首先,我们还是先看看js里到底输出多少吧:

于是,我们得到了01的二进制表示,即为 00001100110011(0011循环) ,即 1100110011(0011)2^-4
即,M 1100110011(0011),E -4,
那么,s=0,e=-4+1023=1019,
那么,js中由于是双精度的,那么01的表示为:

02的二进制表示: 0001100110011(0011循环) ,即 1100110011(0011)2^-3
那么,js双精度02的表示:

浮点数的加减运算一般由以下五个步骤完成:

将两个进行运算的浮点数的阶码对齐的 *** 作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为,当进行Mx·2Ex与My·2Ey加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。
对阶的具体方法是:首先求出两浮点数阶码的差,即⊿E=Ex-Ey,将小阶码加上⊿E,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数,以保证该浮点数的值不变。几点注意:

(1)对阶的原则是小阶对大阶,之所以这样做是因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。

(2)若⊿E=0,说明两浮点数的阶码已经相同,无需再做对阶 *** 作了。

(3)采用补码表示的尾数右移时,符号位保持不变。

(4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。

尾数运算就是进行完成对阶后的尾数相加减。这里采用的就是我们前面讲过的纯小数的定点数加减运算。

在机器中,为保证浮点数表示的唯一性,浮点数在机器中都是以规格化形式存储的。对于IEEE754标准的浮点数来说,就是尾数必须是1M的形式。由于在进行上述两个定点小数的尾数相加减运算后,尾数有可能是非规格化形式,为此必须进行规格化 *** 作。 规格化 *** 作包括左规和右规两种情况。 左规 *** 作:将尾数左移,同时阶码减值,直至尾数成为1M的形式。例如,浮点数00011·25是非规格化的形式,需进行左规 *** 作,将其尾数左移3位,同时阶码减3,就变成11100·22规格化形式了。 右规 *** 作:将尾数右移1位,同时阶码增1,便成为规格化的形式了。要注意的是,右规 *** 作只需将尾数右移一位即可,这种情况出现在尾数的最高位(小数点前一位)运算时出现了进位,使尾数成为10xxxx或11xxxx的形式。例如,100011·25右规一位后便成为
100011·26的规格化形式了。

浮点运算在对阶或右规时,尾数需要右移,被右移出去的位会被丢掉,从而造成运算结果精度的损失。为了减少这种精度损失,可以将一定位数的移出位先保留起来,称为保护位,在规格化后用于舍入处理。 IEEE754标准列出了四种可选的舍入处理方法:

(1)就近舍入(round to nearest) 这是标准列出的默认舍入方式,其含义相当于我们日常所说的“四舍五入”。例如,对于32位单精度浮点数来说,若超出可保存的23位的多余位大于等于100…01,则多余位的值超过了最低可表示位值的一半,这种情况下,舍入的方法是在尾数的最低有效位上加1;若多余位小于等于011…11,则直接舍去;若多余位为100…00,此时再判断尾数的最低有效位的值,若为0则直接舍去,若为1则再加1。

(2)朝+∞舍入(round toward +∞) 对正数来说,只要多余位不为全0,则向尾数最低有效位进1;对负数来说,则是简单地舍去。

(3)朝-∞舍入(round toward -∞) 与朝+∞舍入方法正好相反,对正数来说,只是简单地舍去;对负数来说,只要多余位不为全0,则向尾数最低有效位进1。

(4)朝0舍入(round toward 0) 即简单地截断舍去,而不管多余位是什么值。这种方法实现简单,但容易形成累积误差,且舍入处理后的值总是向下偏差。

与定点数运算不同的是,浮点数的溢出是以其运算结果的阶码的值是否产生溢出来判断的。若阶码的值超过了阶码所能表示的最大正数,则为上溢,进一步,若此时浮点数为正数,则为正上溢,记为+∞,若浮点数为负数,则为负上溢,记为-∞;若阶码的值超过了阶码所能表示的最小负数,则为下溢,进一步,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为0处理。

01的阶码-4,02的阶码-3,对阶阶段,将01的阶码变为-3,然后01的尾数部分:

可能会有人问,这里最高位怎么是1,移位后不应该是0么,别忘了,尾数部分我们隐含了一个最高位是1的条件,因此,移位后,会将该位一并移过来。
将其与02的尾数部分进行相加:

注意,这里计算时,进位2位,去除原来最高位默认的1,相当于阶码部分加1,即由原来的-3变为-2,那么,阶码部分的表示:

而尾数部分,去除最高位1,最后一位1,进行舍入,得到52位新的二进制表示:

即,最后计算的结果如下:

该数表示的即01+02的结果 2^-2 10011001100110011001100110011001100110011001100110100
将其转换成十进制数为: 03000000000000000444089209850062616169452667236328125
由于精度问题,只取到 030000000000000004

到这里,就把所有的推演过程所需要的知识补充完整了,在推演的过程中,真心觉得,人工推演二进制真累啊,十分感谢计算机前辈,设计出方案并实践于计算机,感谢。

取或得意思 例如 a |= b 就是 a = a|b;
举个例子 var i = 1; var j =2; i |=j; i 这时肯定是3。至于为什么 这个就说来话长了!

js中可以直接比较
var a = 'abc';
var b = 'abc';
(a!=b),
aequals(b)相等返回true加上非 !就是不等于了啊

javascript 具有全范围的运算符,包括算术、逻辑、位以及赋值运算符。此外还有其他一些运算符。

计算 逻辑 位运算 赋值 杂项
描述 符号 描述 符号 描述 符号 描述 符号 描述 符号
负值 - 逻辑非 ! 按位取反 ~ 赋值 = 删除 delete
递增 ++ 小于 < 按位左移 << 运算赋值 oP= typeof 运算符 typeof
递减 -- 大于 > 按位右移 >> void 运算符 void
乘法 小于等于 <= 无符号右移 >>>
除法 / 大于等于 >= 按位与 &
取模运算 % 等于 == 按位异或 ^
加法 + 不等于 != 按位或 |
减法 - 逻辑与 &&
逻辑或 ||
条件(三元运算符) :
逗号 ,
恒等 ===
不恒等 !==

运算符优先极
javascript 中的运算符是按照一个特定的顺序来求值的。这个顺序就是运算符的优先级。下表按从最高到最低的优先级列出了这些运算符。处于同一行中的运算符按从左至右的顺序求值。

运算符 描述
[] () 字段访问、数组下标以及函数调用
++ -- - ~ ! typeof new void delete 一元运算符、返回数据类型、对象创建、未定义值
/ % 乘法、除法、取模
+ - + 加法、减法、字符串连接
<< >> >>> 移位
< <= > >= 小于、小于等于、大于、大于等于
== != === !== 等于、不等于、恒等、不恒等
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
: 条件
= oP= 赋值、运算赋值
, 多重求值

圆括号可用来改变求值顺序。圆括号中的表达式应在其用于语句的其余部分之前全部被求值。

具有较高优先级的运算符将在具有较低优先级的运算符之前被求值。例如:

z = 78 (96 + 3 + 45)

在该表达式中有五个运算符: =, , (), +, 以及 +。根据优先级,它们将按下面的顺序求值: (), , +, +, =。

首先对圆括号内的表达式求值:其中有两个加法运算符,它们具有相同的优先级:96 和 3 相加,然后再将它们的和与 45 相加,得到的结果为 144。
然后是乘法运算: 78 和 144 相乘,得到结果为 11232。
最后是赋值运算:将 11232 赋给 z。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13368278.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存