当前位置: 首页 > news >正文

JavaScript操作符

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符、位操作符、关系操作符和相等操作符。
特点能够适用于很多的值,例如字符串、数字值、布尔值,甚至对象。
 
操作符的优先级:逻辑非 ! 、算术 +-*/%、关系、逻辑与和逻辑或、条件操作符、赋值操作符
 
一元操作符
 
只能操作 一个值的操作符叫做一元操作符。
 
1.递增递减操作符
 
各有两个版本:前置型和后置型。如下所示:
 
var age = 29;
++age;
 
在这个例子中,前置递增操作符把age的值变成了30(为29加上1)。
实际上。执行这个前置题赠操作符与执行以下操作的效果相同:
 
var age = 29;
age = ++age + 1;
 
执行前置递减操作的方法也类似,结果会从一个数值中减去1.使用前置递减操作符时,要把
两个减号(--)放在相应的变量前面,如下所示:
 
var age  = 29;
--age;
 
备注:执行前置递增和递减时,变量的值都是在语句被求值以前改变。
例如:
 
var age = 29;
 
var anotherAge = --age + 2 
 
alert(age);   // 输出28
alert(another); // 输出30
 
这个例子,先执行了减法操作,age的值变成28,所以加上2就结果就等于30。
 
由于前置递增和递减操作与执行语句的 优先级相等,因此整个语句从左到右被求值。再看下一个例子:
 
var num1 = 2;
var num2 = 20;
var num3 = --num1+num2;       //  等于21
var num4 = num1+num2;        //  等于21
  
num4等于21,是因为使用了num1先减去1后的值。
 
后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过是放在变量的后面而不是前面
 
前置和后置的最大区别在于,后置递增是在包含它们的语句被求值之后才执行的。这个区别在某些情况下不是什么问题,例如:
 
var age = 29;
age++;
 
所有这4个操作符对任何值都适用,也就不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,递增和递减操作符遵循下列规则。
 
1.在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
 
备注:默认使用Number()方法进行转换
 
2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
 
3.在应用于布尔值false时,先将其转换为0再执行加减1的操作,布尔值变量变成数值变量。
 
4.在应用于布尔值true时,先将其转换为1再执行加减1的操作,布尔值变量变成数值变量。
 
5.在应用于浮点数值时,执行加减1的操作。
 
6.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后
 
2.一元加和减操作符
 
一元加操作符放在数值面前,对数值不会产生任何影响。
 
而非数值型应用一元加操作符时,该操作符会像Number()函数一样对这个值执行类型转换。如下例子:
 
var s1 = "0.1";
var s2 = "z";
var s3 = false;
 
console.log(s1);   --- 0.1
console.log(s2);   --- NaN
console.log(s3);   --- 0
 
一元减操作符主要用于表示负数。如下例子,进行了简单的转换:
 
var  num = 25;
 
console.log(-25);  ----25
 
 
位操作符
 
位操作符用于最基本的层次上,即按内存中的表示位的操作数值。
 
对于有 符号整数,32位中的前31位表示整数的值,第32位表示数值的符号:0表示整数,1表示负数。这个表述符号的位表示符号位。符号位决定了其他位数的格式。
 
其中,整数以纯二进制格式存储。如18的二进制表示是10010,没用到的位数用0表示,即忽略不计。这个是5个有效位,这5位本身就决定了实际的值。
 
负数同样以二进制码存储,但使用的是二进制的补码。计算一个值的二进制补码,需要经过3个步骤。
 
(1).求这个数值绝对值的二进制码。
 
(2).求二进制的反码,即将0替换为1,将1替换为0。
 
(3).得到的二进制反码加1。
 
根据前面的3步骤求得-18的二进制,首先就要求得18的二进制码,即:
 
0000  0000  0000  0000  0000 0000  0001  0010
 
然后,求其二进制反码,即0和1互换:
 
1111  1111  1111 1111  1111 1111  1110 1101
 
最后二进制反码加1:
 
1111  1111  1111 1111  1111 1111  1110 1110
 
这样就求得-18的二进制表示。
 
ECMAScript会尽力向我们隐藏所有的这些信息。换句话说,以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码在前面加上负号。
 
1.按位非(NOT)
 
按位非由一个波浪线(~)表示,执行按位非得结果就是返回数值的反码。
 
