- 概念
- 可符号,可关键字
- 一元、二元、三元运算符 # - +(正负号)是一元,*是二元, ?!是三元
- 期望与转型
- “3” * “5” # 期望数字, 自动转型
- 对类型依赖
-
- < # 数字则比较, 字符则比较字符表次序 - 左值(lvalue)
- 表达式只能出现在赋值运算(=)的左侧
- 内置函数可返回左值,自定义函数不可以
- 优先级
- 左右结合性
- 运算顺序
- 总是严格从左到右计算表达式
- 表达式会影响变量值(如++, —, delete)时,先执行
- b = (a++)+a # 计算b, 计算a++(返回的结果是1), 计算右边的a(结果是2), 计算等号右边(1 + 2), 赋值
- 关键字运算符
- delete, typeof, instanceof, in, void
- in运算符 # 判断是否存在属性, 左是字符串, 右是对象
- ‘toString’ in obj
- for( var i in ojb)
- instanceof运算符 # 判断是否实例, 会判断父类, (prototype chain)
- o instanceof f # 遍历原型链, 计算f.prototype, 然后在o原型链中查找f, 找到则返回true
- typeof 运算符 # 返回一个对象的类型描述字符串
- typeof value == “string” ? ”’” + value + ”’” : value
- typeof(value) # 可以写作函数的形式
- 返回值
- “undefined”, “object”, “boolean”, “number”, “string”, “function”
- null, 对象和数组 返回”object” # 函数是对象的一种,但typeof特殊对待。
- instanceof, class特性, constructor属性
- delete运算符 # 严格模式下删除失败会报错
- 删除属性, 成功则返回true
- 内置核心客户端属性不能删除
- var语句声明的变量不能删除
- function定义的函数和其参数不能删除
- void运算符
- 写在操作数前,操作数照常计算, 但返回undefined
- <a href=“javascript:void window.open();”> - 使浏览器不必显示计算结果
- 普通一元(目)运算符
- +
- 这里+, -表示正负号, +, -会把变量自动转型为数字
-
- ++
- ++, — 作为前增量时, 返回计算后的值,后增量时,返回计算前的值。与c语言不一样,C语言的前后增量作用于整个表达式s
- 普通二元(目)运算符
- 特点
- 必要时转换数字
- js中数字都是浮点数, 所以5/2 = 2.5
- 左结合
- 根据类型进行数字相加或字符串连接
- 对象先尝试转换数字(Date除外,先转换字符串)
- 如果存在字符串,则拼接(不论字符串值是否数字)
- 都为非字符串,则转换数字计算,失败返回NaN
-
-
- /
- %
- **
-
- 三元(目)运算符
- 位运算符(对操作数每位布尔运算)
- 特点
- 要求操作数是整数(32位整形而非64位浮点型)
- 会自动强制转换
- NaN, Infinity, -Infinity转换为0
- &
- 按位与
- 0x1234 & 0x00FF = 0x0034
- |
- 按位或
- 0x1234 | 0x00FF = 0x12FF
- ^
- 按位异或
- 0xFF00 ^ oxF0F0 = 0x0FF0
- ~
- 按位非
- ~0x0f = 0xFFFFFFF0或 -16
- << - 左移
>>
- 左边高位 正数填0, 负数填1
- 7>>1 = 3
- 7>>1 = -4
>>>
- 相等不等运算符
- (equality operator), =(严格相等(strict equality)或恒等(identity operator))
- ==
- 数字和字符串原始类型也是地址的相等(恒等)
- null == undefined
- 数字==字符串, 字符串转换为数字比较, true转换成1比较
- “1”==true # 同时转换为数字比较
- 对象根据另一个值的类型转换
- = 与
- 不同类型间比较,之比较“转化成同一类型后的值”看“值”是否相等,=如果类型不同,其结果就是不等
- !=, !是, ===的求反
- 比较运算符
- <, >, ⇐, >= - 存在NaN则返回false, ⇐只是简单的不大于,>=相反。不进行==比较
- 0 == -0
- Infinity最大(除了本身)
- Infinity最小(除了本身)
- 转换
- 对象转换为数字
- 同为字符串,字母表顺序比较(16位unicode字符索引顺序)
- 存在不为字符串,转换数字
- 逻辑运算符
- ! && ||
- !会隐式转换为布尔类型, &&比||优先级要高, !优先级最高
- 隔断性
- (a == b) && stop()
- var max = a || b || 0;
- 常用。层层按优先级判断,给max赋值, 用来给可能未传入的参数赋默认值
- 赋值运算符
- =
- 带操作的赋值运算符
- +=, -=, *=, /=, %/, <⇐, >>=, >>>=, &=, |=, ^=, **=
- 注意
- data[i++] *=2
- data[i++] = data[i++] * 2
- 逗号运算符
- 计算左边表达式并忽略结果, 连接多上表达式成为一个表达式
- i=0, j=1, k=2
- for(var i=0, j=10; i < j;j—)
- 扩展(spread)运算符
- 展开具有[Symbol.iterator]接口的可遍历对象,所以可以展开字符串, Map, Set, Generator
- 内部使用for of, 支持4字节字符
- [1, 2, …arguments]
- 展开成新数组, 等于[1, 2].concat(arguments)
- [a, …rest] = [1, 2, 3]
- array.push(1, …items, 2)
- 函数绑定运算符
- 返回原对象, 可以链式调用
a::b::c, 把b, c都绑定到a
foo::bar
::obj.foo
- 优先级
- 算术运算
- 不报错
- 溢出(overflow), 下溢(underflow), 被零整除
- overflow
- 超过表示的数字上限, 得到Infinity或-Infinity
- underflow
- 比最小值还小, 返回0或负0, 负0几乎和0一样, 很少用到
- 除零
- 返回NaN