搜索
您的当前位置:首页正文

js中位运算符的用法示例(代码)

2023-11-29 来源:软文情感网

本篇文章给大家带来的内容是关于js中位运算符的用法示例(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

MDN定义:位运算符将它的操作数视为32位元的二进制串(0和1组成)而非十进制八进制或十六进制数。

例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的JavaScript数值。

位运算符有7个,这里只讲一个:按位异或^

用法:

a^b, 运算规则:在a,b的位表示中,每一个对应的位,两个不相同则返回1,相同则返回0.

代码示例:

/** * @param {number[]} nums * @return {number} */var singleNumber = function(nums) { // 如果相同数字,则其二进制都一样,返回0,不一样的返回1,这段代码,返回了nums数组中唯一不一样的值 var a for (var index=0, leng=nums.length; index<leng; index++){ a ^= nums[index] } return a};

相关推荐:

JavaScript 位运算符

Java中的位运算符、移位运算详细介绍

JS按位非(~)运算符与~~运算符的理解分析_javascript技巧

小编还为您整理了以下内容,可能对您也有帮助:

JS中的“&&”与“&”和“||”“|”有什么区别?

在JS“&&”和“||”是逻辑运算符;“&”和“|”是位运算符。

1、运算表达的不同

只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。

JavaScript中的位运算符:“|”运算方法:两个位只要有一个为1,那么结果都为1。否则就为0

2、使用方式的不同

只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;

3、运算逻辑的不同

按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;逻辑与:a&&b就是当且仅当两个操作数均为true时,其结果才为true;只要有一个为零,a&&b就为零。

扩展资料

js中的||的使用:

只有前后都是false的时候才返回false,否则返回true;

alert(2||1);//2

前面2是true,后面1也是true,结果是2;

alert('a'||1);//'a'

前面'a'是true,后面1也是true;测试结果是'a';

alert(''||1);//1

前面”是false,后面1是true,而返回结果是1;

alert('a'||0);//'a'

前面'a'是true,而后面0是false,返回结果是'a';

alert(''||0);//0

前面”是false,后面0同样是false,返回结果是0;

alert(0||'');//''

前面0是false,后面”是false,返回结果是”。

JS位运算符

之前对js的一些涉及到二进制的运算符一直似懂非懂,看到了就一脸懵*,还得去控制台算一下。然后最近看算法的时候又看到了这个运算符,这里就简单介绍一下学习这些位运算符的过程。
注意:以下运算均不涉及到小数。

先说这句话是什么意思。左移位是二进制的一种运算,就是在不改变二进制数值32位长度的前提下,将每位的数字都向左移动,左边移出去的直接丢弃,右边空出来的位置用0填充。无符号就是保持符号位不变,即本来是正数,移位后一样为正数。

这里以 7 << 2 为例。

首先将7转为二进制是 0000 0000 0000 0000 0000 0000 0000 0111 .
然后对其向左移两位.

得到值为 0000 0000 0000 0000 0000 0000 0001 1100 .
转换为十进制为 28.即 7 << 2 = 28 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

对移位后的算式进行合并项可得到 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 ,即 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 = 7 * 2^2 。由此我们可得出 7 << 2 = 7 * 2^2 = 28 。
我们通过计算几个简单的左移位运算,与标准答案进行比较,验证一下这个结论。

在控制台中以上几个算式的结果为

答案完全一致。说明我们的结论是正确的。当然这个结论仅限于那些二进制移位不会左移移出的数字的简单运算。当我们遇到一些简单的可以口算的左移位运算时就可以使用这个结论快速得到结果,如果对于 99999 << 66 这种较复杂的运算你也用这个结论计算,也没有人会介意。

下面我们看一下负数的左移位运算。以 -66 << 2 为例。
首先,我们先复习一下负数如何转换为二进制。
负数转换为二进制的步骤有三:

然后对其向左移两位.

得到值为 1111 1111 1111 1111 1111 1110 1111 1000 .然后我们将其转换成十进制。

转换为十进制为 -264.即 -66 << 2 = -264 。

刚刚我们计算 -66 的二进制得到的是 1111 1111 1111 1111 1111 1111 1011 1110 。我们在控制台验证一下我们得到的这个二进制。

我们比较一下下面几个算式。

是的没错,进行无符号左移位运算时,当两个数的绝对值相等时,其相同位数的移位的绝对值一定相等。

这里以 666 >> 3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

这个规律好像不太好总结?

这里以 -666 >> 3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 1111 1111 1111 1111 1111 1111 1010 1100 ,是一个负值,我们将其转成十进制。

我们对此结果进行验证。

可见,我们的运算是完全正确的。

这里我们以 666 >>> 3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。

这里以 -666 >> 3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 0001 1111 1111 1111 1111 1111 1010 1100 ,转成十进制为536870828。
是不是超级大。因为是无符号右移位运算,所以在左边空出部分不论正负都会填充0.

我们对此结果进行验证。

可见,我们的运算是完全正确的。

注意:因为对负数进行无符号右移位运算时,所得结果很大,所以在使用过程中需要格外注意。

疑问:左移位和右移位根本都是只对位置进行了移动,那么对于 x1 >> k = y1 和 y2 << k = x2 中的 x1 等于 x2 , y1 等于 y2 吗?

不一定。因为我们不能确保移动过程中被丢弃的值均为0。但凡有一个1被丢弃,就不会相等。而如果被丢弃的都是0,那么 x1 === x2 y1 === y2 。如下图所示。

这里以 66 & 33 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0010 0001 。
然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 66 | 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

得出结果为 66.

负数的与运算与正数并无区别,不做讨论。

这里以 66 ^ 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 ~66 为例。

首先将其转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

将结果( 1111 1111 1111 1111 1111 1111 1011 1101 )转换为十进制

得出结果为 -67.

这里我们再我看几个例子。

从中我们可以看出,位非操作就是对数字加一,然后取负。我们可以写个简单的判断方法来验证。

位运算符运算结果非常有趣,在平时可以多加应用,但是一定要注意可能产生大数的预算,避免产生不必要的BUG。
这篇文章只是做了一个简单的介绍。后面有空了会做一下在实际开发中的应用,虽然我可能很久都遇不到。

JavaScript学习指南:JS入门教程

JS位运算符

之前对js的一些涉及到二进制的运算符一直似懂非懂,看到了就一脸懵*,还得去控制台算一下。然后最近看算法的时候又看到了这个运算符,这里就简单介绍一下学习这些位运算符的过程。
注意:以下运算均不涉及到小数。

先说这句话是什么意思。左移位是二进制的一种运算,就是在不改变二进制数值32位长度的前提下,将每位的数字都向左移动,左边移出去的直接丢弃,右边空出来的位置用0填充。无符号就是保持符号位不变,即本来是正数,移位后一样为正数。

这里以 7 << 2 为例。

首先将7转为二进制是 0000 0000 0000 0000 0000 0000 0000 0111 .
然后对其向左移两位.

得到值为 0000 0000 0000 0000 0000 0000 0001 1100 .
转换为十进制为 28.即 7 << 2 = 28 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

对移位后的算式进行合并项可得到 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 ,即 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 = 7 * 2^2 。由此我们可得出 7 << 2 = 7 * 2^2 = 28 。
我们通过计算几个简单的左移位运算,与标准答案进行比较,验证一下这个结论。

在控制台中以上几个算式的结果为

答案完全一致。说明我们的结论是正确的。当然这个结论仅限于那些二进制移位不会左移移出的数字的简单运算。当我们遇到一些简单的可以口算的左移位运算时就可以使用这个结论快速得到结果,如果对于 99999 << 66 这种较复杂的运算你也用这个结论计算,也没有人会介意。

下面我们看一下负数的左移位运算。以 -66 << 2 为例。
首先,我们先复习一下负数如何转换为二进制。
负数转换为二进制的步骤有三:

然后对其向左移两位.

得到值为 1111 1111 1111 1111 1111 1110 1111 1000 .然后我们将其转换成十进制。

转换为十进制为 -264.即 -66 << 2 = -264 。

刚刚我们计算 -66 的二进制得到的是 1111 1111 1111 1111 1111 1111 1011 1110 。我们在控制台验证一下我们得到的这个二进制。

我们比较一下下面几个算式。

是的没错,进行无符号左移位运算时,当两个数的绝对值相等时,其相同位数的移位的绝对值一定相等。

这里以 666 >> 3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

这个规律好像不太好总结?

这里以 -666 >> 3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 1111 1111 1111 1111 1111 1111 1010 1100 ,是一个负值,我们将其转成十进制。

我们对此结果进行验证。

可见,我们的运算是完全正确的。

这里我们以 666 >>> 3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。

这里以 -666 >> 3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 0001 1111 1111 1111 1111 1111 1010 1100 ,转成十进制为536870828。
是不是超级大。因为是无符号右移位运算,所以在左边空出部分不论正负都会填充0.

我们对此结果进行验证。

可见,我们的运算是完全正确的。

注意:因为对负数进行无符号右移位运算时,所得结果很大,所以在使用过程中需要格外注意。

疑问:左移位和右移位根本都是只对位置进行了移动,那么对于 x1 >> k = y1 和 y2 << k = x2 中的 x1 等于 x2 , y1 等于 y2 吗?

不一定。因为我们不能确保移动过程中被丢弃的值均为0。但凡有一个1被丢弃,就不会相等。而如果被丢弃的都是0,那么 x1 === x2 y1 === y2 。如下图所示。

这里以 66 & 33 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0010 0001 。
然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 66 | 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

得出结果为 66.

负数的与运算与正数并无区别,不做讨论。

这里以 66 ^ 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 ~66 为例。

首先将其转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。

将结果( 1111 1111 1111 1111 1111 1111 1011 1101 )转换为十进制

得出结果为 -67.

这里我们再我看几个例子。

从中我们可以看出,位非操作就是对数字加一,然后取负。我们可以写个简单的判断方法来验证。

位运算符运算结果非常有趣,在平时可以多加应用,但是一定要注意可能产生大数的预算,避免产生不必要的BUG。
这篇文章只是做了一个简单的介绍。后面有空了会做一下在实际开发中的应用,虽然我可能很久都遇不到。

JavaScript学习指南:JS入门教程

js中的位运算

在了解位运算之前, 必须先了解一下什么是原码, 反码和补码, 以及二进制与十进制的转换.

原码
一个数在计算机中是以二进制的形式存在的, 其中第一位存放符号, 正数为0, 负数为1. 原码就是用第一位存放符号的二进制数值. 例如2的原码为00000010, -2的原码为10000010

反码
正数的反码是它本身, 负数的反码是在其原码的基础上, 符号位不变, 其余各位取反.

可见如果一个反码表示的是负数, 并不能直观的看出它的数值, 通常要将其转换成原码再计算

补码
正数的补码是它本身, 负数的补码是在其原码基础上, 符号位不变, 其余各位取反, 最后+1. (即负数的补码为在其反码的基础上+1)

可见对于负数, 补码的表示方式也是让人无法直观的看出其数值的, 通常也需要转换成原码再计算.

正整数十进制转二进制
正整数的十进制转二进制的方法为将一个十进制数除以2, 得到的商再除以2, 以此类推知道商为1或0时为止, 倒序取得除得的余数, 即为转换所得的二进制数.

负整数十进制转二进制
负整数的十进制转二进制, 先将该负整数对应的正整数转为二进制, 然后对其取反再+1. 即补码的形式

十进制小数转二进制
十进制小数转二进制的方法为"乘2取整", 对十进制的小数部分乘2, 得到的整数部分即是相应的二进制码数, 然后继续对得到的小数部分乘2, 如此不断重复, 直到小数部分为0或达到精度要求为止. 顺序取得每次的整数部分, 即是该十进制小数的二进制表示.

按位运算符有6个
&: 按位与
|: 按位或
^: 按位异或
~: 按位取反
>>: 右移
<<: 左移

将运算数以二进制表示, 对应位都为1, 则结果为1, 否则为0.

使用场景示例:
判断一个数是奇数还是偶数

奇数的二进制码的最后一位数肯定是1, 而1只有最后一位为1, 按位与运算后, 结果肯定只有最后一位数是1. 而偶数的二进制表示的最后一位数是0, 和1进行按位与运算, 结果的所有位都是0.

将运算数以二进制表示, 对应位有一个为1, 则结果为1, 否则为0.

使用场景示例:
对浮点数向下求整

其实浮点数是不支持位运算的, 所以会先把小数位丢弃, 然后以整数进行位运算, 而任何数与0进行按位或操作, 结果都是它本身, 就好像是对浮点数向下求整.

将运算数以二进制表示, 对应位相同为0, 相异为1.
异或满足交换律和结合律, 数字与它本身进行异或操作, 得到0; 数字与0进行异或操作, 得到它本身.

使用场景示例:
交换两个变量数字的值

将操作数转换为二进制数, 然后按位求反.

浮点数是不支持位运算的,所以会先直接去除小数部分,转成整数再进行位运算,就好像是对浮点数向下求整.
~~可以进行类型转换,位运算会默认将非数字类型转换成数字类型再进行运算 (转换结果为整数 直接去除小数部分)

使用场景示例:
类型转换

移位运算符将操作数转换成二进制, 然后向左或向右移动, 超过的位丢弃, 空出的位补0.

使用场景示例:
类型转换

任何小数 把它 >> 0可以取整
如3.14159 >> 0 = 3;
其默认将非数字类型的转换为数字类型再做运算的性质与 ~~ , | 0 一样

js中的位运算

在了解位运算之前, 必须先了解一下什么是原码, 反码和补码, 以及二进制与十进制的转换.

原码
一个数在计算机中是以二进制的形式存在的, 其中第一位存放符号, 正数为0, 负数为1. 原码就是用第一位存放符号的二进制数值. 例如2的原码为00000010, -2的原码为10000010

反码
正数的反码是它本身, 负数的反码是在其原码的基础上, 符号位不变, 其余各位取反.

可见如果一个反码表示的是负数, 并不能直观的看出它的数值, 通常要将其转换成原码再计算

补码
正数的补码是它本身, 负数的补码是在其原码基础上, 符号位不变, 其余各位取反, 最后+1. (即负数的补码为在其反码的基础上+1)

可见对于负数, 补码的表示方式也是让人无法直观的看出其数值的, 通常也需要转换成原码再计算.

正整数十进制转二进制
正整数的十进制转二进制的方法为将一个十进制数除以2, 得到的商再除以2, 以此类推知道商为1或0时为止, 倒序取得除得的余数, 即为转换所得的二进制数.

负整数十进制转二进制
负整数的十进制转二进制, 先将该负整数对应的正整数转为二进制, 然后对其取反再+1. 即补码的形式

十进制小数转二进制
十进制小数转二进制的方法为"乘2取整", 对十进制的小数部分乘2, 得到的整数部分即是相应的二进制码数, 然后继续对得到的小数部分乘2, 如此不断重复, 直到小数部分为0或达到精度要求为止. 顺序取得每次的整数部分, 即是该十进制小数的二进制表示.

按位运算符有6个
&: 按位与
|: 按位或
^: 按位异或
~: 按位取反
>>: 右移
<<: 左移

将运算数以二进制表示, 对应位都为1, 则结果为1, 否则为0.

使用场景示例:
判断一个数是奇数还是偶数

奇数的二进制码的最后一位数肯定是1, 而1只有最后一位为1, 按位与运算后, 结果肯定只有最后一位数是1. 而偶数的二进制表示的最后一位数是0, 和1进行按位与运算, 结果的所有位都是0.

将运算数以二进制表示, 对应位有一个为1, 则结果为1, 否则为0.

使用场景示例:
对浮点数向下求整

其实浮点数是不支持位运算的, 所以会先把小数位丢弃, 然后以整数进行位运算, 而任何数与0进行按位或操作, 结果都是它本身, 就好像是对浮点数向下求整.

将运算数以二进制表示, 对应位相同为0, 相异为1.
异或满足交换律和结合律, 数字与它本身进行异或操作, 得到0; 数字与0进行异或操作, 得到它本身.

使用场景示例:
交换两个变量数字的值

将操作数转换为二进制数, 然后按位求反.

浮点数是不支持位运算的,所以会先直接去除小数部分,转成整数再进行位运算,就好像是对浮点数向下求整.
~~可以进行类型转换,位运算会默认将非数字类型转换成数字类型再进行运算 (转换结果为整数 直接去除小数部分)

使用场景示例:
类型转换

移位运算符将操作数转换成二进制, 然后向左或向右移动, 超过的位丢弃, 空出的位补0.

使用场景示例:
类型转换

任何小数 把它 >> 0可以取整
如3.14159 >> 0 = 3;
其默认将非数字类型的转换为数字类型再做运算的性质与 ~~ , | 0 一样

一个&在js中代表什么意思

在js里,一个&表示运算符按位与,就是把两个二进制数按每一位比较,两个都为1则为1,否则为0(也类似与且,都真才为真)

比如 1111&0110 = 0110。

如果不是二进制数比较,需要先把这两个数转换为二进制,比如

15&6 = 1111&0110 = 0110 = 6;

扩展资料:

按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。

整数在计算机中用二进制的位来表示,一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。

按位与运算通常用来对某些位清0或保留某些位,例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。

参考资料来源:百度百科-按位与

JavaScript运算符详解


1、javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符;
2、目的分类:字符串运算符;逻辑运算符;逐位运算符;赋值运算符;
3、特殊运算符:条件运算符;typeof运算符;创建对象运算符new;delete运算符;void运算符号;逗号运算符;
算术运算符:+ 、 - 、* 、 / 、 % 、 -(一元取反) 、 ++ 、 --
等同运算符与全同运算符:== 、 ===、 !== 、 !===
比较运算符: 、
、 = 、 =
字符串运算符:: 、
、 = 、 = 、 = 、 +
逻辑运算符: 、 ||、 !、
赋值运算符:=、 +=、 *=、 -=、 /=
规则:
一、一定要注意传递给运算符的数据类型和返回的数据类型!不同的运算符都期望它的运算数表达式计算出的结果符合某种数据类型。
例如:对字符串是不能进行乘法运算的,"a" * "b" 是不合法的,但是,在可能的情况下,javascript会把表达式转换成正确的类型,因此,表达式 "3" * "5" 是合法的,javascript将字符串转换成数字执行运算,结果返回的是数字15,而不是字符串"15"。
二、+ 根据运算数的不同,具有不同的表现:
字符串 + 字符串 = 字符串(被连接);"a" + "b" = "ab" "5" + "6" = "11"
字符串 + 数字 = (字符串转换成数字)字符串(被连接);"a" + 5 = "a5" 5被转换成字符串 "1" + 0 = "10"
数字 + 数字 = 数字(相加)5 + 5 = 10。
三、注意运算符的结合性,有些运算符从左到右的结合性;有些从右到左结合性。
例如:w = a + b + c 等同于 w = (a + b) + c;
w = ---b 等同于 w = - ( - ( -b ) ); w = a = b = c 等同于 w= ( a = ( b = c ))
一元运算符、赋值运算符、三元运算符的结合性是从右到左的;
四、算术运算符规则:
“+”:可以进行“加法”与“连接”运算;如果2个运算符中的一个是字符串,javascript就将另一个转换成字符串,然后将2个运算数连接起来。
“+”:如果一个运算数是对象,javascript就会将对象转换成数字做加法运算或者字符串做连接运算;
“-”“*”“/” 如果2个运算数中的一个是是非数字,则将它转化成数字执行数*算。
“/” 在javascript中,由于所有的数都是浮点数,除法的结果都是浮点数,5 / 2 = 2.5 ;除数为0的结果为正负无穷;0/0为NaN;
“%”模运算符:计算第一个运算数对第二个运算数的模,就是第一个运算数被第二个运算数除时,返回余数。如果运算数是非数字的,则转换成数字。
“-”一元取反:将运算数取反,如果运算数不是数字,则转化成数字。
“++”“--”增量运算符/减量运算符号:运算数必须是一个变量、树组的一个元素或对象的一个属性。如果运算数不是数字,则转换成数字。
注意:如果“++”位于运算数之前,先对运算数进行增量,然后计算运算数增长后的值。
如果“--”位于运算数之后,先计算运算数未增长之前的值,然后对运算数增量。
例如:i = 1; //赋值给i值1
j = ++i; //先将i增量为2,然后将2赋值给j,i的值是2,j的值也是2。
i = 1; //赋值给i值1
j = i++; //先将i赋值给j,然后对将i值增量到2,i的值是2,j的值是1。
减量运算符“--”与“++”相同。
五、等同运算符与全同运算符:
(一)“==”“!==”等同运算符与非等同运算符:
比较2个运算数,返回一个不布尔值。
比较数值、字符串、布尔值使用的都是量值。当且仅当两个变量存放的值相等的时候,他们才相等。
比较对象、数组、函数的时候,使用的是引用,只有2个变量引用的是同一个对象时,他们才是相等的
。两个不同的数组是完全不同的,即使他们具有完全相同的元素。对于存放对象、数组、函数的引用的变量来
说,只有当他们引用的是同一个对象、数组、函数的时候,他们才相等。
注意!应遵循的原则:
当两个运算数的类型不同时:将他们转换成相同的类型,
1)一个数字与一个字符串,字符串转换成数字之后,进行比较。
2)true转换为1、false转换为0,进行比较。
3)一个对象、数组、函数 与 一个数字或字符串,对象、数组、函数转换为原始类型的值,然后进行比较。(先使用valueOf,如果不行就使用toString)
4)其他类型的组合不星等。
想两个运算数类型相同,或转换成相同类型后:
1)2个字符串:同一位置上的字符相等,2个字符串就相同。
2)2个数字:2个数字相同,就相同。如果一个是NaN,或两个都是NaN,则不相同。
3)2个都是true,或者2个都是false,则想同。
4)2个引用的是同一个对象、函数、数组,则他们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。
5)2个null,或者2个都是未定义的,那么他们相等。
“!=”非等同运算符:与等同运算符检测的结果相反。
(二)“===”“!===”全同运算符与非全同运算符号:
全同运算符遵循等同运算符的比较规则,但是它不对运算数进行类型转换,当两个运算数的类型不同时,返回false;只有当两个运算数的类型相同的时候,才遵循等同运算符的比较规则进行比较。
“!==”非全同运算符与全同运算符比较的结果相反。如果两个运算数的类型或者值不同的时候,返回true。
六、比较运算符:
这些比较运算符用于比较不同类型的值,结果返回一个布尔值。
“”“”“=”“=”
注意规则:比较的运算数可以是任意类型的,但是只能在数字和运算数上执行。不是数字和字符串的运算数将被转换成数字或字符串。
1)如果两个运算数都是数字,或者都可以转换成数字,则按照数字的大小进行比较;
2)如果两个运算数都是字符串,或者都可以转换成字符串,则将按照字母顺序进行比较;
3)如果字符串遇到数字,则将字符串转换成数字进行比较。
4)如果运算数既不能转换成数字,也不能转换成字符串,则返回结果false。
七、字符串运算符:
并没有专用的字符串运算符,只是有些运算符在遇到字符串运算数的时候,表现不同。
(一)“+”连接2个字符串;
1)当2个运算数都是字符串的时候,连接起来;
2)当其中有一个是数字的时候,将数字转换成字符串,连接起来;
(二)“”这样的比较运算符通过比较确认两个字符串的顺序,比较采用字符的顺序,较小的位于教大的前面,大写字母位于小写字母之前。
(三)“+”的作用方法取决于计算顺序,
如:s = 1 + 2 +"var" 则:返回结果3var; 因为先计算1+2,然后将结果3转换成字符串与"var"连接;
如:s = "var" + 1 + 2 则:返回结果var12; 因为先计算var与1的连接,在将结果var1与转换成字符串的2连接起来。
八、逻辑运算符:
用于执行布尔运算,常常和比较运算符一起使用,来表示复杂的比较运算。
“” 逻辑与运算、“||”逻辑或运算符、“!”逻辑非运算符
(一)“”当两个运算数都是布尔值的时候,逻辑与对他们进行and操作,即:当且仅当两个布尔值都是true的时候,返回结果true,否则返回false。
注意:实际表现
“”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回false,则返回左边第一个运算数表达式的值:false;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;
例如:if (a = b) stop(); 与 (a = b)
stop(); 等价
不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,
例如:if ((a
b)
(b++ 10) ) stop();如果运算符右边的增量必须的话,却有可能由于前面的返回值而不被执行,一般反对在的右边使用具有其他作用的表达式(赋值、函数调用、增减量);
将“”看作是一个布尔代数的运算符,会更简单与安全。
(二)“||”当两个运算数都是布尔值的时候,逻辑或对他们进行or操作,即:当两个布尔值有一个是true的时候,返回结果true,否则返回false。
注意:实际表现
“||”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回true,则返回左边第一个运算数表达式的值:true;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;
同样不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,
一般反对在||的右边使用具有其他作用的表达式(赋值、函数调用、增减量);
将“||”看作是一个布尔代数的运算符,会更简单与安全。
(三)“!”逻辑非是一个一元运算符,放在运算数之前,它的目的是对运算数取反。
九、赋值运算符:
(一)“=”是赋值运算符;他总是期望左边的运算数是一个变量、数组的一个元素或对象的一个属性;
期望右边是一个任意类型的任意的值;
从右到左的结合性,如果一个表达式中有多个赋值运算符,则从最右边开始计算。
注意:每一个赋值表达式都有一个值,就是运算符右边的值;
(二)可以使用带操作的赋值运算
“+=” 左边的值加上右边的值后,赋值于左边的值。“-=”“/=”“*=”方法一样;
十、其他运算符:
“?:”条件运算符是唯一的一个三元运算符;
一个表达式的布尔结果?表达式1(任意类型的任意值):表达式2(任意类型的任意值);
根据第一个运算数的布尔值结果,如果为true,则执行第二个运算数表达式,返回第二个运算数表达式的值;如果第一个运算数的布尔值结果是false,则执行第三个运算数表达式,返回第三个运算数表达式的值。

