当前位置: 首页 > 编程日记 > 正文

学习 JavaScript (四)核心概念:操作符

JavaScript 的核心概念主要由语法、变量、数据类型、操作符、语句、函数组成,前面三个上一篇文章已经讲解完了。后面三个内容超级多,这篇文章主要讲解的是操作符。

操作符

什么叫做操作符?

这是一种工具,帮助我们操作字符串、数字值、布尔值,乃至对象,运用一些操作符能够让代码更简洁、计算更高效。它包括以下几种:

  • 赋值操作符
  • 一元操作符(加、减)
  • 位操作符
  • 关系操作符
  • 相等操作符

01 赋值操作符

赋值操作符就是我们常见的 “=”,作用就是把右边的值赋给左边的变量。比如:

let a = 1;
复制代码

如果复杂一些(性能上不会有提升,看起来牛*一点而已),就是结合后面要碰到的操作符,变成这样:

*= ; // 乘/赋值// 举例
let num = 10;
num = num * 10; // 和下面的用法效果一样
num *= 10;下面的复杂赋值操作符如下:/= ; // 除/赋值
%= ; // 模/赋值
+= ; // 加/赋值
-= ; // 减赋值
<<= ; // 左移赋值;
>>=; // 有符号右移;
>>>= ; // 无符号右移;
复制代码

02 一元操作符

记住:只对一个数值进行操作的符号叫做一元操作符,而不是指操作符自身的数量。

递增操作:两个加号 ++

前置操作 ++i ,i 先自己加上 1 ,然后拿着计算后的 i 值进行下一步计算。

let i = 1;
let result = ++i + 20 
console.log(i) // 2
console.log(result) // 22
复制代码

后置操作 i++,先进行下一步计算,然后再自己加上1。

let i = 1;
let result = i++ + 20 
console.log(i) // 2
console.log(result) // 21
复制代码

递减操作:两个加号 --

递减操作和递增操作的规则一样,-- 符号在前面就先进行递减操作,否则就等接下来的计算进行完再递减。

前置操作 --i ,i 先自己减去 1 ,然后拿着计算后的 i 值进行下一步计算。

let i = 1;
let result = --i + 20 
console.log(i) // 0
console.log(result) // 20
复制代码

后置操作 i--,先进行下一步计算,然后再自己减去1。

let i = 1;
let result = --i + 20 
console.log(i) // 0
console.log(result) // 21
复制代码

统一记忆成:符号在前,马上加减

加和减操作符

前面讲的是两个相同的符号联合起来操作一个数值,而家下来介绍的这个操作符只有一个。

+ 或者 -,对于数值来说,+ 没有任何作用,对于 - 来说,把正数变成负数而已。

如果我们把操作符用在其他数据类型上,会发生怎样的情况呢?直接看例子:

let a = "01";
a = +a; // 1let b = "1.1";
b = +b; // 1.1let c = "z";
c = "z"; // NaNlet d = "true";
d = "true"; // 1let e = 1.1;
e = 1.1; // 1.1let o = {valueOf: function(){return -1;}
} // 如果没有看懂这个对象的写法,不用着急,后面会针对对象做进一步的解释。
o = +o ; -1
复制代码

-操作则是在+操作的结果前面加上负号(-)而已。其他类型的数据的转换规则依然不变。

03 位操作符

位操作符是在最基本的、最底层的水平上对数值进行操作,也就是在内存中直接对二进制进行操作。

JavaScript 中的所有数据都是按照 64 位存储的,但是位操作符并不能直接对 64 位的数据进行操作,而是将其转换成 32 位的,操作完成后,再转换成 64 位的,所以我们真正关心的是计算机如何操作 32 位的数值。

对于有符号的整数,二进制从右往左数,32 位中的前 31 位表示整数的值,第 32 位是符号位,表示数值的符号,0 表示正数,1 表示负数。比如 数值 18 表示成二进制为:

0     0000000000000000000000000010010
符号位复制代码

