理解ECMAScript的几个关键语句


写在前面

在这一章中我们聊一聊ECMAScript中的几个关键语句switchfor-inlabel等语句,加深我们对它们的理解和认识。首先从最常见的说起。

while和for

while和for是很常规的语句,无论是在JavaScript还是C还是其他编程语言中。而且在编程中我们较常用的也是forfor用起来更灵活,更简单,所以有些人可能就会产生这样一种误解:

forwhile更强大,能做到while做不到的一些事情。

其实我们稍微想想whilefor语句的语法应用,我们就会发现:

while循环做不到的for循环也做不到。

这是因为for循环只是把while循环有关的代码集中在了一起而已,其实有些时候,用while循环比用for循环更简单。这也是各司其职各有利弊吧。

关于循环的另一点,我们先看一段代码:

for(i=0;i<5;i++){
    console.log(i);
}
console.log(i);

在循环外打印i,打印输出是5

可以看到,在循环内部定义的变量在外部也是可以访问的。在一些语言中比如C,大括号定义的是块级作用域,但是在ECMAScript中是没有块级作用域这个概念的,所以在循环内部定义的变量在外部也是可以访问的。

switch语句

在其他编程语言中比如C,switch语句只能使用数字,而在ECMAScript中,switch语句可以使用任何数据类型,像字符串、对象都是可以的。

这里有一点需要说明:switch语句比较的时候使用的全等操作符,即===,所以‘10‘10不相等,因为在进行全等比较的时候,并不发生类型转换。

for-in语句

for-in语句是一种精确性的迭代语句,可以用来遍历对象的属性,当然也可以迭代数组的属性。下面分别以例子说明:

for-in遍历对象

  • window

先遍历一个特殊的对象window

for(var i in window){
    console.log(i);
}

会打印出一串很长很长的属性列表,大家可自行查看,在此不一一罗列赘述。

  • 自定义对象

遍历自定义对象

var o={prop1:‘value1‘, prop2:‘value2‘, prop3:‘value3‘};
for (var i in o){
    console.log(i);
}

打印出prop1 prop2 prop3

  • 数组

遍历数组

var array1=[1,2,3,4];
for(var i in array){
    console.log(i);
}

打印输出1 2 3 4

with语句

with语句可以用来限制作用域,即可以将代码的作用域设置到一个特定的对象中。如下:

var hostname=location.hostname;
var url=location.href;

这两句分别获取hostnameurl,因为它们共用location(同一个对象下的属性),所以我们可以将作用域限定在location中,即用with语句关联location对象。如下:

with(location){

    var hostname=hostname;
    var url=href;
}

需要注意的是:严格模式下使用with语句会有语法错误,同时,大量使用with语句会导致性能下降,同时也会给调试带来一定的困难,所以在开发应用程序的时候,尤其是开发大型应用程序的时候,并不建议使用with语句。

label语句

label语句用来在代码中加标签,从而可以在以后来使用它。一般情况下,加标签的语句要和for循环等循环语句配合来使用。

它的语法是:

label: statement

下面给出代码详细来看看label标签的用法。

1、先给出一段基本的代码:

var num=0;
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5&&j==5){
            break;
        }
        num++;
    }
}
console.log(num);

说明:break跳出了处在内部的for循环,j剩下的5次循环不再执行,所以打印的结果是95

2、接下来我们将break换成continue

var num=0;
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5&&j==5){
            break;
        }
        num++;
    }
}
console.log(num);

说明:continue跳出了本次循环,就是说跳出了处在内部for循环的这一次循环,所以打印的结果是99

3、接下来我们加上一个名为outerlabel标签再分别看打印结果:

var num=0;
outer:
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5&&j==5){
            break outer;
        }
        num++;
    }
}
console.log(num);

说明:加上了标签以后,用break跳到了标签outer处,就是说程序跳出了外循环,即程序执行到了i=5j=5时停止执行,所以打印的结果是55

4、我们再换成continue看看:

var num=0;
outer:
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5&&j==5){
            continue outer;
        }
        num++;
    }
}
console.log(num);

说明:这一次用的是continue,所以当程序执行到i=5j=5时并没有跳出外循环,而只是跳出了内循环,即剩下的5次不予执行,所以打印的结果是95

放在一起这几个显得稍微有些混淆,多理解理解就会好很多。

小结