JavaScript运算符详解


1、javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符;
2、目的分类:字符串运算符;逻辑运算符;逐位运算符;赋值运算符;
3、特殊运算符:条件运算符;typeof运算符;创建对象运算符new;delete运算符;void运算符号;逗号运算符;
算术运算符:+ 、 - 、* 、 / 、 % 、 -(一元取反) 、 ++ 、 --
等同运算符与全同运算符:== 、 ===、 !== 、 !===
比较运算符: 、
、 = 、 =
字符串运算符:: 、
、 = 、 = 、 = 、 +
逻辑运算符: 、 ||、 !、
赋值运算符:=、 +=、 *=、 -=、 /=
规则:
一、一定要注意传递给运算符的数据类型和返回的数据类型!不同的运算符都期望它的运算数表达式计算出的结果符合某种数据类型。
例如:对字符串是不能进行乘法运算的,"a" * "b" 是不合法的,但是,在可能的情况下,javascript会把表达式转换成正确的类型,因此,表达式 "3" * "5" 是合法的,javascript将字符串转换成数字执行运算,结果返回的是数字15,而不是字符串"15"。
二、+ 根据运算数的不同,具有不同的表现:
字符串 + 字符串 = 字符串(被连接);"a" + "b" = "ab" "5" + "6" = "11"
字符串 + 数字 = (字符串转换成数字)字符串(被连接);"a" + 5 = "a5" 5被转换成字符串 "1" + 0 = "10"
数字 + 数字 = 数字(相加)5 + 5 = 10。
三、注意运算符的结合性,有些运算符从左到右的结合性;有些从右到左结合性。
例如:w = a + b + c 等同于 w = (a + b) + c;
w = ---b 等同于 w = - ( - ( -b ) ); w = a = b = c 等同于 w= ( a = ( b = c ))
一元运算符、赋值运算符、三元运算符的结合性是从右到左的;
四、算术运算符规则:
“+”:可以进行“加法”与“连接”运算;如果2个运算符中的一个是字符串,javascript就将另一个转换成字符串,然后将2个运算数连接起来。
“+”:如果一个运算数是对象,javascript就会将对象转换成数字做加法运算或者字符串做连接运算;
“-”“*”“/” 如果2个运算数中的一个是是非数字,则将它转化成数字执行数*算。
“/” 在javascript中,由于所有的数都是浮点数,除法的结果都是浮点数,5 / 2 = 2.5 ;除数为0的结果为正负无穷;0/0为NaN;
“%”模运算符:计算第一个运算数对第二个运算数的模,就是第一个运算数被第二个运算数除时,返回余数。如果运算数是非数字的,则转换成数字。
“-”一元取反:将运算数取反,如果运算数不是数字,则转化成数字。
“++”“--”增量运算符/减量运算符号:运算数必须是一个变量、树组的一个元素或对象的一个属性。如果运算数不是数字,则转换成数字。
注意:如果“++”位于运算数之前,先对运算数进行增量,然后计算运算数增长后的值。
如果“--”位于运算数之后,先计算运算数未增长之前的值,然后对运算数增量。
例如:i = 1; //赋值给i值1
j = ++i; //先将i增量为2,然后将2赋值给j,i的值是2,j的值也是2。
i = 1; //赋值给i值1
j = i++; //先将i赋值给j,然后对将i值增量到2,i的值是2,j的值是1。
减量运算符“--”与“++”相同。
五、等同运算符与全同运算符:
(一)“==”“!==”等同运算符与非等同运算符:
比较2个运算数,返回一个不布尔值。
比较数值、字符串、布尔值使用的都是量值。当且仅当两个变量存放的值相等的时候,他们才相等。
比较对象、数组、函数的时候,使用的是引用,只有2个变量引用的是同一个对象时,他们才是相等的
。两个不同的数组是完全不同的,即使他们具有完全相同的元素。对于存放对象、数组、函数的引用的变量来
说,只有当他们引用的是同一个对象、数组、函数的时候,他们才相等。
注意!应遵循的原则:
当两个运算数的类型不同时:将他们转换成相同的类型,
1)一个数字与一个字符串,字符串转换成数字之后,进行比较。
2)true转换为1、false转换为0,进行比较。
3)一个对象、数组、函数 与 一个数字或字符串,对象、数组、函数转换为原始类型的值,然后进行比较。(先使用valueOf,如果不行就使用toString)
4)其他类型的组合不星等。
想两个运算数类型相同,或转换成相同类型后:
1)2个字符串:同一位置上的字符相等,2个字符串就相同。
2)2个数字:2个数字相同,就相同。如果一个是NaN,或两个都是NaN,则不相同。
3)2个都是true,或者2个都是false,则想同。
4)2个引用的是同一个对象、函数、数组,则他们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。
5)2个null,或者2个都是未定义的,那么他们相等。
“!=”非等同运算符:与等同运算符检测的结果相反。
(二)“===”“!===”全同运算符与非全同运算符号:
全同运算符遵循等同运算符的比较规则,但是它不对运算数进行类型转换,当两个运算数的类型不同时,返回false;只有当两个运算数的类型相同的时候,才遵循等同运算符的比较规则进行比较。
“!==”非全同运算符与全同运算符比较的结果相反。如果两个运算数的类型或者值不同的时候,返回true。
六、比较运算符:
这些比较运算符用于比较不同类型的值,结果返回一个布尔值。
“”“”“=”“=”
注意规则:比较的运算数可以是任意类型的,但是只能在数字和运算数上执行。不是数字和字符串的运算数将被转换成数字或字符串。
1)如果两个运算数都是数字,或者都可以转换成数字,则按照数字的大小进行比较;
2)如果两个运算数都是字符串,或者都可以转换成字符串,则将按照字母顺序进行比较;
3)如果字符串遇到数字,则将字符串转换成数字进行比较。
4)如果运算数既不能转换成数字,也不能转换成字符串,则返回结果false。
七、字符串运算符:
并没有专用的字符串运算符,只是有些运算符在遇到字符串运算数的时候,表现不同。
(一)“+”连接2个字符串;
1)当2个运算数都是字符串的时候,连接起来;
2)当其中有一个是数字的时候,将数字转换成字符串,连接起来;
(二)“”这样的比较运算符通过比较确认两个字符串的顺序,比较采用字符的顺序,较小的位于教大的前面,大写字母位于小写字母之前。
(三)“+”的作用方法取决于计算顺序,
如:s = 1 + 2 +"var" 则:返回结果3var; 因为先计算1+2,然后将结果3转换成字符串与"var"连接;
如:s = "var" + 1 + 2 则:返回结果var12; 因为先计算var与1的连接,在将结果var1与转换成字符串的2连接起来。
八、逻辑运算符:
用于执行布尔运算,常常和比较运算符一起使用,来表示复杂的比较运算。
“” 逻辑与运算、“||”逻辑或运算符、“!”逻辑非运算符
(一)“”当两个运算数都是布尔值的时候,逻辑与对他们进行and操作,即:当且仅当两个布尔值都是true的时候,返回结果true,否则返回false。
注意:实际表现
“”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回false,则返回左边第一个运算数表达式的值:false;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;
例如:if (a = b) stop(); 与 (a = b)
stop(); 等价
不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,
例如:if ((a
b)
(b++ 10) ) stop();如果运算符右边的增量必须的话,却有可能由于前面的返回值而不被执行,一般反对在的右边使用具有其他作用的表达式(赋值、函数调用、增减量);
将“”看作是一个布尔代数的运算符,会更简单与安全。
(二)“||”当两个运算数都是布尔值的时候,逻辑或对他们进行or操作,即:当两个布尔值有一个是true的时候,返回结果true,否则返回false。
注意:实际表现
“||”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回true,则返回左边第一个运算数表达式的值:true;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;
同样不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,
一般反对在||的右边使用具有其他作用的表达式(赋值、函数调用、增减量);
将“||”看作是一个布尔代数的运算符,会更简单与安全。
(三)“!”逻辑非是一个一元运算符,放在运算数之前,它的目的是对运算数取反。
九、赋值运算符:
(一)“=”是赋值运算符;他总是期望左边的运算数是一个变量、数组的一个元素或对象的一个属性;
期望右边是一个任意类型的任意的值;
从右到左的结合性,如果一个表达式中有多个赋值运算符,则从最右边开始计算。
注意:每一个赋值表达式都有一个值,就是运算符右边的值;
(二)可以使用带操作的赋值运算
“+=” 左边的值加上右边的值后,赋值于左边的值。“-=”“/=”“*=”方法一样;
十、其他运算符:
“?:”条件运算符是唯一的一个三元运算符;
一个表达式的布尔结果?表达式1(任意类型的任意值):表达式2(任意类型的任意值);
根据第一个运算数的布尔值结果,如果为true,则执行第二个运算数表达式,返回第二个运算数表达式的值;如果第一个运算数的布尔值结果是false,则执行第三个运算数表达式,返回第三个运算数表达式的值。

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

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

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

