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