写成简洁版的:

10010
复制代码

31 位中每一位都表示 2 的幂,所以从二进制转换成数值:

(2^4 x 1) + (2^3 x 0) + (2^2 x 0) + (2^1 x 1) + (2^0 x 0) = 18
复制代码

这是正数的二进制表达方式,负数的二进制需要用到二进制补码。步骤如下:

  1. 求这个数值的绝对值的二进制;
  2. 求二进制反码,将 0 替换成 1,将 1 替换成 0 ;
  3. 得到的二进制反码加 1 ;

举一个例子(-18):

-18 的绝对值等于 18:

0     0000000000000000000000000010010
复制代码

求二进制反码:

1     1111111111111111111111111101101
复制代码

反码加 1

1     1111111111111111111111111101110
复制代码

最终得到的结果就是 11111111111111111111111111101110 。但是计算机给我们看的结果却不是这样,把 -18 转换成字符串会发现得到的结果是“-10010”,计算机隐藏了计算过程,直接展示友好的结果而已,别被骗了。

因为是底层操作,所以应用位操作的计算方式会比普通计算方式要快:


  • 按位非(NOT)
    • 符号:~ ;
    • 作用对象:一个数值(数字、字符串、布尔值、对象);
    • 操作:把操作数变成相反数再减去一 ;
    • 例子: ~2 == -3~-2 == 1~true == -2

  • 按位与(AND)
    • 符号:& ;
    • 作用对象:两个数值;
    • 操作:将两个数值的二进制形式中的每一位对齐,然后依据普通的与操作进行合并,把 1 看成 true,把 0 看成 false , 即 1 和 1 组合是 1 ,1 和 0 组合是 0 , 0 和 0 组合是 0 。得到的二进制再转换成 十进制就可以了;
    • 例子: 25 & 3 == 1

  • 按位或(OR)
    • 符号:| ;
    • 作用对象:两个数值;
    • 操作:和按位与的操作类似,与之不同的是,按位或操作时,只要碰到 1 就返回 1 ,只有两个对应的位全部为 0 时才返回 0 ;
    • 例子:25 | 3 == 27

  • 按位异或(XOR)
    • 符号:^ ;
    • 作用对象:两个数值;
    • 操作:有且仅有一个位是 1 ,另一个位是 0 ,才返回 1 ,否则都返回 0,即 1 和 1 也返回 0;
    • 例子:25 ^ 3 == 26

  • 左移
    • 符号:<< ;
    • 作用对象:一个数值;
    • 操作:将数值的所有位向左移动指定的位数,右侧多出来的空位由 0 进行填充;
    • 例子:2 << 5 == 64,2 向左移动 5 位,左移不会影响操作数的符号位,即 -2 ; ,左移后的结果将会是 -64。

  • 右移
    • 符号:>> ;
    • 作用对象:一个数值;
    • 操作:将数值的所有位向右移动指定的位数,符号位不动,左侧多出来的空位由 0 进行填充;
    • 例子:64 >> 5 == 2,64 向右移动 5 位,右移不会影响操作数的符号位,即 -64 ,右移后的结果将会是 -2。

  • 无符号右移
    • 符号:>>>;
    • 作用对象:一个数值;
    • 操作:将数值的所有位向右移动指定的位数,左侧多出来的空位由 0 进行填充,这个时候符号位也要向右移动。可以知道,对于正数而言,这个操作和右移是一样的结果,但是对于负数来说,因为符号位是 1 ,移动后要计入最终结果;
    • 例子:-64 >>> 5 == 134217726

04 布尔操作符

在上述位操作符中的按位非、按位与、按位或,我们已经简单介绍了一些跟布尔操作类似的用法。

总的来说,布尔操作的地位跟相等操作符(==、===)的地位是一样的,一共右三种:非(NOT)、与(AND)、或(OR)。


  • 逻辑非

    • 符号:!;
    • 作用对象:一个数值;
    • 操作:先将数值转换成一个布尔值,再取反;
    • 例子:
    false; //truetrue; //false
    !null; //true
    !{}; // false
    !0; //true
    !123; //false""; //true"abc"; //false
    复制代码