===:先判断左右两边的数据类型,如果数据类型不一致,直接返回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(objThree.toString());//output“1”

扩展资料:

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

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

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

2、功能用法

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

3、位运算

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

document.write(true&false);//JS,结果为0

JavaScript中|=是做什么运算呢

|= 是JavaScript中按位“或”赋值运算符

JavaScript中按位“或”赋值运算符是对变量值与表达式值执行按位“或”,并将结果赋给该变量。使用方法:

result |= expression

其中result是任何变量。

expression是任何表达式。

JavaScript中按位“或”赋值运算符,使用该运算符和使用下面的语句是等效的:

result = result | expression

|= 运算符查看 result 和 expression 的二进制表示法的值,并执行按位“或”操作。该操作的结果如下所示:

0101 (result)

1100 (expression)

----

1101 (输出)

任何时候,只要两个表达式中的其中一个的某位是 1,则结果的该位是 1。否则,结果的该位是 0。

软文情感网还为您提供以下相关内容希望对您有帮助:

javascript如何使用位运算符进行乘法和除法运算 举个例子说明下_百度知 ...

var j = i &lt;&lt; 1; // j = i * 2 左移一位等于乘上2 var k = j &gt;&gt; 1;// k = j / 2 右移一位等于除以2 使用移位操作,结果只能是整数

