算术运算符: + 、- 、 * 、 / 、% 、++ 、-- ; 注意: 除了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