今天学到了JavaScript的语句篇。同其他常见编程语言如C、Java等一样,JavaScript中的语句包含:①表达式语句②复合语句和空语句③声明语句④条件语句⑤循环语句⑥跳转语句,当然JavaScript还有⑦其他三种语句。那么标题叫做JavaScript循环之for/in循环,主要是因为我觉得这里面大多语句跟C、Java那些一样,没必要再浪费口舌介绍了,但for/in循环是第一次在JavaScript中接触的。当然,这些都是非常基础的内容,只是做为学习笔记,初学JavaScript可以看看,熟练掌握的就不必再浪费时间阅读了。

  首先,先说下稍微有点特殊性的空语句吧。空语句只有一个分号即:  ; ,很简单,令人不禁要想有毛用?  。曾经听说过:世界上任何事物如果存在,必有它存在的原因。空语句也不例外,它还是有点作用滴。JavaScript解释器执行空语句时它显然不会执行任何动作。但实践证明,当创建一个具有空循环体的循环时,空语句有时很有用。例如:

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

  在这个循环中,所有操作都在表达式a[i++]=0中完成,并不需要任何循环体,然而JavaScript需要循环体中至少要包含一条语句,因此这里用了空语句。当然这个也可以用while循环实现,只是这个简洁了点而已。

  空语句目测也就那点作用了。至于JavaScript中的声明语句,那肯定得详细说说变量声明提前特性了啊,这是JavaScript的一个重点啊,很抱歉这里就不详说了,如果想要了解,请点击:http://www.cnblogs.com/craftsman-gao/p/4720635.html 。条件语句中,if 和else if 也都跟C、Java一样,就不多废话了,switch 语句倒是有一个容易忽略的知识点。当执行switch语句时,首先计算switch后括号中的表达式的值,然后查找case子句的表达式的值是否和switch后面括号中表达式的值相同,来进行匹配,重点是:这里比较两个表达式的值是否相同时使用的是完全相等,即"===" 。

  好了,现在到真正要说的循环语句了。JavaScript中的循环有四种,:while、do/while、for 和 for/in。前三种也是没啥特点,所以就直接说for/in了。先看其语法:

 for(variable in object)
statement

  variable通常是一个变量名,也可以是一个可以产生左值的表达式或者一个通过var 语句声明的变量,总之必须是一个适合用于赋值表达式左侧的值。object是一个表达式,这个表达式的计算结果是一个对象。同样,statement 是一个语句或语句块,它构成了循环的主体。使用for/in循环可以很方便的遍历对象属性成员:

 for(var p in o)
console.log(o[p]);

  在执行for/in语句过程中,JavaScript解释器首先计算object表达式。如果表达式为null 或者 undefined , JavaScript解释器将会跳过循环并执行后续代码。如果表达式等于一个原始值,这个原始值将会转换成与之对应的包装对象。否则,表达式本身已经是对象了。JavaScript会依次枚举对象的属性来执行循环。在每次循环之前,JavaScript都会将对象的一个属性名(一个字符串)赋值给variable。

  需要注意的是,只要for/in循环中variable的值可以当做赋值表达式的左值,它可以是任意表达式。例如,可以使用下面这段代码把所用对象属性复制到一个数组中:

 var o = {x:1, y:2, z:3};
var a =[], i=0;
for(a[i++] in o) ;//注意这里就用了空语句

  因为,JavaScript数组是一种特殊的对象,因此,for/in循环可以像枚举对象属性一样枚举数组索引。例如:

 for(var i in arr)
console.log(i);//依次输出数组的索引值

  注意:for/in循环并不会遍历对象的所有属性,只有“可枚举(enumerable)”的属性才会遍历到(这一点是对象的内容了,以后再做详说吧)。由JavaScript语言核心所定义的内置方法就不是“可枚举的”。比如,所有的对象都有方法toString(),但for/in循环并不枚举toString这个属性。除了内置方法之外,还有很多内置对象的属性也是“不可枚举的“。而代码中定义的所有属性和方法是可枚举的。对象可以继承其他对象的属性,那些继承的自定义属性也可以使用for/in枚举出来。关于属性枚举的顺序,ECMAScript规范并没有指定,主流浏览器厂商的JavaScript实现是按照属性定义的先后顺序来枚举简单对象的属性,先定义的属性先枚举。如果使用对象直接量的形式创建对象,则将按照直接量中属性出现顺序枚举。

  还有两点需要注意:a.如果for/in的循环体删除了还未枚举的属性,那么这个属性将不会再枚举到;b.如果循环体定义了对象的新属性,这些属性通常也不会枚举到;

  另外的三种语句就是:①with②debugger(用于调试程序时给程序打断点)③"use strict"。不过这里先暂且不说这三个了。

