javaScript 运算符

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

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

                       若是是操做两个数值(字面量或变量):性能

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

                              “ + ”加法, 若是操做数没有字符串,则将操做数(不是数值的话)转为数值,而后两数相加;编码

                                                若是操做数有一个是字符串,则将另外一个操做数(不是字符串的话)转为字符串,而后两字符串拼接;spa

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

                      “ * ” 有一个特殊的是: 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

相关文章
相关标签/搜索