•     一元运算符、布尔运算符、算术运算符、关系运算符、三元运算符、位运算符及赋值运算符。ECMAScript中的运算符适用于很多值,包括字符串、数值、布尔值、对象等。

  • 应用于对象时通常会调用对象的valueOf()toString()方法,以便取得相应的值。

  •        typeof操作符、new 操作符,也可以称之为typeof 运算符、new运算符

  • 在没有赋值操作,前置和后置是一样的。但在赋值操作时,如果递增或递减运算符前置,那么前置的运算符会先累加或累减再赋值,如果是后置运算符则先赋值再累加或累减。

  • 5个算术运算符,加减乘除求模(取余)。如果在算术运算的值不是数值,那么后台会先使用Number()转型函数将其转换为数值(隐式转换)

  • 用于进行比较的运算符称作为关系运算符:小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、相等(==)、不等(!=)、全等(恒等)(===)、不全等(不恒等)(!==)

  • 和其他运算符一样,当关系运算符操作非数值时要遵循一下规则:

    1.两个操作数都是数值,则数值比较;

    2.两个操作数都是字符串,则比较两个字符串对应的字符编码值;

    3.两个操作数有一个是数值,则将另一个转换为数值,再进行数值比较;

    4.两个操作数有一个是对象,则先调用valueOf()方法或toString()方法,再用结果比较;

  • 在相等和不等的比较上,如果操作数是非数值,则遵循一下规则:

    1.一个操作数是布尔值,则比较之前将其转换为数值,false转成0true转成1

    2.一个操作数是字符串,则比较之前将其转成为数值再比较;

    3.一个操作数是对象,则先调用valueOf()toString()方法后再和返回值比较;

    4.不需要任何转换的情况下,nullundefined是相等的;

    5.一个操作数是NaN,则==返回false!=返回true;并且NaN和自身不等;

    6.两个操作数都是对象,则比较他们是否是同一个对象,如果都指向同一个对象,则返回true,否则返回false

    7.在全等和全不等的判断上,比如值和类型都相等,才返回true,否则返回false

  • 特殊值对比表

  • null == undefined
    true
    'NaN' == NaN
    false
    5 == NaN
    false
    NaN == NaN
    false
    false == 0
    true
    true == 1
    true
    true == 2
    false
    undefined == 0
    false
    null == 0
    false
    '100' == 100
    true
    '100' === 100
    false
  • 逻辑运算符通常用于布尔值的操作,一般和关系运算符配合使用,有三个逻辑运算符:逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)

  • 逻辑与(AND) :&&  如果两边的操作数有一个操作数不是布尔值的情况下,与运算就不一定返回布尔值,此时,遵循已下规则:

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

    2.第二个操作数是对象,则第一个操作数返回true,才返回第二个操作数,否则返回false;

    3.有一个操作数是null,则返回null

    4.有一个操作数是undefined,则返回undefined

  • 逻辑或(OR):||  如果两边的操作数有一个操作数不是布尔值的情况下,逻辑与运算就不一定返回布尔值,此时,遵循已下规则:

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

    2.第一个操作数的求值结果为false,则返回第二个操作数;

    3.两个操作数都是对象,则返回第一个操作数;

    4.两个操作数都是null,则返回null

    5.两个操作数都是NaN,则返回NaN

    6.两个操作数都是undefined,则返回undefined

  • 逻辑非(NOT)!  逻辑非运算符可以用于任何值。无论这个值是什么数据类型,这个运算符都会返回一个布尔值。它的流程是:先将这个值转换成布尔值,然后取反,规则如下:

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

    2.操作数是一个空字符串,返回true

    3.操作数是一个非空字符串,返回false

    4.操作数是数值0,返回true

    5.操作数是任意非0数值(包括Infinity)false

    6.操作数是null,返回true

    7.操作数是NaN,返回true

    8.操作数是undefined,返回true

  • 运算符优先级 

  • 如果没有使用圆括号强制优先级,我们必须遵循以下顺序
    运算符
    描述
    . [] ()
    对象成员存取、数组下标、函数调用等
    ++ -- ~ ! delete new typeof void
    一元运算符
    * / % 
    乘法、除法、去模
    + - +
    加法、减法、字符串连接
    << >> >>>
    移位
    < <= > >= instanceof
    关系比较、检测类实例
    == != === !==
    恒等(全等)
    &
    位与
    ^
    位异或
    |
    位或
    &&
    逻辑与
    ||
    逻辑或
    ?:
    三元条件
    = x=
    赋值、运算赋值
    ,
    多重赋值、数组元素