JavaScript运算符

算数运算符

运算符 + - * / %

+ 加号运算符

功能:

1.对数字代数求和

2.对字符串进行连接

3.将一个数值转换成字符串 ——>数值+""

注意:任何数据类型+字符串都等于字符串

字符串拼接时:

数值+字符串——>将数值直接转为字符串拼接

字符串+字符串——>两者直接拼接

- 减号运算符

功能:

1.对数值进行减法操作;

2.对操作数进行“取反”操作;

3.将字符串转换成数值;数值型字符串-0=该数值,非数值-0==NaN

*  / 乘号、除号运算符

功能:对两个数进行乘法或除法运算

正负规则:同号为正,异号得负

% 取余运算符

两个数相除取余数。

余数是正还是负,和第一个运算数的符号相同

复合赋值运算符  += -= *=  /= %=

分别相加、相减、相乘、相除和取余后赋值。


自增和自减运算符

++  --

对唯一的运算数进行递增或者递减操作(每次加1或者减1)

注意点:

1.运算数必须是一个变量、数组的一个元素或者对象的属性

2.如果运算数是非数值则运算符会将它转成数值直接返回,不会再+或-

3.符号位置决定运算结果:

运算数之前——>先进行递增或者递减,再进行求值

运算数之后——>先求值,再进行递增或者递减操作


关系运算符(比较运算符)

大小运算 >  <  >=  <=

如果左边  大于/小于/大于等于/小于等于  右边,返回true,否则返回false

操作规则:

1.数值与数值比较——>比较代数值

2.仅一个运算数是数值——>将另一个运算数转成数值,并比较它们的代数值

3.字符串与字符串——>逐个字符比较它们的Unicode数值

4.字符串与非数值——>将运算数转换成字符串进行Unicode比较

5.运算数即非数字也非字符串——>转换成数字或者字符串后进行比较

6.运算数无法转换成数值或者字符串——>返回false

7.与NaN比较——>返回false

等值运算

相等比较==    !=

比较两个运算符的返回值,看返回值是否相等或不等

存在类型转换:

布尔值:true-----1;false-----0;

对象:调用valueOf()

字符串与数值比较:字符串转换成数值

比较原则:

1.null与undefined相等

2.NaN不等于任何数值,包括自身

3.对象,是不是同一对象,是的话 == 是true

相同比较  ===   !==

不存在隐示类型转换的绝对等于和绝对不等于,比较两个运算数的返回值及数据类型是否相同或不同

比较原则:

1.只有数据类型和数值相同才为相同

2.原始值和引用值之间是绝对不等于

3.引用值之间比较的是它们的引用(内存地址)


对象运算符

in:判断左边是否是右边的成员

instancesof:判断左边对象实例是否是右边的这个类或构造函数构造出来的

new:创建并初始化一个新的对象

delete:删除指定对象的属性,数组元素或者变量

.和[]:存取对象和数组元素

():函数调用,改变运算符的优先级等    


逻辑运算符

&&逻辑与

规则:

1.第一个操作数是对象,返回第二个;

2.第一个操作数值为true,第二个为对象时,返回第二的对象;

3.两个都是对象时,返回第二个;

4.其中一个操作数是null或者undefined或者NaN时,对应返回null、undefined、NaN,如果同时是这三个值中的两个,返回第一个数;(暂时感觉0也是这个规律)

特性:

1.当且仅当两个运算数的值为true时,返回true,否则返回false;

2.短路操作:当第一个操作数的值是false时,则不再对第二个操作数进行求值了,返回第一个。

|| 逻辑或

规则:

1.第一个操作数是对象,返回第一个;

2.第一个操作数值为false,返回第二个;

3.两个都是对象时,返回第一个;

4.两个操作数是null或者undefined或者NaN时,对应返回null、undefined、NaN(0也是这个规律)

特性:

1.当且仅当两个运算数的值为false时,返回false,否则返回true;

2.短路操作:当第一个操作数的值是true时,则不再对第二个操作数进行求值了,返回第一个。

!逻辑非

非运算符返回值的为true的有:undefined、null、NaN、0、""

false的有:对象、非空字符串、非0数值

特性:

1.当运算的值为false则返回true,否则返回false。

2.连续使用两次,可将任意类型转成布尔值(true or false)。


位运算符

基础知识:

1.类型:

(1).有符号:数字位是 前31位  ,符号位是第32位

(2).无符号:只能是正数,第32位表示数值,数值范围可以加大

2.数值范围:-2147483648到2147483647

3.存储方式:

正数:纯二进制存储,31位中每一位表示2的幂,用0补充无用位

负数:2进制补码存储,补码的计算步骤:

(1.确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)

