第五章 语法
1.语句和表达式
(1)语句的结果值
{...}的结果值是其最后一个语句/表达式的结果
(2)表达式的副作用
var a = 42;
var b = a++;
a;//43
b;//42
++在前面时,它的副作用(a递增)产生在表达式返回结果之前,a++的副作用产生在之后。
2.函数参数
ES6定义了一个新概念,TDZ(Temporal Dead Zone,暂时性死区)。指由于代码中的变量还没初始化而不能被引用的情况。例如:
{
a = 2;//ReferenceError!
let a;
}
a=2试图在let a初始化a之前使用该变量,这里就是a的TDZ
ES6中,如果参数被省略或值为undefined,则取该参数的默认值:
function foo(a=42,b=a+1){
console.log(a,b);
}
foo();// 42,43
foo(undefined);42,43
foo(5);//5,6
foo(void 0,7);//42,7????????
foo(null);//null,1
null+1;//1 amazing!!
ES6中的参数默认值而言,参数被省略或被复制为undefined效果都一样,取该参数的默认值,但有些情况下还是有区别:
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数组为空。
3.try..finally
try:语句测试代码块的错误,一般把可能会出错的代码放到这里
catch:只有try里面的代码块发生错误时,才会执行到这里的代码,参数err记录着try里面的错误信息
finally:无论有无异常都会执行该处代码
throw:抛出一个用户自定义异常,当前函数将被停止,并且控制将会传入到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。异常可以使字符串。布尔值或对象。
finally中的代码总会在try之后执行,如果有catch则在catch之后执行。也可以将finally中的代码看作一个回调函数,即无论最后发生什么情况一定会被调用。
function foo(){
try{
return 42;
}
finally{
console.log("hello");
}
console.log("never runs");
}
console.log(foo());
//hello
//42
这里return42先执行,然后将foo()的返回值设为42。然后try执行完毕,接着执行finally。最后函数foo执行完毕,显示返回值
throw也是如此:
function foo(){
try {
throw 42;
}
finally {
console.log("hello");
}
console.log("never runs");
}
console.log(foo());
//hello
//Uncaught Exception:42
function mySum(x,y) {
x=Number(x);
y=Number(y);
if(isNaN(x)||isNaN(y))
{
throw new Error("两个数相加前提两个数必须都是数字");
}
else
{
return x+y;
}
}
mySum(1,"!");//Uncaught Error:两个数相加前提两个数必须都是数字
如果finally中抛出异常,函数就会在此终止。如果此前try中已经有return设置了返回值,则该值会被丢弃:
function foo(){
try {
return 42;
}
finally{
throw "Oops!"
}
console.log("never runs");
}
console.log(foo());
//Uncaught Exception: Oops!
注:continue用于跳出循环的一个迭代,break用于跳出循环
try..catch在break和continue中也是一样:
for(var i = 0; i < 5;i++){
try{
continue;
}
finally{
console.log(i) ;
}
}
//0 1 2 3 4
continue在每次执行之前先执行console.log(i),所以结果没有5.
ES6中加入了yield,可以将其视为return的一个中间版本,但是yield在generator重新开始时才结束,这意味着try{...yield...}并未结束,因此finally不会再yield之后立即执行。?????
调用generator不会执行函数代码,只有调用next才会执行,每次调用next方法遇到yield就会停止,如果要再次运行只能再次调用next方法。
finally会覆盖try和catch中的return的返回值。
4.switch
语法:
switch(a){
case 2:
// do something
break;
case 42:
// do something
break;
default:
// do something
}
default是可选的,并非不可少
eg:
var a = 10;
switch(a){
case 1:
case 2:
default:
console.log("default");
case 3:
console.log("3");
break;
case 4:
console.log("4");
}
//default
//3
js中有很多错误类型,分为两大类:早起错误(编译时错误,无法被捕获),运行时错误(可以通过try..catch捕获)。
网友评论