javaScript 运算符

算术运算符: + 、- 、 * 、 / 、% 、++ 、-- ;   注意: 除了NaN与字符串相加外,任何与NaN进行运算的结果都返回NaN

  “ + ” 、“ - ”: 如果是一元运算符(只操作一个数),返回操作数的数值;如果操作数不是数值,等同于Number(操作数); 

                       如果是操作两个数值(字面量或变量):

                              “ - ”减法, 会将两个操作数转为数值来计算;

                              “ + ”加法, 如果操作数没有字符串,则将操作数(不是数值的话)转为数值,然后两数相加;

                                                如果操作数有一个是字符串,则将另一个操作数(不是字符串的话)转为字符串,然后两字符串拼接;

  “ * ” 、“ / ”: 乘法和除法都是把两操作数转为数值(如果不是数值的话)再进行运算;

                      “ * ” 有一个特殊的是: Infinity * 0  结果是 NaN;

                      “ / ”  除法中0可以做除数: 0/0 结果为NaN    非0/0  结果为Infinity;

  “ % ”: 取模,操作数转为数值再进行计算;

 

  “ ++ ”、“ -- ” 递增递减会先把操作数转为数值(如果不是数值的话);

                      与其它运算在一块的时候,前置++(--)是先运算再赋值,后置++(--)是先赋值再运算;

 

逻辑运算符:!、&&、||     

    “ ! ”逻辑非,对操作数布尔值取反; “ !! ”对操作数转为布尔值 等同于 Boolean();

   “ && ”逻辑与,第一个操作数为真,返回第二个操作数;

                           第一个操作数为假,不执行第二个操作数,返回false(如果第一个操作数是那五个(NaN,null,undefined,0,'')直接返回第一个操作数);

   “ || ” 逻辑或,第一个操作数为真,返回第一个操作数;

                         第一个操作数为假,返回第二个操作数;

    &&与|| 都是短路操作符

关系运算符:>、<、>=、<=

    如果一个操作数为数值,则另外一个操作数转为数值(不是的话)进行比较;如果转为NaN的话返回false;

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

相等运算符:==、!=、===、!==

    ==和!= 会进行类型转换; === 与 !== 不进行转换判断

条件运算符:? : 

    三元运算:x?a:b  x是真值就执行a ; x是假值就执行b

二进制位运算符:~、&、| 、^ 、<< 、>>、>>>

    十进制转换二进制:短除法;

    求负数的二进制:- 二进制补码 -  先求绝对值,然后再求二进制,再反码,再加1;

    ~ 按位非   返回数值的反码,二进制0变为1,1变为0; ~num ===  -num-1

    & 按位与   两位数值进行比较,相同位都是1返回1,其它返回0,然后返回新数值; 1010 & 0110  返回 0010

     | 按位或   两位数值进行比较,相同位只要有1的就返回1,没1返回0,然后返回新值; 1010 | 0110 返回1110

    ^ 按位异或  两个操作数相同位只有一个1时返回1,其它都返回0,然后返回新值;  1010 ^ 0110 返回 1100

    <<  左移    左移不影响操作数的符号,操作数向左移动,0填充空位; 1010 << 2  返回 101000;

    >>  有符号右移   右移保留操作数的符号位,在符号位的右侧填充空位(正数填充0,负数填充1);-18 >> 2 返回  -5;

    >>>  无符号右移   它是用0来填充空位, 对于正数和有符号右移返回一致; 对于负数,无符号右移会把负数二进制码当作正数二进制码,移动后不会求其反码;-18 >>> 2 返回  1073741819;

赋值运算符:=、+(-*/%>>><<>>&|^)=

    “ = ” 赋值,右边值赋给左边;

    “ +(-*/%>>><<>>&|^)= ”  简化赋值操作,不会带来性能提升;  

逗号操作符:,

    赋值时,返回最后一项;  var num = ( 1, 2, 3 );  num 返回3;

 

其它常用运算符:

    new    用来创建对象实例,new constructor([ arguments ]),比如:执行 var fun = new Fun( ) 时执行以下步骤(Fun是定义的构造函数):

                ①、首先创建空对象,相当于 { };

                ②、用该空对象调用构造函数,此时 this 指向该正在创建的空对象,按构造函数的定义,为该对象添加属性和方法;

                ③、将新创建对象的__proto__属性指向构造函数的prototype对象;

                ④、将空对象的地址保存在等号左边的变量中;

           ( 一般情况,构造函数不返回值,但是用户可以主动返回对象,来覆盖正常的创建对象步骤)

             没有指定参数列表的时候,new Fun 等同于 new Fun();

 

    in    用来检测一个对象是否包含指定属性(包括从原型链上继承来的), '属性名' in obj   (数组检测的是索引)右操作数必须是对象;

 

    instanceof    用来检测构造函数的原型是否在这个对象的原型链中  obj.instanceof constructor(constructor.prototype是否在obj的原型链上),也就是obj的原型链上是否找的到该构造函数的原型;

                        三个基本包装类型 (通过new 调用)构建出来的对象与字面量定义的对象({ }) instanceof Object  都返回true; 包装类型 instanceof  各自的构造函数都返回true;

              typeof   主要用来检测基本类型;

              instanceof 主要用来检测 对象 是否是某个构造函数的实例;

              isPrototypeOf  也是用来检测 一个对象是否在另一个对象的原型上;

                                         A.instanceof B         B的原型是否在A的原型链上,A的原型链针对B的原型(B.prototype)检测;

                                         A.isPrototypeOf(B)   A对象是否在B的原型链上,是对B的原型链和A(不是A的原型,或许A本身就是原型对象)检测;

 

运算符优先级https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

posted @ 2019-02-17 16:47  卒卒卒  阅读(93)  评论(0编辑  收藏  举报