学习JavaScript之——第5章 语句(上)

本文详细介绍了JavaScript中的语句,包括表达式语句、复合语句和空语句、声明语句(var 和 function)、条件语句(if、else if、switch)以及循环语句(while、do/while、for、for/in)。通过实例解析了每种语句的用法和注意事项,是深入理解JavaScript语法的好帮手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习JavaScript之——第5章 语句(上)

学习内容:

5.1表达式语句
5.2 复合语句和空语句
5.3 声明语句
5.4 条件语句
5.5 循环

5.1表达式语句

赋值语句是一类比较重要的表达式语句

greeting = "Hello " + name;
i *= 3;

递增运算符(++)和递减运算符(–)和赋值语句有关,它们的作用是改变一个量的值:counter++;
delete运算符的重要作用是删除一个对象的属性,所以,它一般作为语句的使用,而不是作为复杂表达式的一部分:delete o.x;
函数调用是表达式语句的另一个大类:

alert(greeting);
window.close();
5.2 复合语句和空语句

JavaScript中还可以将多条语句联合在一起,形成一条复合语句。只需用花括号将多条语句括起来即可。

{
  x = Math.PI;//3.141592653589793
  cx = Math.cos(x);
  console.log("cos(Π) = " + cx);//cos(Π) = -1
}

注:1.语句块的结束不需要分号,但单条语句的结束需要分号结束。2.语句块中的缩进不是必须的
在JavaScript中,当希望多条语句被当作一条语句使用时,使用复合语句来替代。空语句则恰好相反,它允许包含0条语句的语句。

;  //空语句

JavaScript解释器在执行空语句时不会执行任何动作。当创建一个具有空循环体的循环时,空语句有时是很有用的。

for(i = 0 ;i < a.length ;a[i++]=0);//初始化一个数组a

注:在for循环、while循环、if语句右圆括号后的分号很不明显,这可能造成一些致命的bug,如:

if((a == 0) || (b ==0));//这一行代码什么都没做
o = null;//这一行代码总是执行

如果有特殊需求需要使用空语句,最好在代码中加注释,说明这条空语句是有用的

for(i = 0 ; i < a.length ; a[i++] = 0)/*empty*/;
5.3 声明语句

5.3.1 var
var语句用来声明一个或多个变量,语法如下:var name_1 [ = value_1][,..., name_n [ = value_n]]
关键字var之后跟随的是要声明的变量列表,列表中的每一个变量都可以带有初始化表达式,用于指定它的初始值,例如:

var i;
var j = 0;
var p , q;
var greeting = "hello" + name;
var x = 2.34 , y = Math.cos(0.75) , r , theta;
var x =2;
f = function(x){ return x*x},
y = f(x);//多个变量,每个变量占一行
  • 如果var语句出现在函数体内,那么它定义的是一个局部变量,作用域就是这个函数
  • 如果在顶层代码中使用var 它声明的是全局变量
  • var声明的变量是无法用delete语句删除的
  • 如果var语句中的变量没有指定初始化表达式,那么这个变量的值初始为undefined
  • var语句同样可以作为for循环或者for/in循环的组成部分,多次声明同一个变量是无所谓的
for(var i = 0 ; i < 10 ; i++)
  console.log(i);
for(var i = 0,j = 10 ; i<10 ; i++,j--)
  console.log(i*j);
for(var i in o)
  console.log(i);

5.3.2 function
关键字function用来定义函数。示例代码中的两种写法:

var f = function(x){return x+1;}//将表达式赋给一个变量
function f(x){return x+1;}//含有变量名的语句

函数声明语句的语法如下:

function funcname([arg1 [,arg2 [...,argn]]]){
  statement;
}

funcname是要声明的函数的名称的标识符。函数名之后的圆括号是参数列表,参数之间使用逗号分隔。当调用函数时,这些标识符则指代传入函数的实参。