[新增(2105.09.07)]今天在写比较两个对象的各个属性值是否完全相同时,发现for/in循环中,调用对象属性值只能使用[]运算符,并不能使用.运算符,不管是在遍历数组还是普通对象。又算是学习路上发现的一坑吧,这里记录下。

[新增(2105.09.011)]在使用for/in循环遍历对象的属性时。对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性,对于继承属性它将返回false,例如:。

 var o = {x:1};
o.hasOwnProperty('x'); //true: 对象o有一个自有属性x
o.hasOwnProperty('y'); //false:对象o不存在属性y
o.hasOwnProperty('toString'); //false:toString是继承属性

JavaScript循环之for/in循环的更多相关文章

  1. Javascript并发模型和事件循环

    Javascript并发模型和事件循环 JavaScript的"并发模型"是基于事件循环的,这个并发模型有别于Java的多线程, javascript的并发是单线程的. Javas ...

  2. javascript语句——条件语句、循环语句和跳转语句

    × 目录 [1]条件语句 [2]循环语句 [3]跳转语句 前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行.而javascript中的很多语句可以改变语句的默认执行顺序.本文 ...

  3. Javascript中while和do-while循环用法详解

    while循环 while 语句与 if 语句相似,都有条件来控制语句(或语句块)的执行,其语言结构基本相同:while(conditions){    statements;} while 语句与 ...

  4. javascript的event loop事件循环

    javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.lo ...

  5. 2017-12-06 JavaScript实现ZLOGO子集: 单层循环功能

    前文JavaScript实现ZLOGO子集: 前进+转向的示例代码很累赘, 因此尝试实现基本的循环功能, 使得前面的11行代码缩减为7行: 开始 循环4次 前进200 左转144度 到此为止 前进20 ...

  6. javascript中的for in循环和for in循环的使用陷阱

    javascript中的for循环和for...in循环还是有些区别的,比如定义一个数组,然后用for..in循环输出 var array=[1,2,3,4,5,6]; for(var s in ar ...

  7. 好文:javascript中的四种循环

    https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...

  8. JavaScript 中的12种循环遍历方法

    原文:JavaScript 中的12种循环遍历方法 题目:请介绍 JavaScript 中有哪些循环和遍历的方法,说说它们的应用场景和优缺点? 1.for 循环 let arr = [1,2,3];f ...

  9. Javascript基础系列之(六)循环语句(for循环)

    如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. document.write(cars[0] + "<br>"); document ...

随机推荐

  1. minihomepage.exe 百度视频迷你主页

    百度视频最近动作可真.延续"DHot.exe 热点资讯"之后,又在桌面上出现了Tips窗体,例如以下图: 尽管是迷你的,可还是把其他桌面图标给挡了啊! 突然出来这么个窗体.我还以为 ...

  2. Windows Server 2012 R2在桌面上显示计算机/网络图标

    原文 Windows Server 2012 R2在桌面上显示计算机/网络图标 从Windows2012开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令调出.具体方法如下: ...

  3. 解决win10 iot VS编程出现的无法引用错误

    使用NuGet安装 Microsoft.NETCore 5.0 安装 Microsoft.NETCore

  4. RH033读书笔记(3)-Lab 4 Browsing the Filesystem

    Lab 4 Browsing the Filesystem Sequence 1: Directory and File Organization 1. Log in as user student ...

  5. 查看SQLSERVER内部数据页面的小插件Internals Viewer

    原文:查看SQLSERVER内部数据页面的小插件Internals Viewer 查看SQLSERVER内部数据页面的小插件Internals Viewer 感觉internals viewer这个名 ...

  6. Code::Blocks项目配置基础

    File 菜单 New :新建( Empty file/file . class . project . build target ) . Recent projects/files :近期打开的项目 ...

  7. mvc+webapi+dapper+ef codefirst项目搭建

    首先项目是mvc5+webapi2.0+orm数据处理(dapper)+ef动态创建数据库. 1.项目框架层次结构: mvc项目根据不同的业务和功能进行不同的区域划分[今后项目维护起来方便],mode ...

  8. Cocos2d-X 使用CCTableView创建滚动视图

    CCTableView和CCScrollView如创建滚动视图,CCTableView该函数将是更,制造更多麻烦 实例1:使用CCTableView创建滚动视图 首先创建一个TableView类 Ta ...

  9. 探索Windows Azure 监控和自动伸缩系列1 - 连接中国区Azure

    最近准备基于Microsoft Azure Management Libraries 实现虚拟机的监控.主要的需求就是获取虚拟机内置的性能计数器数据,基于性能计数器实现后续的监控和自动伸缩. 作为这一 ...

  10. Objective-C语言的一些基础特性

    OC与C++.Java等面向对象语言有很多的类似之处,不过在很多方面也是有所差别的.若是用过某一种面向对象语言,那么就很容易理解OC语言所用的范式和模板了.但是在语法使用上,也许会显得陌生.因为OC语 ...