var  num1 = -18;    //  二进制1111  1111  1111  1111   1111   1111  1110  1110

var  num2 = ~num1  // 反码 0000  0000  0000  0000   0000   0000  0001  0010

console.log(~num);  //  17
 
按位非操作的 本质 :操作数的 负值 减1。下面的代码也可以得到相同结果:
 
var num1 = -18;
 
var num2  = -num1 - 1;
 
console.log(num2);
 
2.按位与(AND)
 
按位与操作符由一个和号字符(&)表示,它有两个操作数。从本质讲,按位与操作就是将两个数值的每一位对齐,然后下面的表中的规则,对相同位置的两个数执行and操作。
第一个数值的位第二个数值的位结果
111
100
000
010
 
简而言之,按位与操作符只有在两个对应位都是 1时才会返回1,任何一位是0,结果都是0。如下示例:
 
var result = 25 & 3;

console.log(result);   ---输出为1
 
具体操作
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0000 0001
 
结果为1
 
 
3.按位或
 
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或遵行下面这个真值表。
第一个数值的位第二个是数值的位结果
111
101
011
000
由此可见,按位或擦操作在有一个位是1的情况下返回1,而只有两个位都是0才返回0。
 
如前面的按位与例子的例子中对25和3执行按位或操作,则具体代码如下:
 
var result = 25  |  3;

console.log(result);   ---输出为27
 
具体操作
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0001 1011
 
结果为27
 
 
4.按位异或
 
按位异或操作符由一个插入符号(^)表示,也有两个操作数,以下是按位异或的真值表。
第一个值的位第二个值的位结果
110
101
011
000
 
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有 一个1时才返回1,如果相对应的两位都是1或都是0,则返回0
 
对25和3执行按位异或操作的代码如下所示:
 
var result = 25  |  3;

console.log(result);   ---输出为26
 
25      = 0000  0000 0000 0000 0000 0000 0001 1001
  3      = 0000  0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------
AND   = 0000  0000 0000 0000 0000 0000 0001 1010
 
左移
 
左移操作符由两个小于号(<<)表示,这个操作符会将所有的数值的 所有位向左移指定的位数。例如,如果将数值2向左移5位,结果就是64.具体代码如下:
 
var oldNum = 2;
var newNum  = oldNum <<5;    // 等于二进制的100 0000   输出十进制的64
 
备注:在向左位移后,原数值的右侧会对出几个空位。左移操作会以0来填充这些位,以便得到的结果是一个完整的32位二进制数。
 
0000  0000  0000  0000  0000  0000  0000 0010  
 
0000  0000  0000  0000  0000  0000  0100 0000
 
备注:左移不会影响操作数的符号位,也就是说,如果-2左移5位,得到的结果将会是-64,而非64。
 
 
有符号右移
 
有符号的右移操作符由两个大于号(>>)表示,这个操作符将数值向右移动,但保留符号位(即正负号标记),
 
 
布尔操作符
 
1.逻辑非
 
优先级最高
 
逻辑非操作符由一个叹号(!)表示,可以应用于任何ECMAScript中的任何值。无论这个值是什么类型的值,这个操作符都会返回一个布尔值。 逻辑非操作符首先会将它的操作数转换成一个布尔值,然后进行取反。如下所示:
 
alert(!fa lse);        // true
alert(!"blue");     // false
alert(!0);             // true
alert(!NaN);        // true
alert(!12345);     // false
 
提示:只需记住各个类型的值对应的布尔值,然后根据逻辑非操作符的规则进行转换即可。
 
同时运用两个逻辑非操作符,实际上就模拟Boolean()方法进行类型转换过程,第一个逻辑非操作符会基于无论什么操作数都会返回一个布尔值,第二个逻辑非则对该布尔值进行求反,于是就得到了这个值真正对应的布尔值。如下例子:
 
alert(!!false);        //false
alert(!!"blue");     //true
alert(!!0);             //fasle
alert(!!NaN);        //false
alert(!!12345);     //true
 
2.逻辑与
 
逻辑与操作符由两个和号(&&)表示,有两个操作数,如下面例子所示:
 
var  result = true && false;
 
逻辑与的真值表:
 
第一个操作数第二个操作数结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse
 
逻辑与可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。此时它遵循以下规则:
 
如果第一个操作数是对象(非空对象),则返回第二个操作数;
 