function hypotenuse(x,y){
  return Math.sqrt(x*x + y*y);
}

function factorial(n){//一个递归函数
  if(n<=1) return 1;
  return n * factorial(n-1);
}
  • 函数声明语句通常出现在函数的最顶层,也可以嵌套在其他或函数体内。嵌套时,函数声明只能出现在所嵌套的函数的顶部。也就是说,函数定义不能出现在if语句、while循环或其它任何语句中。
  • 函数声明语句中的变量也是无法删除的,但是这些变量不是只读的,变量值可以重写。
5.4 条件语句

5.4.1 if
if语句是一种基本的控制语句,它让JavaScript程序可以选择执行路径
第一种是:

if(expression)
  statement
if (username == null)
  username = "Jhon Doe";
//等价于
if(!username)
  username = "Jhon Doe";

JavaScript语法规定,if关键字和圆括号表达式之后必须跟随一条语句,可以用语句块将多条语句合并成一条

if(!address){
  address = "";
  message = "Please specify a mailing address.";
}

第二种是:

if(expression)
  statement1
else
	statement2
if (n == 1)
  console.log("You have 1 new message.");
else
  console.log("You have" + n + "new messages.");

当在if中嵌套使用if时,必须确保else语句匹配正确的if语句

if (i == j){
  if (j ==k)
    console.log("i equals k");
  else
    console.log("i doesn't equal j");
}

5.4.2 else if
代码中有多条分支语句的时候使用else if语句

if(n ==1){
  //执行代码块 1
}
else if(n ==2){
  //执行代码块 2
}
else if(n ==3){
  //执行代码块 3
}
else{
  //之前的条件都为false则执行这里的代码块4
}

等价于:

if(n==1){
  //执行代码块 1
}
else{
  if(n ==2){
    //执行代码块 2
  }
  else{
    if(n==3){
      //执行代码块 3
    }
    else{
      //条件都为false则执行这里的代码块4
    }
  }
}

5.4.3 switch
switch语句用于处理多分支,并且这些分支都依赖于同一个表达式。
关键字switch之后紧跟圆括号括起来的一个表达式,随后是一对花括号括起来的代码块:

switch(expression){
    statements;
}
  • 代码块中可以使用多个由case关键字标识的代码段,case之后是一个表达式和一个冒号。
  • 当执行这条switch语句时,它首先计算expression的值,然后查找case子句中的表达式是否和expression的值相同(这里的相同是按照"==="运算符进行比较的)。如果找到匹配的case,那么将会执行这个case对应得代码块;如果找不到匹配得case就会执行"default"标签中的代码块;如果没有"default:"标签,switch语句将跳过它的所有代码块。
  • 在每个case语句块结尾处都使用了break关键字,break语句可以使解释器跳出switch语句或循环语句。
  • 如果在函数中使用switch语句,可以使用return来替代break,return和break都用于终止switch语句,也会防止下一个case语句块执行完后继续执行下一个case语句块
switch(n){
  case 1:
    //执行代码块 1
    break;
  case 2:
    //执行代码块 2
    break;
  case 3:
    //执行代码块 3
    break;
  default:
    //执行代码块 4
    break;
}

根据值得类型将该值转换为字符串

function convert(x){
  switch(typeof x){
    case 'number':
      return x.toString(16);
    case 'string':
      return '"' + x + '"';
    default:
      return String(x);
  }
}
  • case关键字后跟随的是数字和字符串直接量switch语句中最常见的用法,ECMAScript标准允许每个case关键字跟随任意表达式
  • 表达式和case的匹配不会做任何类型转换
  • 实际上default标签可以放在switch语句内的任何地方
5.5 循环

循环语句就是程序路径的一个回路,可以让一部分代码重复执行
JavaScript中有4种循环语句:while、do/while、for、for/in。
5.5.1 while

while (expression)
  statement

使用while(true)会创建一个死循环
while循环输出0-9之间的数