我们学习一门东西不是为学而学,是为用而学,说白了就是为了工作而学,所以单纯理解上面的东西不是最重要的,不是为记而记,是为用而记,能够熟练运用在实践中才是我们希望的。同时,做笔记是一个很好的习惯,好记性不如烂笔头,如果你在做,那么希望你坚持下去。


时间: 2024-08-09 10:36:52

理解ECMAScript的几个关键语句的相关文章

CAD.Net中访问数据库的关键语句之一

.Net中所有对CAD数据库的处理都是通过“事务处理”来进行的,所以所有涉及访问CAD中对象的语句必须在下面的语句括号中执行. using (Transaction trans = db.TransactionManager.StartTransaction()) { 语句…… } CAD.Net中访问数据库的关键语句之一

[译]理解 ECMAScript 6 说明

说明 JavaScript核心语言功能定义在ECMA-262中,此标准定义的语言是ECMAScript,浏览器中的JavaScript和Node.js环境是它的超级.当浏览器与Node.js想要通过额外对象和方法增加更多的功能,其语言核心仍是在ECMAScript中定义的,这就是ECMA-262的持续发展对JavaScript整体成功至关重要的原因. 2007年,JavaScript处于十字路口.Ajax的流行使我们进入了动态web应用的新时代,然而.Javascript自从1999年发布的EC

JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期

JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet. 以下是JSP生命周期中所走过的几个阶段: 编译阶段: servlet容器编译servlet源文件,生成servlet类 初始化阶段: 加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法 执行阶段: 调用与JSP对应的servlet实例的服务方法 销毁阶段: 调用与JSP

Protected Functions 是理解OO的难点和关键

private和public函数都好理解,这里就不多说了,夹在中间的prortected却有许多精妙之处,说说我的几个疑问和看法:1. 通常用于子类扩展父类的功能的时候用,即类库程序员可以,但客户程序员不得使用.所以程序员一旦偷懒,不写子类而想直接使用保护函数,那是不行的.比如要给QLabel加上Click功能,明明有现成的mouseReleaseEvent的函数就可以实现点击效果,但客户程序员就是无法使用,不得不写一个QLabel的子类来实现,代码其实很简单:http://qt-project

[译]理解 ECMAScript 6 基本知识(未完)

基本知识 ECMAScript 6在ECMAScript 5之上做了大量的改变.一些改变很大,比如添加新的类型或者语法,而其它的非常小,提供了语言之上的渐进改进.这个章节包含了那些渐进改进,它们可能不会获得很多关注但提供了一些重要的功能,使得某些类型的问题更容易解决. 更好的Unicode支持 ECMAScript 6之前, JavaScript是完全基于16位字符编码的想法.所有的字符串属性和方法,比如length与charAt() ,是基于每一个16位序列表示一个字符这一想法.ECMAScr

ECMAScript——引用数据类型之操作语句

总结:if判断.三元运算符.switch case(=.==.===的区别) for(break continue).for in.while.do while循环

ant 关键字和关键语句

学习ant推荐的两个blog http://www.cnblogs.com/huozhicheng/archive/2010/04/08/2533199.htmlhttp://www.cnblogs.com/cyjch/archive/2012/03/28/2420761.html 关键词project   为ant构建文件的根元素,ant构建文件至少要包括一个根元素(project元素)target   元素为ant的基本执行单元,可以包含一个或多个具体任务,多个target之间可以存在依赖关

[译]理解 ECMAScript 6 内容目录

说明 浏览器与Node.js兼容 这本书是写给谁的 概述 帮助与支持 基本知识 更好的Unicode支持 其他字符串变化 其他正则表达式变化 Object.is() Block绑定 解构赋值 Numbers 总结 函数 默认参数 其他参数 变性参数 Spread运算符 name属性 块级方法 箭头函数 语法 总结 对象 对象类别 对象Literal 扩展 Object.assign() 复制对象Literal 属性 proto, Object.setPrototypeOf() super 映射方

深入理解JavaScript系列(16):闭包(Closures)

介绍 本章我们将介绍在JavaScript里大家常常来讨论的话题 -- 闭包(closure).闭包事实上大家都已经谈烂了.虽然如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部到底是怎样工作的. 正如在前面的文章中提到的.这些文章都是系列文章,相互之间都是有关联的.因此.为了更好的理解本文要介绍的内容,建议先去阅读第14章作用域链和第12章变量对象. 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-6-clos