1.“=”、“==”、“===” 赋值、相等、恒等的区别
“=” 称作“得到或赋值”
“==”称作相等运算符,用来检测两个操作数是否相等,这里“相等“的定义非常宽松,可以进行类型转换
”===“严格相等运算符,比较过程没有任何类型转换
2.”+“运算符更偏爱字符串,比较运算符更偏爱数字
”+“运算符:如果两个操作数其中一个是字符串,则进行字符串连接
比较运算符:只有两个操作数都是字符串时才进行字符串比较,否则进行数字比较
3.in运算符
in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数数值的属性名,则返回true。
var point = { x:1, y:2 };
"x" in point //返回true
4.instanceof运算符
instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。
当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对"父类”的检测。
5.逻辑与(&&)
如果做操作数是真值,“&&”操作将计算右操作数的结果,并将其返回作为整个表达式的结果;如果做操作数是假值,“&&”操作将左操作数结果返回作为整个表达式的结果,而不计算右操作数。返回结果并不总是true或false。
var o = { x:1 };
var p = null;
o && o.x; //返回1。o是对象,所有对象都转换为true,返回右操作数结果
p&&p.x; //返回null。p是假值,直接将其返回
5.eval()
直接调用eval()时,它总是在调用它的上下文作用域内执行。其他间接调用则使用全局对象作为其上下文作用域。
严格模式下的"eval"列为保留字,这让eval()更像一个运算符。不能用一个别名覆盖eval()函数。
var geval = eval; //使用别名调用eval将是全局eval
var x ="global",y="global";
function f(){
var x="local";
eval("x+='changed';"); //直接eval更改了局部变量的值
return x; //返回更改后的局部变量
}
function g(){
var y="local";
geval("y+='changed';"); //间接调用改变了全局变量的值
return y; //返回未更改的局部变量
}
console.log(f(),x); //localchangedglobal
console.log(g(),y); //localglobalchanged
6.delete运算符
用来删除对象属性或数组元素。删除数组元素不改变数组长度。通过var语句声明的变量是不可删除的。
var a=[1,2,3];
delete a[2];
2 in a; //false
a.length; //3.