JS位运算符

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算 移位后得到的值为 0001 1111 1111 1111 1111 1111 1010 1100 ,转成十进制为536870828。 是不是超级大。因为是...

一个&amp;在js中代表什么意思

在js里,一个&amp;表示运算符按位与,就是把两个二进制数按每一位比较,两个都为1则为1,否则为0(也类似与且,都真才为真)比如 1111&amp;0110 = 0110。如果不是二进制数比较,需要先把这两个数转换为二进制,比如 15&amp;...

JS中的“&amp;&amp;”与“&amp;”和“||”“|”有什么区别?

JavaScript中的位运算符:“|”运算方法:两个位只要有一个为1,那么结果都为1。否则就为0 2、使用方式的不同 只要“&amp;&amp;”前面是false,无论“&amp;&amp;”后面是true还是false,结果都将返“&amp;&amp;”前面的值;只要“&amp;&amp;”前面是true...

js中的位运算

使用场景示例: 类型转换 移位运算符将操作数转换成二进制, 然后向左或向右移动, 超过的位丢弃, 空出的位补0.使用场景示例: 类型转换 任何小数 把它 &gt;&gt; 0可以取整 如3.14159 &gt;&gt; 0 = 3; 其默认将非数...

JavaScript中|=是做什么运算呢

|= 是JavaScript中按位“或”赋值运算符 JavaScript中按位“或”赋值运算符是对变量值与表达式值执行按位“或”,并将结果赋给该变量。使用方法:result |= expression 其中result是任何变量。expression是任何表达式。JavaScrip...

