博客
关于我
4-22 JS运算符(算术、比较、布尔、二进制、点、void、逗号、优先级)
阅读量:228 次
发布时间:2019-02-28

本文共 3093 字,大约阅读时间需要 10 分钟。

目录

  • 算术运算符
  • 比较运算符
  • 布尔运算符
  • 二进制位运算符
  • 其他运算符

算术运算符

1.number运算

  • 加减乘除:直接正常输入运算+ - * /
  • 余数:x%7返回值是余数
    难点:-1%7=-1
    一个数除以另一个数,要是比另一个数小的话,商为0,余数就是它自己。
  • 指数:x ** 3x的三次方
  • 自增自减:x++ / ++x / x-- / --x只加/减一个数字
    x在前,表达式的值就是取之前的状态,x在后同理
    简单来说:x在前,值为前,x在后,值为后
    在这里插入图片描述
    特殊案例:
    在这里插入图片描述
  • 求值运算符:+x
    加号后面取任何数,相当于求这个数的值(不是取正,负数还是负)
  • 负数运算符:-x
    取负,负负得正

2.string运算

  • 连接运算 ‘123’+‘456’
    字符串只支持一个符号运算,那就是加号(没有减法乘法这些)

3.特殊套路

JS的加法如果发现你不按套路出牌,如提交 数字+字符串,它就会先把数字变成字符串,然后再把两个字符串加起来。而当提交 数字-字符串时,就会把字符串转化为数字,然后相减。

4.忠告

  • 尽量少用自增和自减找代替
    a++等价于a+=1(a=a+1)
    例外:一般只在for循环中用i++,因为这是约定俗成的写法
  • 不同类型的东西不要加起来,如 数字和字符串

比较运算符

  • >
  • <
  • >=
  • <=
  • ==:模糊相等
  • !=:不模糊等
  • ===:全等
  • !==:不全等

1.JS三位一体

在这里插入图片描述

  • 0==[]0=='0'0=="\t"
  • [] != '0'[] != "\t"'0' != "\t"
  • 内圈三个都相等,外圈三个都不等

忠告:永远不要使用==,用===,前者总是自动进行类型转换

2.x===y真值表

  • 基本类型看值是否相等
  • 对象看地址是否相等
  • 类型不同,直接不想等
  • 注意:[] !== []
    根据内存图来判断,数组是对象,对象都有地址,两个空数组的地址不同,因此不相等。
  • 特例:NAN !== NAN强行记忆

布尔运算符

1.或且非

  • ||:或
  • &&:且
  • !:非

2.短路逻辑

  • console && console.log && console.log('hi')
    等价于console?.log?('hi')(后者是可选链语法,下个版本出)
    以防console不存在报错
    IE里面没有console或者console被人改写了,运行就会报错,因此做个自我保护,确保有console才运行console,这样确保不存在也不会报错(console.log同理)。
//防御性编程if(console){     if(console.log){       console.log('hi')  }}
  • a = a||100
    a的保底值是100,如果a不存在,则让a=100
    等价式子:下列为等价式子,直接在变量处给出n=0,则说明,当n为nullundefined的时候n=0(空字符串时则返回字符串"1")
function add(n=0){     return n+1}

二进制运算符(用得少,常考)

1.或、与、否(只对二进制数有效)

二进制数标志:0b
如:0b11=3
注意:二进制默认转化为十进制,要用toString才能显示二进制
格式:(二进制数).toString(2)

  • |:或
    两个二进制数对应位进行比较,都是0则结果为0,否则为1
    如:(0b1111 | 0b1010).toString(2)要变成字符串形式,括号内表示二进制
    在这里插入图片描述
  • &:与
    两个都为1,才是1
  • ~:否,1变0,0变1(研究一下补码)

2.异或

  • ^
  • 如果两个二进制数对应位值相同,则结果为0,否则为1
    在这里插入图片描述

