JavaScript权威指南--Chapter5 语句
来源:互联网 发布:电脑做账软件 编辑:程序博客网 时间:2024/06/06 02:59
JavaScript程序无非就是一系列可执行语句的集合。其中有很多语句和控制结构control structure来改变语句的默认执行顺序:
- 条件conditional语句:if语句、switch语句
- 循环loop语句:while语句、for语句
- 跳转jump语句:break、return、throw。让JavaScript解释器跳转至程序的其他部分继续执行。
一、表达式语句:
具有副作用的表达式是JavaScript中最简单的语句。
1、赋值语句:最常用
greeting="Hello "+name;i*=3;count++;
2、delete运算符:删除一个对象的属性。
delete o.x;
3、函数调用
alter(greeting);window.close();
每行代码都是以分号;结束。
二、复合语句和空语句
可以用逗号运算符将几个表达式连接在一起,形成一个表达式;
将多条语句联合在一起,形成一条复合语句。用花括号括起来即可,形成语句块。
{x=Math.pr;cx=Math.cos(x);console.log(“cos(pi)=”+cx);}
语句块需要注意:
- 结尾不需要分号,块中原始语句必须以分号结束;
- JavaScript中没有块级作用域,所以在语句块中声明的变量并不是私有的。
空语句empty statement:执行时不做任何操作。
; //空语句
Notice:如果使用空语句时,最好在代码中添加注释。
for(var i=0;i<a.length;a[i++]=0) /*empty*/ ;
三、声明语句
var和function都是声明语句,声明或定义变量和函数。
1、var:声明一个或多个变量
var name_1[=value_1[,…,name_n[=value_n]]]
关键字var之后跟随的是要声明的变量列表,列表中的每一个变量都可以带有初始化表达式,用于指定它的初始值。
var i;var f=Math.cos(i),r;var f=function(i){return i*i};
- 如果var语句出现在函数体内,则为局部变量,作用域为这个函数。
- 如果var语句出现在顶层代码中,则为全局变量,作用域为整个JavaScript程序。
- var声明的变量不能通过delete删除。
- 如果var语句中的变量没有指定初始化表达式,那么这个变量的值初始化为undefined。
变量声明语句会被“提前”至脚本或函数的顶部,但是初始化操作仍在原来var语句的位置执行,声明语句之前的变量值为undefined。
2、function:
function funcname(arg1[,arg2[,…,argn]]){statement}
funcname是要声明的函数的名称的标识符。后跟参数列表。函数体中括号不能省略。
函数定义不能在if、while和其他任何语句中。
函数声明语句中的函数名是变量名,变量指向函数对象。
使用函数声明语句,函数名和函数体都会被提前,可以在声明JavaScript函数之前调用它。
四、条件语句
1、if
有两种形式:
1)
if(expression) statement
2)
if(expression) statement1else statement2
if/else匹配规则是,else总是和就近的if语句匹配。
2、else if
if(expression1){ statement1}else if(expression2){ statement2}else if(expression3){ statement3}else{ statement4}
3、switch:当所有分支依赖于同一个表达式的值时
switch(expression){ statement}
swich(n){case 1:statement1; break;case 2:statement2; break;case 3:statement3; break;default:break;}
如果没有break语句,switch会从expression的值相匹配的case标签处的代码开始执行,依次执行后续的语句,直到整个代码块结束。
五、循环
1、while
while(expression){ statement}
执行while之前,计算expression的值,如果为假,则程序跳转到while之后的逻辑执行;反之,进入循环体执行,直到expression为假,跳出。
2、do/while
do{ statement}while(expression);
循环尾部检查表达式,则意味着循环至少执行一次。
以分号结束。
3、for
for(initialize;test;increment){ statement}
- initialize表达式只在循环开始之前执行一次。
for循环三个表达式可以省略,分号不能省略。
for(var i=0,j=0;i<10;i++,j--)for(;o.next;o=o.next)
4、for/in
for(variable in object){ statement}
- variable必须是一个适用于赋值表达式左侧的值。
- object是一个对象。
首先计算object的值,若为undefined或null,则跳过循环;反之,JavaScript列举object的属性来执行循环,计算variable的值,将属性名赋值给它。
遍历数组:
for(var i=0;i<a.length;i++) console.log(a[i]);
for(var p in a) console.log(o[p]);
将对象的属性复制到数组:
var o={x:1,y:2,z:3};var a=[],i=0;for(a[i++] in o) /*empty*/;for(i in a) console.log(i);//枚举数组索引0、1、2
for/in不会遍历所有属性,仅遍历”可枚举“的属性。
- 所有JavaScript内置方法不是”可枚举“的。
- 代码中定义的所有属性和方法都是可枚举的。
- 对象继承其他的对象属性也是可枚举的。
- for/in循环中删除的还未枚举的属性,不再被枚举。
- 循环中定义了对象的新属性,也不会被枚举。
属性枚举的顺序:
先定义的属性先枚举。
若以对象直接量的形式创建对象,则将按照直接量中属性的出现顺序枚举。
六、跳转
1、标签语句
identifier:statement
只有break和continue能够使用标签。
mainloop:while(token!=null){ continue mainloop;//跳转到下一次循环}
2、break
1) 单独使用break语句,立即退出最内层的循环或switch语句。
break;
单独的break语句只有在循环和switch语句中才是合法的。
for(var i=0;i<length;i++){ if(a[i]==0) break;}
2) break加标签
break lablename;
程序跳转到这个标签所标识的语句块的结束,或者直接终止直接闭合这个语句块的执行。
- 当没有任何闭合语句块指定了break所用的标签,则产生一个语法错误。
- 当使用这种形式的break语句,标签语句不应该是循环或switch语句。
- 当你希望用break来跳出非就近的循环或switch语句,则使用break+标签。
var matrix=getData();//从某处获取一个二维数组//求矩阵的和var sum=0,success=false;compute_sum:if(matrix){ for(var x=0;x<matrix.length;x++){ var row=matrix[x]; if(!row) break compute_sum; for(var y=0;y<row.length;y++){ var cell=row[y]; if(isNaN(cell)) break compute_sum; sum+=cell; } } success=true;}//break语句跳转到这里
不论break语句带不带标签,它的控制权都不能越过函数边界。
3、continue:不退出循环,而是转去执行下一次循环。
continue;
continue labelname;
只能在循环体内使用。
不同类型中,continue行为也有所区别:
1) while中,在循环开始处指定的expression会重复检测;
2) do/while中,程序的执行直接跳转到循环结尾处重新判断循环条件;
3) for中,首先计算自增表达式,再去检测test;
4) for/in中,循环遍历下一个属性名;
Notice:while循环直接进入下一轮的循环条件判断;for循环先计算increment,再去test。
4、return语句:指定函数调用后的返回值,只能出现在函数体内。
return expression;
如果没有return语句,函数调用一次执行到函数结束,最后调用表达式返回结果为undefined。
单独使用return,返回结果也是undefined。
5、throw语句:
异常–当发生了某种异常情况或错误时产生一个信号。
抛出异常–用信号通知错误或异常情况。
捕获异常–处理异常信号,采取必要手段从异常中恢复。
throw–显示抛出异常。
throw expression;
expression可以是任意类型。代表错误码的数字或者是可读的错误消息的字符串。
JavaScript抛出异常的时候采用Error类型和其子类型。Error对象包含name属性表示错误类型,message属性用来存放传递给构造函数的字符串。
function factorial(x){ //若输入非法抛出异常 if(x<0) throw new Error(“x can not be a negitive”); //否则,计算,返回 for(var f=1;x>1;f*=f*x,x--) return f;}
当抛出异常时,JavaScript解释器会立即停止当前正在执行的逻辑,跳转到就近的异常处理程序。
6、try/catch/finally
try–定义了需要处理的异常所在的代码
catch–跟随在try从句之后,当try内发生异常时,执行catch内的逻辑代码
finally–放置清理代码。不关try中是否有异常,finally块内的逻辑始终会执行。
try可从catch和finally中选一个组成语句。
try{//通常来讲,try内的代码不会抛出异常//但有时会抛出异常,或者由throw直接抛出,要么是调用一个方法间接抛出异常}catch(e){//e具有块级作用域//try中有异常才会执行到这里//可以通过局部变量e来获得Error对象或者抛出的其他值的引用//可以处理异常,或者忽略异常,或者throw一个新的异常}finally{//不管try中有没有异常,总是会执行这里的逻辑//终止try块的方式有四种://1、正常终止//2、通过break,continue、return终止//3、抛出异常被catch捕获//4、抛出异常,没有被捕获,向上传播}
七、其他语句类型
1、with:临时扩展作用链。
with(object){statement}
作用:将object加到作用域链的头部,执行statemen,恢复原始作用链。
适用于对象层次嵌套很深的情况下来简化代码。
document.form[0].name.valuedocument.form[0].address.valuedocument.form[0].email.value
等同于
with(document.form[0]){name.value=””;address.value=””;email.value=””;}
Notice:只有在查找标识符的时候才会用作用域链
with(o){ x=1;}
若o有x属性,则赋值为1;若没有,则上面代码等同于x=1,给局部或全局变量赋值,或者创建全局对象的新属性。
with语句提供了访问o的属性的快捷方式,但并不创建新的属性。
2、debugger语句:调试模式运行下作用
3、use strict:说明后续的代码会解析为严格模式
引入的指令,不包含任何关键字,只能出现在脚本代码的开始或函数体的开始、任何实体语句的开始。
严格模式和非严格模式的区别:
1) 严格模式禁用with语句
2) 严格模式所有的变量需要声明,否则会抛出引用错误异常
3) 严格模式调用函数的this值是undefined;
//可用来判断是否支持严格模式var hasStrict=(function(){“ues strict”;return this===undefined;});
4) 严格模式不允许使用八进制整数直接量
5) 严格模式中,对象直接量中不能定义两个或多个同名属性,否则会产生语法错误
6) 严格模式中,函数声明中不允许存在两个或多个同名变量
……
- JavaScript权威指南--Chapter5 语句
- 寻找《JavaScript权威指南》1,语句
- JavaScript权威指南第05章 语句
- 《javascript权威指南》读书笔记(3)—语句
- 《JavaScript权威指南(第六版)》读书笔记 (五) 语句
- JavaScript权威指南学习之第5章 语句
- Chapter5 语句
- JavaScript权威指南
- JavaScript权威指南
- 《JavaScript权威指南》读书笔记
- javascript权威指南读书笔记
- JavaScript权威指南-前言
- javascript 权威指南解读
- javascript权威指南学习
- javascript 权威指南笔记
- 读javascript权威指南
- Javascript 权威指南
- 《Javascript 权威指南》笔记
- CSS禁止选择DIV内的文本
- linux centos7 svn server 搭建 支持http访问
- python中文编码问题
- Java基础-学习笔记(前言)
- 使用java实现去除各种空格
- JavaScript权威指南--Chapter5 语句
- 简单的C程序<二>:字符间空格处理
- xml解析
- Webrtc Intro - kurento
- OC UIFont字体设置
- mongodb格式化结果
- java中的内部类总结
- Duplicate id, tag null, or parent id 0x0 with another fragment 解决方案
- 线程绑定CPU核-sched_setaffinity