JS 运算符

算术运算符

  • 加减乘除 
1 + 1 // 2
1 + true // 2
'a' + 'bc' // "abc"
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"

1-1
// 0

2*2
// 4

2/0
// Infinity
  • 余数 %
10%7
//3

-1%7
//-1
  • 指数 ** 
6**2
// 36

7**3
// 343
  • 自增自减 x++ / ++x / x-- / --x
let a=1
a++
1
a
// 2

let b=2
++b
3
b
// 3

let c=5
c--
5
c
// 5

let d = 10
--d
9
d
// 9
  • 数值运算符 +x
+true // 1
+[] // 0
+{} // NaN
  • 负数运算符 -x
var x = 1;
-x // -1
-(-x) // 1
  • 加法运算符存在重载,字符串的位置不同会导致不同的结果
  • 减法、除法和乘法,都是将字符串自动转为数值,然后再运算
  • 如果运算子是对象,必须先转成原始类型的值,然后再相加
  • 余数运算符运算结果的正负号由第一个运算子的正负号决定
  • 尽量少用自增自减
  • x++ 和 ++x   x在前,值为前;x在后,值为后
  • 不同类型不要相加
  • 数值运算符的作用在于可以将任何值转为数值
  • 负数运算符也具有将一个值转为数值的功能,只不过得到的值正负相反。连用两个负数值运算符,等同于数值运算符,连用两个负号需要用圆括号,不然会变成自减运算符
  • 数值运算符号和负数运算符,都会返回一个新的值,而不会改变原始变量的值
  • 字符串只支持 + 运算
  • 如果数字 + 字符串,会将数字先变为字符串
  • 如果数字 - 字符串,由于字符串不支持 - 号,所以会将字符串变为数字

比较运算符

  • >
'cat' > 'dog' // false
5 > '4' // true
true > false // true
  • <
  • >=
  • <=
  • ==
  • !=
  • ===
1 === "1" // false
true === "true" // false
+0 === -0 // true
undefined === undefined // true
null === null // true
NaN === NaN  // false
  • !==
1 !== '1' // true
// 等同于
!(1 === '1')

比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件

对于非相等的比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较 Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小

JS 三位一体

  • 0 == []
  • 0 == '0'
  • 0 == '\t'
  • 右边三个互不相等
  • == 会自动转换类型,尽量使用 ===

x == y 真值表

  • [] == false 但不是 falsy
  • [] == false 但 {} 却不是 
  • [[]] == false

x === y 真值表

  • 基本类型看值是否相等
  • 对象看地址是否相等
  • [] !== []
  • {} !== {}

唯一特例 NaN !== NaN

布尔运算符

或且非

  • ||
  • &&
  • !


短路逻辑

  • 防御性编程 console && console.log && console.log('hi')
  • 以防 console 不存在报错
  • a = a || 100
  • a 的保底值

二进制运算符

或、与、否

  • | 两个位都为0,则结果为0,否则为1
  • & 两个位都为1,则结果为1,否则为0 
  • ~ 1变0,0变1,会以补码的形式变为负数
  • (0b1111 | 0b1010).toString(2)
    // "1111"
    
    (0b1111 & 0b1010).toString(2)
    // "1010"
    
    (~0b1111).toString(2)
    // "-10000"

异或

  • ^ 两个位相同,则结果为0,否则为1
(0b1111 ^ 0b1010).toString(2)
// "101"

左移右移

  • << 和 >>
(0b0010 >> 1).toString(2)
// "1"
(0b0010 << 1).toString(2)
// "100"
(0b0011 >> 1).toString(2)
// "1"
(0b0011 << 1).toString(2)
// "110"

头部补零的右移运算符

  • >>>

使用与运算符判断奇偶

  • 偶数 & 1 = 0
  • 奇数 & 1 = 1
  • 让一个数字与0b001做与运算,可以知道它的最后一位是1还是0
7 & 0b001
// 1

8 & 0b001
// 0

使用~, >>, <<, >>>, |来取整

  • console.log(~~ 6.83)    // 6
  • console.log(6.83 >> 0)  // 6
  • console.log(6.83 << 0)  // 6
  • console.log(6.83 | 0)   // 6
  • console.log(6.83 >>> 0)   // 6

使用^来交换 a b 的值

var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)   // 8
console.log(b)   // 5
let a =1 
let b =2
[a,b]=[b,a]
a
// 2
b
// 1

点运算符

语法

  • 对象.属性名 = 属性值

作用

  • 读取对象的属性值

不是对象,为什么也可以有属性?

  • 'a-b-c'.split('-')
  • JS 有特殊逻辑,点前面不是对象,就把它封装成对象
  • number 会变成 Number 对象
  • string 会变成 String 对象
  • bool 会变成 Boolean 对象
  • 一般不用这三种对象,只用简单类型

void 运算符

语法

  • void 表达式或语句

作用

  • 求表达式的值,或执行语句
  • 然后 void 的值总是为 undefined

需求

  • <a href="http://example.com" οnclick="f(); return false;">点击</a>
  • return 假值可以阻止默认动作
  • <a href="javascript: void(f())">文字</a>
  • 改用 void 可以炫技

逗号运算符

语法

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

作用

  • 将表达式 n 的值作为整体的值

使用

  • let a = (1,2,3,4,5)
  • 那么 a 的值就是 5
  • let f = (x) => (console.log('平方值为'), x*x)
  • 注意上面的括号不能省

运算符优先级

  • 优先级就是先算什么后算什么
  • 圆括号优先级最高
  • 下表中故意不包含展开语法 —— 原因可以引用 Stack Overflow 上的一个回答,“展开语法不是一个运算符,因此没有优先级。它是数组字面量和函数调用(和对象字面量)语法的一部分。”

*本文为鲲游北冥的原创文章,著作权归本人和饥人谷所有,转载务必注明来源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值