今天学到了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. 2015华为德州扑克入境摘要——软体project

    直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...

  2. 给Ubuntu安装KDE桌面 [转]

    自ubuntu5.10发布以来,我非常难得的让她在我的硬盘上顽强生存了近3个月,仔细想想就连当年我第一个接触的红旗Linux也不过坚持了一个月,呵呵,又写了一段废话── 所 谓的“重回Kununtu” ...

  3. linux上安装配置vsftpd(转)

    转自:http://www.webarch.org/category/linux生产环境是Centos5.6,由于需要提供ftp服务,就找了一款比较小巧的ftp服务器端软件,vsftpd(vsftpd ...

  4. 剖析html对标准标签和自定义标签闭合与不闭合渲染问题

    昨天在修改去年写的系统的时候无意中看到了当时写的一个利用标准标签未闭合在单元格内把整个单元格颜色渲染成红色的效果,如下: 当时的问题是从后台返回来的是个int整数而%是写在页面上的如图 这 时候就出现 ...

  5. sails 相关文章

    Node 框架之sails   http://cnodejs.org/topic/555c3c82e684c4c8088a0ca1

  6. 写你自己struts1框架

    前言 文本 它们的定义Struts1 commons-digester.jar解析XML 实现XML标签到对象的转换 1.依据目标XML的结构定义解析规则文件 參照rule.xml 2.创建集合对象接 ...

  7. Android:创建耐磨应用 - 语音操作

    加入语音处理能力(Adding Voice Capabilities) 语音操作为用户体验可穿戴的重要组成部分,它允许用户快速.免提方式来运行操作. Wear它提供了两种类型的语音操作的: 该系统提供 ...

  8. [原创].NET 业务框架开发实战之七 业务层初步构想

    原文:[原创].NET 业务框架开发实战之七 业务层初步构想 .NET 业务框架开发实战之七 业务层初步构想 前言:本篇主要讲述如何把DAL和BLL衔接起来. 本篇议题如下: 1.       DAL ...

  9. MSSQL基础

    前言 最近看到一些关于sql的汇总博客,觉得还是很不错的.于是心血来潮,也想写一篇自己对这方面的一些认识(主要是点出一下自己比较少用demo写的,一般都是直接改设计时的,例如建表.该字段名). 一.数 ...

  10. MSMQ学习笔记

    这几天学习了一下MSMQ,虽然不能说非常深入的了解其机制与实际用法(具体项目的实现),但也要给自己的学习做个总结.学习心得如下: 一.MSMQ即微软消息队列.用于程序之间的异步消息通信,主要的机制就是 ...