如果第二个操作数是对象,则只有在第一个操作数求值结果为true的情况下,才会返回该对象;
 
如果两个操作数都是对象,则返回第二个操作数;
 
逻辑与属于 短路操作:即如果第一个数能够决定结果,那么就不会对第二个操作数进行求值。对于逻辑与操作符而言,如果第一个操作数的求值结果是false,则无论第二个操作数是什么值,结果都不能为true。如下所示:
 
var num1 = 0;
var num2 = 12;
console.log(num1 && num2);   // 结果输出 0 ;
 
备注:不能在逻辑与操作符中使用未定义的值。
 
3.逻辑或
 
逻辑或操作符由两个竖线符(||)表示,有两个操作数,如下的例子所示:
 
var  result  ||  false;
 
逻辑或的真值表:
 
第一个操作数第二个操作数结果
truetruetrue
truefalsetrue
falsetruefalse
falsefalsefalse
 
逻辑或和逻辑与一样,如果有一个操作数不是布尔值,则不一定返回布尔值;此时遵循下列规则:
 
如果两个操作数都是对象(非空),则返回第一个操作数;
 
如果第一个操作数求值结果为false,则返回第二个操作数;
 
如果第一个操作数是对象(非空对象),则返回第一个操作数;
 
逻辑或操作符与逻辑与操作符一样都是短路操作,也就是说第一个操作符只要求值结果为true,就不会对第二个值进行求值了。
 
备注:可以利用逻辑或的这一行为来变量赋值null或undefined值。例如:
 
var  aObject = iObject ||  jObject;
 
这个例子中,变量 aObject将被赋予等于号后面两个值中的其中一个。变量iObject 中包含优先赋值给aObject的值,变量jObject负责在iObject中不包含有效值的情况提供后备值。如果iObject中的值不是null,那么它的值将赋给aOBject;如果是null,则将jObject的值赋值给aObject。
 
乘性操作符
 
主要有:乘法、除法、求模
 
 
1.乘法
 
乘法操作符由一个*号表示,用于计算两个值的乘积。
 
在处理特殊值的情况下,乘法操作符遵循下列特殊的 规则
 
如果有一个操作数是NaN,则结果返回NaN;
 
如果是infinity与0相乘,则结果是NaN;
 
如果是infinity 与非0数值相乘,则结果是infinity或则是-infinity,取决于有符号操作数的符号;
 
如果infinity与infinity相乘,则结果是infinity;
 
如果一个操作数不是数值,则在后台调用number()将其转换为数值,然后在运用上面的符号;
 
 
2.除法
 
除法操作符由一个斜符号(/),执行第二个操作数除第一个操作数的计算,如下例子所示:
 
var  result  =  66   /   12;
 
与乘法操作符类似,除法操作符对特殊的值也有特殊的处理。这些规则如下:
 
如果有一个操作数是NaN,则结果返回NaN;
 
如果Infinity 被 Infinity除,则结果是NaN;
 
如果0被0除,则结果是NaN;
 
如果非零的有限数被零除,则结果是Infitity,符号取决于有符号操作数;
 
如果Infinity被非零数除,则结果是Infinity或-Infinity,符号取决去有符号操作数;
 
如果一个操作数不是数值,则在后台调用Number()将其转换为数值,然后运用上面的规则;
 
 
3.求模
 
求模操作符由一个百分号(%)表示,用法如下:
 
如果被除数是无穷大而除数是有限大的数值,则结果返回NaN;
 
如果被除数是无穷大而除数是零,则结果返回NaN;
 
如果是Infinity被Infinity除,则结果是NaN;
 
如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
 
如果被除数是0,则结果是0;
 
如果一个操作数不是数值,则在后台调用Number()将其转换为数值,然后运用上面的规则;
 
关系操作符
 
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)这几个操作符都是用于两个值进行比较,都返回一个布尔值。如下所示:
 
var   result1  = 5 > 3;      // true 
 
var   result2  =  5 < 3;     // false
 
与ECMAScript中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换,完成某些奇怪的操作。以下是响应的规则:
 
如果两个数是正常的数值,则执行数值比较;
 
如果两个操作数都是字符串,则比较两个字符串对应的字符编码;
 
如果一个操作数是数值,则将另外一个操作数转换为一个数值,然后执行数值比较;
 
