深入理解ECMAScript的几个关键语句


Posted in Javascript onJune 01, 2016

写在前面

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

while和for

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

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

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

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;

这两句分别获取hostname和url,因为它们共用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、接下来我们加上一个名为outer的label标签再分别看打印结果:

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=5且j=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=5且j=5时并没有跳出外循环,而只是跳出了内循环,即剩下的5次不予执行,所以打印的结果是95。

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

小结

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

以上这篇深入理解ECMAScript的几个关键语句就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现计算两个日期的间隔天数
Aug 14 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
Nov 25 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
Mar 14 Javascript
实现前后端数据交互方法汇总
Apr 07 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
详解基于javascript实现的苹果系统底部菜单
Dec 02 Javascript
canvas的神奇用法
Feb 03 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 Javascript
星期几的不同脚本写法(推荐)
Jun 01 #Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
Jun 01 #Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 #Javascript
底部悬浮通栏可以关闭广告位的实现方法
Jun 01 #Javascript
深入理解node exports和module.exports区别
Jun 01 #Javascript
jQuery基础知识点总结(DOM操作)
Jun 01 #Javascript
jQuery图片轮播插件——前端开发必看
May 31 #Javascript
You might like
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
Python内置函数OCT详解
2016/11/09 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
Python删除n行后的其他行方法
2019/01/28 Python
专科毕业生自我鉴定
2013/12/01 职场文书
委托书如何写
2014/08/30 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
写给医生的感谢信
2015/01/22 职场文书
2015年宣传工作总结
2015/04/08 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
高二化学教学反思
2016/02/22 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
python如何进行基准测试
2021/04/26 Python
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
Apache自带的ab压力测试工具的实现
2022/07/23 Servers