var count = 0;
while (count < 10){
  console.log(count);
  count++;
}

5.5.2 do/while
do/while循环和while循环非常相似,只不过它是在循环的尾部检查表达式,这意味着循环体至少会执行一次。do/while循环并不像while循环那么常用。

do
	statement
while(expression);
function printArray(a){
  var len = a.length, i=0;
  if(len == 0)
    console.log("Empty Array");
  else{
    do{
      console.log(a[i]);
    }while (++i < len);
  }
}

do/while循环必须用do来标识循环的开始,用while来标识循环的结尾并进入循环条件条件判断,do循环是用分号结尾的。
5.5.3 for
for语句对常用的循环模式做了一些简化,大部分循环都具有特定的计数器变量。计数器的三个关键操作是初始化、检测、更新。

for (initialize ; test ; increment)
  statement

在上文种的while循环可以使用for循环来重写,这个循环同样输出数字0~9:

for (var count = 0;count <10;count++)
  console.log(count);

有些循环中的一次迭代会改变多个变量

var i ,j;
for (i =0,j=10 ; i<10 ; i++,j--)
  sum += i*j;

循环中可以是数字,也可以用for循环遍历链表数据结构,并返回链表的最后一个节点对象(也就是第一个不包含next属性的对象)

function tail(o){//返回链表的最后一个节点对象
  for(; o.next ; o = o.next) /*empty*/;  //根据判断o.next是不是真值来执行遍历
    return o;
}
  • 需要注意的是这段代码不包含initialize表达式,for循环中那三个表达式中的任何一个都可以忽略,但两个分号必不可少。
  • 如果省略test表达式,这将是一个死循环,死循环的其它写法:while(true)、for(;😉
    5.5.4 for in
    语法:
for (variable in Object)
  statement

variable通常是一个变量名,也可以是一个可以产生左值的表达式或者一个通过var语句声明的变量,总之必须是一个适用于赋值表达式左侧的值。object是一个表达式,它的计算结果是对象

  • 使用for循环来遍历数组元素是非常简单的:
for(var i=0 ; i<a.length ; i++)
  console.log(a[i]);
  • 而for/in循环则是用来更方便的遍历对象属性成员:
for(var p in o)//将属性名字赋值给变量p
  console.log(o[p]);//输出每一个属性的值
  • 在执行for/in语句的表达式的过程中,JavaScript解释器首先计算object表达式。如果表达式为null或undefined,将会跳过循环并执行后续代码。如果表达式等于一个原始值,这个原始值将会转换为与之对应的包装对象。否则,expression本身已经是对象了。JavaScript会依次枚举对象的属性来执行循环。然而在每次循环之前,JavaScript都会先计算variable表达式的值,并将属性名赋值给它。
  • 将所有对象属性复制至一个数组中:
var o ={x:1,y:2,z:3};
var a = [] , i = o;
for(a[i++] in o)/*empty*/;
  • JavaScript数组是一种特殊的对象,因此for/in循环可以用来枚举数组索引。
for(i in a) console.log(i);

其实,for/in循环并不会遍历对象的所有属性,只有可枚举的属性才会遍历到。比如,所有对象都有toString()方法,但for/in循环并不枚举toString这个属性。代码中定义的所有属性都是可枚举的。对象可以继承其它对象的属性,那些继承的自定义属性也可以使用for/in枚举出来。
属性枚举的顺序
主流浏览器厂商的JavaScript实现是按照属性定义的先后顺序来枚举简单对象的属性,先定义的属性先枚举。
以下情况,枚举的顺序取决于具体实现:

  • 对象继承了可枚举属性
  • 对象具有整数数组索引的属性
  • 使用delete删除了对象已有的属性
  • 使用Object.defineProperty()或者类似的方法改变了对象的属性。

当数组元素的索引是非数字或数组是稀疏数组(数组索引不是连续的)时它们则按照特定顺序枚举

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值