(2.求得二进制反码,即要把 0 替换为 1,把 1 替换为 0

(3.在二进制反码上加 1

4.当做0来处理的特殊值NaN和Infinity

逻辑位运算

返回值为1的:按位非~0、按位与&对应位全是1、按位或| 任何一位是1、按位异或^ 即不同时为1也不同时为0    

返回值为0的:按位非~1、按位与&任意一位是0、按位或| 对应位全位0、按位异或^ 对应位全0或全1    

位移操作:

左移<<:将数值的所有位左移指定的位数,所有空位用0补充。左移1位对其乘2,左移2位对其乘4,以此类推;

有符号右移>>:将数值的所有位右移指定的位数,移出的位被舍弃,保留符号位,右移1位对其除2,右移2位对其除4,以此类推(在舍弃移出位后的基础上除);

无符号右移>>>:

正数:与有符号右移结果相同

负号:会出现无限大的数值

复合赋值运算符 

位操作符与等号结合,复合赋值不会有性能方面的提升   


其他运算符

1.?:  条件运算符,又叫三目运算符,是简洁的if else

2.typeof 类型判定运算符

3.逗号操作符,在一行语句中执行多个不同的操作,特殊的(1,2)会看一眼第一个,然后返回第二个数。



*以下是关于位运算符知识,来至于官方文档:ECMAScript 位运算符

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。

ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数,

有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647。

可以以两种不同的方式存储二进制形式的有符号整数,一种用于存储正数,一种用于存储负数。正数是以真二进制形式存储的,前 31 位中的每一位都表示 2 的幂,从第 1 位(位 0)开始,表示 20,第 2 位(位 1)表示 21。没用到的位用 0 填充,即忽略不计。

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:

1.确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)

2.求得二进制反码,即要把 0 替换为 1,把 1 替换为 0

3.在二进制反码上加 1

有趣的是,把负整数转换成二进制字符串后,ECMAScript 并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。

var iNum = -18;

iNum.toString(2);//输出 "-10010"

这段代码输出的是 "-10010",而非二进制补码,这是为避免访问位 31。为了简便,ECMAScript 用一种简单的方式处理整数,使得开发者不必关心它们的用法。

另一方面,无符号整数把最后一位作为另一个数位处理。在这种模式中,第 32 位不表示数字的符号,而是值 231。由于这个额外的位,无符号整数的数值范围为 0 到 4294967295。对于小于 2147483647 的整数来说,无符号整数看来与有符号整数一样,而大于 2147483647 的整数则要使用位 31(在有符号整数中,这一位总是 0)。

把无符号整数转换成字符串后,只返回它们的有效位。

注意:所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。

~位运算 NOT

位运算 NOT 由否定号(~)表示

~位运算 三步的处理过程:

1.把运算数转换成 32 位数字

2.把二进制数转换成它的二进制反码

3.把二进制数转换成浮点数

注:~位运算 实质上是对数字求负,然后减 1

& 位运算 AND

位运算 AND 由和号(&)表示,直接对数字的二进制形式进行运算。它把每个数字中的数位对齐,然后用对应的规则对同一位置上的两个数位进行 AND 运算(两个1才为1,否则为0)

| 位运算 OR

位运算 OR 由符号(|)表示,也是直接对数字的二进制形式进行运算。在计算每位时,OR 运算符采用OR对应的规则计算(有1即为1,否则为0)

^  位运算 XOR

位运算 XOR 由符号(^)表示,当然,也是直接对二进制形式进行运算。XOR 不同于 OR,当只有一个数位存放的是 1 时,它才返回 1。(相同为0,不同为1)

左移运算 <<

左移运算由两个小于号表示(<<)。它把数字中的所有数位向左移动指定的数量的空位,用 0 填充这些空位。

注意:左移运算保留数字的符号位,即符号仍然存储在第 32 位中

有符号右移运算    >>

有符号右移运算符由两个大于号表示(>>)。它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。

同样,移动数位后会造成空位。这次,空位位于数字的左侧,但位于符号位之后。ECMAScript 用符号位的值填充这些空位,创建完整的数字

无符号右移运算 >>>

无符号右移运算符由三个大于号(>>>)表示,它将无符号 32 位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。

对于负数,情况就不同了。

无符号右移运算用 0 填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理。

由于无符号右移运算的结果是一个 32 位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字,如何得到这种结果的呢?

要实现这一点,需要把这个数字转换成无符号的等价形式 如:-64 >>> 0;

然后,用 Number 类型的 toString() 获取它的真正的位表示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,本章逐一介绍这些运算...
    徵羽kid阅读 659评论 0 0
  • 运算符,加减乘除一直都是语言的基础,和小学数据逻辑也很接近,可以说是简单的已经不能再简单了。但是在js中,总有让你...
    秋殇灬阅读 166评论 0 0
  • 本章将会介绍 模块和源文件访问级别访问控制语法自定义类型子类常量、变量、属性、下标构造器协议扩展泛型类型别名位运算...
    寒桥阅读 874评论 0 2
  • 运算符 JavaScript中运算符主要用于连接简单表达式,组成一个复杂的表达式。常见的有算数表达式、比较表达式、...
    阿鲁提尔阅读 281评论 0 1
  • 这几日,国庆放假,在微信中得知身边的好多人都出去了,也都传来了一些感受和图片。没能出去,并不见得比他们获得的信息少...
    卡斯特罗梁阅读 159评论 0 0