语法
在代码中,每个代码块和方法都会返回一个值,结果值就如同一个隐式的返回,在函数中,如果没有指定return,那么就相当于在结束出添加一个 return undefined 。在代码块中返回最后一个语句的结果值,如:
var b; if (true) { b = 5 + 32; }
上面的代码中,其返回结果是37,但是想拿到返回值,用这种方法却不行:
var b; var a= if (true) { b = 5 + 32; }
如果想要拿到其返回值,可以使用eval获取,即:
var b; var a = eval("if (true) {b = 5 + 32;}"); console.log(a); //37
虽然不是一个好办法,但确实能获取到
()表达式
var a = 42; var b = (a++); console.log(a); //43 console.log(b); //42
由结果可以看出,其实(0本身并不是一个封装表达式。
else if
在JavaScript中,其实是没有else if 语句的,所以我们经常用到的 else if 其实是这样的:
if (a) { } else { if (b) { } else { } }
函数参数
function foo(a=42,b=a+1) { console.log(arguments.length,a,b,arguments[0],arguments[1]) } foo(); //0 42 43 undefined undefined foo(10); //1 10 11 10 undefined foo(10,undefined); //2 10 11 10 undefined foo(10,null);//2 10 null 10 null
虽然参数a和b都有默认值,但是函数不带参数时,arguments数组为空。
在来看一个参数绑定的例子:
function foo(a) { a = 42; console.log(arguments[0]); } foo(2); //42 foo(); //undefined
由此可以看出,向函数传递参数时,arguments数组中的对应单元会和命名参数建立关联,以得到相同的值,相反,不传递参数就不会建立关联。
需要特别注意的是,它并不是JavaScript语言本身的特性,而是语言引擎底层实现的一个抽象泄露。所以不要同时访问参数和其对应的arguments数组单元。
try finally
finally中的代码总是会再try之后执行,如果有catch则在catch之后执行,即无论什么情况下一定会被调用。如:
function foo() { try{ return 42; } finally { console.log("finally"); } console.log("nerver"); } console.log(foo()); //finally //42
这里return 42会先执行,并将foo()函数的返回值设置为42,然后try执行完毕,在执行finally。最后foo执行完毕,执行console.log
如果finally中抛出异常,函数就会在此处种植,如果此前try中已经有return设置了返回值,则该值会被丢弃。
另外还需要注意,如果finally中用return返回了值,那么它会覆盖try 或 catch 返回的值。
switch
switch中的case的匹配算法,是与===相同。但是有时需要通过强制转换来进行比较,即==,这是就需要做一些特殊处理:
var a = "42"; switch (true) { case a == 10: console.log("10"); break; case a == 42: console.log("42"); break; } //42
尽管可以这样使用,但有一个需要特别注意的地方:
var a = "42"; var b = "45" switch (true) { case (a||b==42): console.log("10");//永远不会执行到这里 break; }
因为(a||b==42)的返回结果是42,而非true,所以严格相等比较不成立,这是需要强制转换返回true或false,如 case !!(a||b==42)
全局DOM变量
有时我们在创建有id属性的dom时,也会创建一个同名的全局变量。例如:
<div id="foo"></div> if(type foo==undefind){ foo=42; } console.log(foo) //html元素
上面的代码中,如果稍不注意就会很容易让全局变量的检查错误百出,这有时尽量不要使用全局变量的一个原因。如果必须要用,那么久要保证唯一,不与html和第三方的代码同名。