要点:此时连用两个 “!”,则跟布尔转换函数 Boolean() 的作用是一样的,即还原了数值本身代表的布尔值。


  • 逻辑与
    • 符号:&&;
    • 作用对象:两个数值;
    • 操作:比较两个数值的布尔值,返回结果(不一定是布尔值);
    • 例子:
    true && true; //true
    true && false; //false
    false && true; // fasle
    false && false; // false
    复制代码

要点:

  1. 这里的 true 和 false,可以替换成别的数值类型,比如对象、null等
  2. 逻辑与是短路操作,只要第一个操作数或者操作数的转换值是 false ,计算终止,直接返回 false 。如果是 true 的话再返回后面的值。
  3. 在写判断语句的时候经常会用到。

  • 逻辑或
    • 符号:||;
    • 作用对象:两个数值;
    • 操作:比较两个数值的布尔值,返回结果(不一定是布尔值);
    • 例子:
    true || true; //true
    true || false; //true
    false || true; // true
    false || false; // false
    复制代码

要点:

  1. 逻辑或也是短路操作,只要第一个操作数或者操作数的转换值是 true ,计算终止,直接返回第一个操作数。如果是 false 的话,返回第二个操作数。
  2. 利用逻辑或的性质,我们在定义变量的时候可以给它找个备胎,降低 Bug 发生率。

04 乘性操作符

乘性操作符包括三种:乘法、除法、求模。在 JavaScript 中,操作数为非数值的情况下也能计算。比如:

"10" * 2 ; // 计算结果为 20
复制代码

可以看得出来,计算机自动执行了类型转换,如果参与的操作数不是数值,会先用 Number() 函数转换。

  • 乘法:
    • 符号: *
    • 举例:4 * 5

有三点需要注意:

  1. 乘积超过 JavaScript 范围,用 Infinity表示无穷大 或者 -Infinity 表示负无穷大;
  2. Infinity 和 0 相乘是 NaN;
  3. 其中一个操作数是 NaN,则结果是 NaN。因为 Number() 转换非数值型字符串是 NaN,所以非数值型字符串和数字相乘就是 NaN 。其他的规则与乘法操作符类似。

  • 除法:
    • 符号: /
    • 举例:44 / 11 ;等于 4 有一点需要注意:如果 Infinity 被 -Infinity 除,那么结果是 NaN。

  • 求模:
    • 符号: %
    • 举例:26 % 5 ;等于 1

求模就是取余数。

05 加性操作符

加法和减法都被称作是加法操作符。在这里说明一下,加性操作符也会强制转换数据类型。

  • 加法:
    • 符号: +
    • 举例:1 + 1

需要注意的是,

  1. 如果两个操作数都是字符串,那么直接拼接起来返回结果;如果其中一个操作数是字符串,那么就把另一个操作数转换乘字符串再拼接起来。
  2. 利用 Chrome 的 console 命令窗口,实验得到如下的规则:
{} + 11; // 11
11 + {}; // "11[object,object]"false + 1; // 1 ; 操作数可以调换位置,结果不变
true + 1; // 2 ; 同上
null + 1;// 1 ;同上
undefined + 1 ; // NaN;同上复制代码

  • 减法:
    • 符号: -
    • 举例:2 - 1

减法两边的操作数和加法的区别是,无论是字符串还是对象,都应该转换成数值,再进行计算。不存在字符串相减的情况。

06 关系操作符

关系操作符就是小学的时候学过的小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)。

JavaScript 中,使用关系操作符比较两个操作数后,返回的结果是布尔值(true、false)。