如果一个操作数是对象,则调用valueOf()方法,得到的结果按前面的规则执行比较。如果是对象没有valueOf()方法,则调用toString()方法,并得到结果根据前面的规则进行比较。
 
如果一个操作数是布尔值,则先将其转换为数值,然后执行比较;
 
备注:任何数值与NaN关系比较,结果都是false。
 
 
相等操作符
 
ECMAScript提供了两组操作符:相等和不相等----先转换在比较,全等和不全等----仅仅比较而不转换。
 
1.相等与不相等
 
在ECMAScript中相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。而不相等时由一个感叹号和一个等于号(!=)表示,如果两个操作数不相等,则返回true这两个操作符都会先转换操作数(通常称为强制转型),然后比较它们的相等性。
 
规则如下:
 
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转换为0,而true转换为1;
 
如果一个操作数是字符串,而另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
 
如果一个操作数是对象,另外一个操作数不是,则调用对象的valueOf()方法,用的得到的基本类型值按照前面的规则进行比较。
 
两个操作符进行比较时,则遵循下列 规则
 
只要类型转换后的值相等,就返回true
 
null和undefined是相等的;
 
在比较相等性之前,不能将null和undefined转换成其他任何值;
 
如果一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true;Tip:即使两个操作数都是NaN,相等操作符返回false;因为按照规则NaN不等于NaN;
 
如果两个操作数是都是对象,则比较它们是不是同一个对象。如果两个对象指向的是同一个对象,则相等操作符返回true。
 
全等与不全等
 
全等操作符在比较值前不进行类型转换,全等操作符用3个等于号(===)表示,它只有在两个操作数未经转换就相等就会返回true。如下所示:
 
var num1 = "55";   
 var num2 = 55;      //  false
 
console.log(num1 == num2);      //  true
console.log(num1 === num2);    // false
 
不全等操作符由一个感叹号和两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下才返回true。具体代码如下:
 
var num1 = "55";   
 var num2 = 55;      //  false
 
console.log(num1 == num2);      //  true
console.log(num1 === num2);    // true
 
备注:undefined === null 会返回false,因为两者类型不相等。
 
 
条件操作符
 
var  num  = num1_expression ? true_num2 : false_num3;
 
详解:本质上,运行这行代码就是基于对num1_expression的求值结果,求值结果决定了num的值。如果num1_expression求值为true,则num的值为true_num2,如果num1_expression求值为false,则num的值为false_num3。
 
 
 

转载于:https://www.cnblogs.com/blsm/p/6617463.html

相关文章:

  • Runtime学习笔记
  • windows 下 TCP 端口转发
  • 2017大数据标准化论坛发布了第一批大数据系统测试结果,阿里云数加获得了大数据系统测试证书。...
  • idea java.lang.OutOfMemoryError: PermGen space
  • uml序列图
  • idea拉取SVN maven 多模块项目
  • 通过a标签直接下载图片或文本文档
  • 软件测试计划
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • StreamingPro 支持Spark Structured Streaming
  • 提交PR的git 流程
  • OAuth快速入门
  • 树莓派的kodi设置遥控器的方法
  • C# - 委托中的协变
  • Python学习笔记 字符串拼接
  • @angular/forms 源码解析之双向绑定
  • 【node学习】协程
  • Golang-长连接-状态推送
  • Python socket服务器端、客户端传送信息
  • 大整数乘法-表格法
  • 关于extract.autodesk.io的一些说明
  • 欢迎参加第二届中国游戏开发者大会
  • 技术发展面试
  • 排序(1):冒泡排序
  • 深度解析利用ES6进行Promise封装总结
  • 深入浅出Node.js
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微信小程序填坑清单
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目实战-Api的解决方案
  • 原生js练习题---第五课
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (12)目标检测_SSD基于pytorch搭建代码
  • (26)4.7 字符函数和字符串函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4) PIVOT 和 UPIVOT 的使用
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)学习JVM —— 垃圾回收机制
  • (蓝桥杯每日一题)love
  • (七)理解angular中的module和injector,即依赖注入
  • (图)IntelliTrace Tools 跟踪云端程序
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .net FrameWork简介,数组,枚举
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET6实现破解Modbus poll点表配置文件
  • .net与java建立WebService再互相调用
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /usr/bin/env: node: No such file or directory
  • @Autowired 与@Resource的区别
  • @KafkaListener注解详解(一)| 常用参数详解