• 概念
    • 可符号,可关键字
    • 一元、二元、三元运算符 # - +(正负号)是一元,*是二元, ?!是三元
    • 期望与转型
      • “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
    • << - 左移
      • 7<<2 = 28
        • 移动倍数是0~31的整数,用0补
    • >>
      • 左边高位 正数填0, 负数填1
      • 7>>1 = 3
      • 7>>1 = -4
    • >>>
      • 无符号右移,左边高位总填0
  • 相等不等运算符
    • (equality operator), =(严格相等(strict equality)或恒等(identity operator))
      • ==
        • 数字和字符串原始类型也是地址的相等(恒等)
        • null == undefined
        • 数字==字符串, 字符串转换为数字比较, true转换成1比较
        • “1”==true # 同时转换为数字比较
        • 对象根据另一个值的类型转换
      • =
        • 不同类型间比较,之比较“转化成同一类型后的值”看“值”是否相等,=如果类型不同,其结果就是不等
    • !=, !, ===的求反
  • 比较运算符
    • <, >, , >= - 存在NaN则返回false, 只是简单的不大于,>=相反。不进行==比较
      • 0 == -0
      • Infinity最大(除了本身)
      • Infinity最小(除了本身)
    • 转换
      • 对象转换为数字
      • 同为字符串,字母表顺序比较(16位unicode字符索引顺序)
      • 存在不为字符串,转换数字
  • 逻辑运算符
    • ! && ||
      • !会隐式转换为布尔类型, &&比||优先级要高, !优先级最高
    • 隔断性
      • (a == b) && stop()
        • 同if(a == b) stop();
      • var max = a || b || 0;
        • 常用。层层按优先级判断,给max赋值, 用来给可能未传入的参数赋默认值
  • 赋值运算符
    • =
    • 带操作的赋值运算符
      • +=, -=, *=, /=, %/, <, >>=, >>>=, &=, |=, ^=, **=
    • 注意
      • data[i++] *=2
      • data[i++] = data[i++] * 2
        • 以上不相同
  • 逗号运算符
    • 计算左边表达式并忽略结果, 连接多上表达式成为一个表达式
    • i=0, j=1, k=2
      • 计算结果是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]
      • 模式匹配给rest赋值, 只能放在最后
    • array.push(1, …items, 2)
      • 函数调用
  • 函数绑定运算符
    • 返回原对象, 可以链式调用a::b::c, 把b, c都绑定到a
    • foo::bar
      • bar.bind(foo)
    • ::obj.foo
      • obj.foo.bind(obj)
  • 优先级
    • 优先级(js权威指南六版66页)
  • 算术运算
    • 不报错
      • 溢出(overflow), 下溢(underflow), 被零整除
      • overflow
        • 超过表示的数字上限, 得到Infinity或-Infinity
      • underflow
        • 比最小值还小, 返回0或负0, 负0几乎和0一样, 很少用到
      • 除零
        • 返回无穷大或负无穷大
    • 返回NaN
      • 零除以零
      • 无穷除以无穷
      • 负数开方
      • 无法转换为数字