需要注意的是,

  1. 当比较的两个数都是数值时,直接比数字大小;

  2. 如果都是字符串则比较对应位置的字符编码值。比如:

    "Brick" < "apple"; //返回的是 true,因为 B 的字符编码是 66 ,而 a 的字符编码是 97"23" < "3"; // 返回 true,因为 2 的字符编码是 50 ,3 的字符编码是 51 。
    复制代码
  3. 如果其中一个是数字,则把另一个操作数变为数值以后再比较;

  4. 任何数据类型和 NaN 比较都是返回 false。

这里有个小思考:如果 A、B 表示两个数据,有 A > B 不成立(false),则 A <= B 是否成立?

07 相等操作符

JavaScript 提供两种比较方案:

  • 相等(==)和不相等(!=),会把操作数转换成相似的类型再比较。

    "5" == 5; //true
    复制代码
    • null 和 undefined 是相等的;
    • 如果有一个操作数是 NaN 则返回 false ;
    • NaN 和 NaN 不相等,NaN 返回 true ;
  • 严格相等(===)和严格不相等(!==),直接比较,不转换数据类型,使用严格相等操作符,有一丁点不相等就返回 false。

    "5" === 5; //false
    复制代码
    • null 和 undefined 是不严格相等的

总之,在实际使用过程种,建议是使用严格相等和严格不相等。

08 条件操作符

条件操作符也被称作是三目运算符,用法如下:

let a = 条件语句 ? 1 :2如果条件语句返回的是 true ,则把 1 赋值给 a,如果是 false, 则把 2 赋值给 a。
复制代码

返回一个较大值,我们就可以不用谢一个 if 语句,直接按照下面这种写法就可以实现:

let a = (number1 > number2) ? number1 : number2
复制代码

欢迎大家关注微信公众号:可视化技术( visteacher )

不仅有前端和可视化,还有算法、源码分析、书籍相送

个人网站:blog.kurryluo.com

各个分享平台的 KurryLuo 都是在下。

用心学习,认真生活,努力工作!

相关文章:

(C++)1011 World Cup Betting

笔记&#xff1a;我觉得这一次的代码很优雅 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std;int maxPro(double a[3]){//返回值最大的下标 int idx0,max_pro0;for(int i0;i<3;i){if(a[i]>max_pr…

Ext学习-前后交互模式介绍

在前后台交互模式的介绍中&#xff0c;实际上就是Store中Proxy相关的内容&#xff0c;比如Ajax提交。 所以详细的文档请参考&#xff1a; Ext学习-基础概念&#xff0c;核心思想介绍 中关于数据模型和MVC结构部分。 作者&#xff1a;sdjnzqr 出处&#xff1a;http://www.cnblog…

让你彻底明白什么叫游戏引擎(1)

在阅读各种游戏介绍的时候我们常常会碰见“引擎”&#xff08;Engine&#xff09;这个单词&#xff0c;引擎在游戏中究竟起着什么样的作用&#xff1f;它的进化对于游戏的发展产生了哪些影响&#xff1f;希望下面这篇文章能为大家释疑。以希望能够帮助一些刚进入游戏行业的小菜…

185.dubbo 后台管理系统

2019独角兽企业重金招聘Python工程师标准>>> 1. 效果及目的 效果&#xff1a; 目的&#xff1a;查看 管理服务 2. 启动要求 &#xff08;1&#xff09;项目是dubbo &#xff08;2&#xff09;jdk 1.7 (3) dubbo的war要与zookeeper在同一台服务上 3. 安装zookeeper 要…

(C++)1027 打印沙漏

笔记&#xff1a;星号右边的空格不用打印 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std;int main(){int n;char c;scanf("%d %c",&n,&c);int clock[23];int col;for(int i1;i<…

黑帽大会2014:10个酷炫的黑客工具

http://www.csdn.net/article/2014-08-21/2821304 用于恶意软件分析的Maltrieve 安全研究人员使用Maltrieve工具收集服务器上的恶意软件。通过这个开源工具&#xff0c;恶意软件分析人员可以通过分析URL链表和已知的托管地址获得最新鲜的样本。 Kyle Maxwell是VeriSign的一名威…

