这里如果调用Fn未传入obj,则会自动给obj赋值为undefined,然后因为undefined的相应Boolean值为false,所以会将一个空对象{}赋值给obj,如果调用传入了obj,则因为任意对象的Boolean值为true,所以就不会取后面的{},从而达到给obj一个默认值{}的效果。
这种方式还被应用在大型JS库的多个相对独立的文件中:
//jsLib
var jsLib;
//file1
(function (jsLib){
jsLib = jsLib || {};
})(jsLib);
//file2
(function (jsLib){
jsLib = jsLib || {};
})(jsLib);
使用这种方式,无论先加载哪个文件,都会判断jsLib是否已经定义,如果未定义就提供一个默认值,这样做可以使得相对独立模块可以不用考虑加载顺序。
关系操作符
(比较操作符)
< 小于1、只要有一个操作数是Number类型或Boolean类型值,就将两个操作数转换成Number类型值(如果需要转换)执行数值比较。
2、字符串比较,会逐个比较字符编码值。
3、操作符是对象时,调用valueOf()(如果没有,就调用toString()),再将结果按上面规则比较。
4、任意数和NaN比较返回false。
<= 小于或等于
> 大于
>= 大于或等于
== 相等
1、相等和不等(==、!=)在比较时,只要有必要,就会隐式类型转换。
2、全等和不全等(===、!==)在比较时,不会转换类型,如果类型不一致,直接为!==。
3、结合1、2,可以知道,a===b则一定有a==b,而a!=b则一定有a!==b。
!= 不等
=== 全等
!== 不全等
赋值操作符 = 赋值
复合算术赋值操作符 算术运算符加= 对应算术运算符,有+=、-=、*=、/=、%=
复合按位赋值操作符 按位运算符加= 对应按位运算符,有~=、&=、|=、^=、<<=、>>=、>>>=
按位操作符 ~ 按位非 按位取反,也即返回反码
& 按位与 按位对齐,逐位操作,只有两个操作位均为1才返回1,否则该位返回0,最后将所有位操作结果组合返回
| 按位或 按位对齐,逐位操作,只有两个操作位均为0才返回0,否则该位返回1,最后将所有位操作结果组合返回
^ 按位异或 按位对齐,逐位操作,两个操作位不相同时返回1,否则该位返回0,最后将所有位操作结果组合返回
<< 左移 二进制数向左移位,左移不会改变符号位
>> 有符号右移 二进制数向右移位,高位以符合位填充
>>> 无符号右移 二进制数向右移位,直接右移,对于正数,结果和>>相同,对于负数,会把负数的二进制补码当成正数的二进制码处理
字符串操作符 + 字符串连接 相当于concat()函数,会先将所有操作数转换为字符串,然后再连接。注意,字符串一旦创建就不会变更,执行字符串连接时,在后台会有一个中间的连接和销毁过程,这也是老旧浏览器在大量字符串连接操作时运行缓慢的原因。
+= 字符串连接复合 a+=b,相当于a=a+b。
对象操作符 . 属性访问符 简单的对象属性访问符。
[] 属性或(类)数组访问 通过[],可以访问名称是一个变量或含有特殊字符的属性。
new 调用构造函数创建对象 返回一个新创建的对象,在构造函数内部的this被指向这个新创建的对象。
delete 变量、属性删除 删除属性(变量可以看成是全局对象或执行环境的一个属性)。
void 返回undefined。
in 判断属性 对象属性或原型链上的属性。
instanceof 原型判断 比较同一个上下文中的对象是否为另一个对象的原型。
其它操作符 ?: 条件操作符 语法;var value = exp ? trueExp : falseExp。 相当于var value; if(exp){ value = trueExp;}else{value = falseExp;}
, 逗号操作符 主要用于声明多个变量,这也是很多JS库的流行做法。例如:var num1=1,num2=2,num3=3;
() 分组操作符
主要用途:
1、结合逗号操作符用于赋值。例如:var num = (5,1,4,8,0);这里num最后的值为0。