js中&lt;&lt;是什么运算符

按位左移运算符 (&lt;&lt;) 将 【要位移的数字】 的位左移 【位移位数】中指定的位数。 例如:复制代码 代码如下:var temp;temp = 14 &lt;&lt; 2;/*14 的二进制是 0011100000001110 向左位移2位 00111000 = 56*/alert(temp...

js中 &amp;什么意思

js中按位与运算符(&amp;)1.该运算符对它的运算数逐位执行布尔AND操作,只有两个运算数中相应的位都为1时,结果中的这一位才为1,它要求其运算数为整型,如果运算数不是整型,则会尝试将其转换为32位整型,如果无法转换...

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

++:自加符号,在原有的基础上加上1;js运算符双竖杠“||”的用法 1、JS双竖线运算符:是或比较。如null||‘1’,返回’1’;‘2’||‘1’,返回’2’。即或运算符中,第一个为真,后面的就不用计算了,...

js代码中如何判断数字百位能被3整除

// return false说明:: 整除运算, 7%3 = 1, 8%3=2, 9%3=0 /: 除法运算, 在js中, 4/2=2, 5/2=2.5, 5/3=1.6666666666666667 |: 位运算符, 可以用来取整, 2.4 | 0 =2, 2.6 | 0 = 2 ...

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

热门图文

  • 读《杜工部集》二首的全文 读《杜工部集》二首的全文是什么

    《读《杜工部集》二首》贯休全文:造化拾无遗,唯应杜甫诗。岂非玄域橐,夺得古人旗。日月精华薄,山川气概卑。古今吟不尽,惆怅不同时。甫也道亦丧,孤身出蜀城。彩毫终不撅,白雪更能轻。命薄相如命,名齐李白名。不知耒阳令,何以葬先生。

  • 读《杜工部集》二首的全文是什么

    《读《杜工部集》二首》贯休全文:造化拾无遗,唯应杜甫诗。岂非玄域橐,夺得古人旗。日月精华薄,山川气概卑。古今吟不尽,惆怅不同时。甫也道亦丧,孤身出蜀城。彩毫终不撅,白雪更能轻。命薄相如命,名齐李白名。不知耒阳令,何以葬先生。

  • 读《杜工部集》二首的全文

    《读《杜工部集》二首》贯休全文:造化拾无遗,唯应杜甫诗。岂非玄域橐,夺得古人旗。日月精华薄,山川气概卑。古今吟不尽,惆怅不同时。甫也道亦丧,孤身出蜀城。彩毫终不撅,白雪更能轻。命薄相如命,名齐李白名。不知耒阳令,何以葬先生。

  • 读《杜工部集》二首全文

    《读《杜工部集》二首》贯休全文:造化拾无遗,唯应杜甫诗。岂非玄域橐,夺得古人旗。日月精华薄,山川气概卑。古今吟不尽,惆怅不同时。甫也道亦丧,孤身出蜀城。彩毫终不撅,白雪更能轻。命薄相如命,名齐李白名。不知耒阳令,何以葬先生。

  • 读《杜工部集》二首的朝代是什么

    《读《杜工部集》二首》贯休朝代:唐代

Top