3.左移右移

  • <<>>
  • 二进制整体所有的数字往左/右移动1位,缺位补0,移出去的就不要了
    在这里插入图片描述

4.头部补零的右移运算符

  • >>>
  • 几乎等同于右移

5.常考面试题

  • 使用与运算符判断奇偶
    偶数 & 1 = 0
    奇数 & 1 = 1
    (数字).toString(2):变成二进制数,末尾为1则是奇数,为0则是偶数
    0001:让一个数字和做与运算,可以知道它最后一位是1还是0
  • 使用~、>>、<<、>>>、|来取整
    console.log(~~ 6.83) // 6:二进制取反再取反,且二进制不支持小数,因此在计算时就把小数抹去了
    console.log(6.83 >> 0) // 6:往右移0位,位运算(二进制)会消除小数
    console.log(6.83 << 0) // 6
    console.log(6.83 | 0) // 6:任何数字和0做或运算还是数字本身,位运算(二进制)会消除小数
    console.log(6.83 >>> 0) // 6
  • 使用^来交换 a b 的值
    JS渐变方法:[a,b] = [b,a]
    位运算:a ^= b, b ^= a ,a ^= b(三次异或,跟负负得正原理有点像)

点运算符

1.语法

  • 对象.属性名
  • 对象.属性名 = 属性值

2.作用

  • 读取或设置对象的属性值

3.疑问

  • 疑问一:点只能用在对象上,但当:
    var a = 1
    a.toString()a是个数字,为什么可以使用点
  • 解答一:JS会自动把a变成对象,当我们写a.toString的时候要做三件事(创用滚)
    1.发现a不是对象,JS就把a变成对象
    变化过程:运行a.toString(而数字没有toString)——创建一个新对象a'(封装对象)——将1放进封装对象——并使封装对象其拥有一个指向Number.prototype的原型
    2.调用封装对象的toString
    3.用完之后马上将封装对象删掉(封装对象都是一次性的)
    在这里插入图片描述
  • JS 有特殊逻辑,点前面不是对象,就把它封装成对象
  • number 会变成 Number 对象
  • string 会变成 String 对象
  • bool 会变成 Boolean 对象
  • 程序员从来不用这三种对象,只用简单类型
  • 这辈子都不要用new Number(),构造函数

void运算符

1.语法

  • void表达式或语句
    void console.log('hi'):就是打印出了hi

2.作用

  • 求表达式的值,或执行语句
  • 然后 void 会把得到的值扔掉,然后得到一个undefined
  • void唯一的作用就是得到一个 undefined

3.需求

逗号运算符

1.语法

  • 表达式1, 表达式2, …, 表达式n

2.作用

  • 将表达式 n 的值作为整体的值
  • 逗号会默认把最后一部分作为返回值
    在这里插入图片描述

3.使用

  • let f = x => (console.log('hi'),x+1)返回值是最后一个x+1
    注意:逗号一般要与括号连用,不然断句容易有问题,可以不写return又能写出两句的效果
    等价于:
let = x => {   console.log('hi')return x+1}

在这里插入图片描述

运算符的优先级

1.不同运算符

  • 1 + 2 * 3 是 (1 + 2) * 3 还是 1 + (2 * 3)
    先乘除后加减
  • ! a === 1 是 (! a) === 1 还是 ! (a === 1)
    的优先级高于===
  • new Person().sayHi() 是什么意思

2.相同运算符

  • 从左到右 a + b + c
  • 从右到左 a = b = c = d
    连续赋值:a = (b = (c = (d = 2)))

3.优先级就是先算什么后算什么

  • 一句话有多个操作符
  • JS的优先级这辈子都记不住,遇到优先级的题目直接放弃

4.技巧

  • 只记一个:圆括号优先级最高
  • 逗号最低
  • 不用记其他的,想要先算的就用括号括起来就行

转载地址:http://xbvi.baihongyu.com/

你可能感兴趣的文章
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>