今天看到第四章,记录一下其中的几个点,俗话说:好记性不如烂笔头嘛。
4.9 in运算符和instanceof运算符
in运算符希望它的左操作数是一个字符串或可以转化为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有名为左操作数值的属性名,那么表达式返回true,例如:
1 var point={x:1,y:1};//undefined 2 "x" in point;//true 3 "z" in point;//false 4 "toString" in point;//true 5 var data=[7,8,9];//undefined 6 "0" in data;//true 7 "1" in data;//true 8 1 in data;//true 9 3 in data;//false
instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false。比如:
1 var d=new Date();//undefined 2 d instanceof Date;//true 3 d instanceof Object;//true 4 d instanceof Number;//false 5 var a=[1,2,3];//undefined 6 a instanceof Array;//true 7 a instanceof Object;//true 8 a instanceof RegExp;//false
4.10 逻辑表达式(&&、||、!)
这里有一些注意事项:&&的操作数不一定是布尔值,可以是一些真值或假值(null等),要牢记它的判断顺序,如果左侧值是假,则不判断右侧,直接返回左侧的结果。否则,返回右侧的值。即“”短路“。
1 var o={x:1}; 2 var p=null; 3 o&&o.x;//1 4 p&&p.x;//null
而||的判断顺序则是如果左侧为真,那么返回这个真值,否则再计算右侧的值,返回。
1 var max=max_width||preference.max_width||500;//默认参数 2 //将o的成员属性复制到p中,并返回p 3 function copy(o.p){ 4 p=p||{};//如果像参数p中没有传入任何对象,则使用一个新创建的对象 5 //函数体内的主逻辑 6 }
4.12 表达式计算(eval)
eval()只是一个参数。如果传入的参数不是字符串,它直接返回这个参数。如果是字符串,它会把字符串当成javascript代码进行编译,如果编译失败则抛出一个语法错误异常(SyntaxError)。如果编译成功,则开始执行,并返回字符串中最后一个表达式或语句的值,如果最后一句没有值,则返回undefined。如果字符串抛出异常,这个异常将把该调用传递给eval()。
关于eval()的作用域问题:eval查找变量的值和定义新变量和函数的操作和局部作用域中的代码完全一样。
eval具有更改局部变量的能力。主要看示例吧:
1 var geval=eval; 2 var x="global",y="global"; 3 function f(){ 4 var x="local"; 5 eval("x+='changed';"); 6 return x; 7 } 8 function g(){ 9 var y="local"; 10 geval("y+='changed';"); 11 return y; 12 } 13 console.log(f(),x);// localchanged global 14 console.log(g(),y);// local globalchanged
而严格意义下的eval不能定义新的局部变量。将eval列为保留字,使之更像一个运算符。
4.13 其他运算符
条件运算符 ?: 等价于if else的简写
typeof运算符 常用写法:(typeof value=="string")?"'"+value+"'":value;
delete运算符 var声明的变量是无法删除的
void运算符<a href="javascript:void window.open();">打开一个新窗口</a>