C#无符号右移

/// <summary>/// 无符号右移&#xff0c;与JS中的>>>等价/// </summary>/// <param name"x">要移位的数</param>/// <param name"y">移位数</param>/// <returns></returns>public static int …

1027 Colors in Mars

笔记&#xff1a;本题属于进制转换&#xff0c;但是考察的重点不在除基取余上&#xff0c;因为转化得到的数只有两位&#xff0c;很容易得到每位上面应该是什么&#xff0c;但是和其他题不同的地方在于&#xff0c;每位可填的不见得是0~9&#xff0c;还包括ABC&#xff0c;这就…

json对象和json字符串转换方法

在WEB数据传输过程中&#xff0c;json是以文本&#xff0c;即字符串的轻量级形式传递的&#xff0c;而客户端一般用JS操作的是接收到的JSON对象&#xff0c;所以&#xff0c;JSON对象和JSON字符串之间的相互转换、JSON数据的解析是关键。 先明确2个概念例如&#xff1a; JSON字…

python-docx操作

import docx# 读取docx文档内容def readWord():doc docx.Document(demo.docx)fullText []for para in doc.paragraphs:fullText.append( para.text)print(\n . join(fullText))readWord()官方API&#xff1a;https://python-docx.readthedocs.io/en/latest/index.html ;转载…

javascript中FORM表单的submit()方法经验教训.

author songfeng 因为JS内对象的方法实际上是存储语句的一个类似于指针的东西. 其指向了内存的一个位置, 也就是其函数的位置,当然也可以让其指向一个变量值. var foo new Object();foo.bar function() {} //现在foo.bar就是指向了这个函数的内存位置.foo.bar &q…

1058 A+B in Hogwarts

笔记&#xff1a;和乙级的在霍格沃兹找零钱不同&#xff0c;这里不需要判断给出的两个数的大小&#xff0c;也没必要先都换算成最小的单位&#xff0c;可以直接从最低位开始加&#xff0c;如果超过该位的范围&#xff0c;则向上一位进一即可。 #include<cstdio> #includ…

DDD领域驱动设计之聚合、实体、值对象

关于具体需求&#xff0c;请看前面的博文&#xff1a;DDD领域驱动设计实践篇之如何提取模型&#xff0c;下面是具体的实体、聚合、值对象的代码&#xff0c;不想多说什么是实体、聚合等概念&#xff0c;相信理论的东西大家已经知晓了。本人对DDD表示好奇&#xff0c;没有在真正…

C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序

Win32 平台是 消息驱动模式.Net 框架是 事件驱动模式标题所指的 “控制外部程序”&#xff0c;外部程序是指与本程序无内在相关性的另外一个程序 基于上面提到的&#xff0c;对于.NET的winform程序&#xff0c;在默认情况下&#xff08;即未对接收消息的事件做自定义处理&#…

springMVC swagger2

参考地址&#xff1a;https://www.cnblogs.com/exmyth/p/7183753.html https://blog.csdn.net/programmer_sean/article/details/72236948 1. maven 依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId&…

1061 Dating

笔记&#xff1a; 第一个输出根据的是大写字母 第二个输出根据的是0-9andA-N 第三个输出根据的是大写字母和小写字母 知道范围便方便确定边界 两两比对时&#xff0c;先遍历一个字符串&#xff0c;遇到在范围内的字符&#xff0c;看其和第二个字符串同位置的字符是否相等 …

PA 项目创建任务

---- 创建任务 DECLAREp_project_id NUMBER : 155233;p_task_number VARCHAR2(240) : CXYTEST0001;p_task_name VARCHAR2(240) : 接口测试CXYTEST0001;p_task_description VARCHAR2(240) : TASKCXYTEST0001;p_scheduled_start_date DAT…

SSM登陆拦截器实现

