《javascript权威指南》读书笔记(3)—语句

表达式语句

counter++;
delete o.x;
alert(greeting);
window.close();
Math.cos(x);

复合语句和空语句

许多条语句联合在一起

{
    x=Math.PI;
    cs=Math.cos(x);
    console.log("cos(pi)="+cx);
}

声明语句

var

声明一个或多个变量,如:

var i;
var j=0;
var p,q;
  • 如果var出现在函数体内,它定义的是一个局部变量,其作用于就是这个函数
  • var语句中的变量没有指定初始化表达式,那么这个变量的初始值为undefined

function

两种定义写法:

var f=function(x){return x+1;}//函数定义表达式
function f(x){return x+1;} //函数声明语句
  • 函数声明语句常出现在javascript代码的顶层,也可以嵌套,但在嵌套时,只能出现在所嵌套函数的顶部
  • 函数声明语句中的函数名是一个变量名,和通过var声明变量一样,函数定义语句中的函数被“显式”地提前了。使用var的话,只有变量声明提前了
  • 函数声明语句创建的变量是无法删除的

条件语句

if

if(username==null)
username="John Doe";
  • if和else采用就近匹配的原则

switch

swich(exp){
    case 1:
    break;
    case 2:
    break;
    case 3:
    break;
    default:
    break;
}
  • 允许case关键字跟任意的表达式
  • 避免使用带有副作用的case
  • switch语句首先计算switch关键字后的表达式,对于每个case实际上执行的是“===”,因此表达式和case的匹配不会做任何类型转换

循环语句

while

do/while

for

for/in

for(variable in object)
statement;

如果object表达式等于一个原始值,会转换成与之对应的包装对象。js会依次枚举对象的属性来循环,然而在每次循环之前,js都会先计算variable表达式的值,并将属性名赋值给它

需要注意的是,只要for/in循环中variable的值可以当做赋值表达式的左值,它可以是任意表达式,每次循环都会计算这个表达式,如

var o={x:1,y:2,z:3};
var a=[],i=0;
for(a[i++]in o);

数组是特殊的对象,枚举数组索引

for(i in a) console.log(i);

for/in循环并不会遍历对象的所有属性,只有“可枚举”的属性才会遍历到

枚举的顺序 是按属性定义的先后顺序

如果对象的“原型链”上有多个对象,那么链上的每个原型对象的属性的遍历也是按特定顺序执行的,js的一些实现依照数字顺序来枚举数组属性,而不是某种特定的顺序。但当数组元素的索引是非数字或是稀疏数组时,按照特定顺序枚举

跳转

标签语句

由语句前的标识符和冒号组成:

identifer:statement

break和continue是js中唯一可以使用标签的语句。

mainloop:while(token!=null){
    continue mainloop;
}

identifer必须是一个合法的标识符,不能是保留字,任何语句都可以有很多个标签

break语句

后面可以跟语句标签,在break和语句标签之间不能换行,break无法越过函数边界。

continue语句

只能在循环体里运行

在while循环中,在循环开始处指定的expression会重复检验,如果检验结果为true,循环体会从头开始执行

在do/while循环中,程序的执行直接跳到函数结尾处,这时会重新判断循环条件,之后才会继续下一次循环

在for循环中,首先计算自增表达式,然后再检测test表达式,用以判断是否执行循环体

在for/in循环中,循环开始遍历下一个属性名,这个属性名赋给了指定的变量

由于continue在两种循环中的行为表现不同,因此使用while循环不可能完美的模拟for循环

return语句

函数终止执行,没有表达式返回undefined

分支主题

throw语句

throw expression;

throw显式地抛出错误

expression的值是可以任意的,可以抛出一个代表错误码的数字,或者包含可读的错误信息的字符串。当javascript解释器抛出异常的时候通常采用error类型和其子类型。一个error对象有一个name属性表示错误类型,一个massage属性用来存放传递给构造函数的字符串

function factorial(x){
    if(x<0) throw new Error("x不能是负数");
    for(var f=1;x>1;f*=x;x--);
    return f;
}

当抛出异常时,js会立即停止当前正在执行的逻辑,并跳转至就近的异常处理程序。异常处理程序是用try/catch/finally语句的catch从句编写的。如果抛出异常的代码没有一条相关联的catch从句,解释器会检查更高层的闭合代码块,看他是否有相关联的异常处理程序。以此类推,直到找到一个异常处理程序位置。如果没有找到,js会把异常当做程序错误处理,并报告给用户

try/catch/finally语句

try定义异常所在的代码块,catch从句跟随在try从句之后,当try块内某处发生了异常时,调用catch内代码逻辑。catch从句跟随finally块,后者放置清理代码

try{

}catch(e){
//catch中的参数是和异常相关的值(比如error对象)。
//和普通的变量不同,catch语句中的标识符具有块级作用域
//只在catch语句中有定义
}
finally{
//用于清理
//如果使用了return,continue,break忽略
}

其他语句类型

with语句

with(object)
statement

将object添加到作用域链的头部,然后执行statement,最后把作用域链恢复到原始状态

尽可能不要使用with语句

对象嵌套很深的时候可以使用with将form对象添加至作用域链的顶层

document.forms[0].address.value;
with(document.forms[0]){
    name.value="";
    address.value="";
    email.value="";
}

with语句并不能创建属性

debugger语句

用来产生一个断点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值