首先在springmvc中配置拦截器 <!-- 配置拦截器 --><mvc:interceptors><mvc:interceptor><!-- 拦截所有mvc控制器 --><mvc:mapping path"/**"/><!-- mvc:exclude-mapping是另外一种拦截&#xff0c;它可以在你后来的测试中对某个页面…

AGG 学习笔记

我了解的&#xff21;&#xff27;&#xff27;的总体结构按照文件大致分为&#xff1a;   &#xff11;&#xff09;基本定义&#xff08;config,basics....)&#xff1b;   &#xff12;&#xff09;基本操作、类型&#xff08;主要供&#xff21;&#xff27;&#xff2…

1073 Scientific Notation

笔记&#xff1a;这是我迄今为止写过的最复杂的字符串处理算法题。 收获&#xff1a;分而治之&#xff0c;想不清楚就自己设计测试用例和结果。列举然后归类。 以下是程序流程图 #include<cstdio> #include<cmath> #include<cstring> #include<algorith…

几个笔试题目总结

1、阿里某个笔试题&#xff0c;两个字符串text&#xff0c;query&#xff0c;找到text中包含的最长的query的字串&#xff1a; public static String subStr(String text, String query) {if (text ! null && query ! null) {int length query.length();for (int i 0…

baidu mp3竟然还加密,太扯了

baidu mp3竟然还加密&#xff0c;太扯了 public class BaiduHelper { static int F 0; static string I "", J ""; static string O ""; static string E ""; static int[] K new int[1000…

Ubuntu 之linux与windows互传文件

Windows系统下与linux传输文件 windows环境下&#xff0c;windows传出数据到linux下 确保ubuntu安装了ssh服务端。如果没有安装&#xff0c;使用以下命令安装&#xff1a; sudo aptget install ssh service sshd restart 2.windows下下载pscp.exe软件从PuTTY官方网站下载pscp.e…

1048 数字加密 --非满分

16/20 非满分&#xff0c;待来日复习双指针再分析原因 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<bits/stdc.h> using namespace std;void reverStr(char str[]){int len strlen(str);for(int i0;i&l…

端到端对话模型新突破!Facebook发布大规模个性化对话数据库

作者&#xff5c;Pierre-Emmanuel Mazare 等译者&#xff5c;郝毅编辑&#xff5c;Debra出处丨 AI 前线AI 前线导读&#xff1a;聊天机器人是目前非常流行的一种人工智能系统。目前大部分聊天机器人的衔接性都不是很好&#xff0c;尤其是在没有主动的重调优策略下训练出的端到端…

上传文件大小的配置Webcong

修改Webcong文件:<system.web><httpRuntime maxRequestLength"40690" useFullyQualifiedRedirectUrl"true" executionTimeout"6000" useFullyQualifiedRedirectUrl"false" minFreeThreads"…

1001 A+B Format

由于逗号的有无是从末尾数起&#xff0c;满足三个数(且高位还有数)就加逗号&#xff0c;所以有必要把字符串反转&#xff0c;然后寻找数组下标和3的关系 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace st…

[转]数据库建立索引的一般依据

建立索引常用的规则如下&#xff1a; 1、表的主键、外键必须有索引&#xff1b; 2、数据量超过300的表应该有索引&#xff1b; 3、经常与其他表进行连接的表&#xff0c;在连接字段上应该建立索引&#xff1b; 4、经常出现在Where子句中的字段&#xff0c;特别是大表的字段&…

为图片添加半透明遮罩效果

平时为图片添加半透明遮罩效果&#xff0c;我的做法如下&#xff1a;利用标签i实现背景半透明遮罩。当鼠标hover时, 提高i的背景色透明度值background-color: rgba(0, 0, 0, .6) <p class"opacity-black-position"><a href"#"><img src&quo…

linux下typora安装

# optional, but recommended sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE# add Typoras repository sudo add-apt-repository deb https://typora.io ./linux/ sudo apt-get update# install typora sudo apt-get install typora