JavaScript 中 for in 循环和数组的问题
本文由 伯乐在线 - ElvisKang 翻译,进林 校稿。未经许可,禁止转载!
英文出处:adripofjavascript.com。欢迎加入翻译小组。
JavaScript的for…in循环用于迭代访问对象中的可枚举(enumerable)属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var tMinus = { two: "Two" , one: "One" , zero: "Blast off!" }; var countdown = "" ; for ( var step in tMinus) { countdown += tMinus[step] + "n" ; } console.log(countdown); // => "Two // One // Blast Off! // " |
因为for…in循环支持所有的JavaScript对象,所以它同样可用于数组对象之中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var tMinus = [ "Two" , "One" , "Blast off!" ]; var countdown = "" ; for ( var step in tMinus) { countdown += tMinus[step] + "n" ; } console.log(countdown); // => "Two // One // Blast Off! // " |
然而,以这样的方式遍历数组存在三个问题。首先,for…in循环会遍历数组对象的原型链中所有的可枚举属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Array.prototype.voice = "James Earl Jones" ; var tMinus = [ "Two" , "One" , "Blast off!" ]; var countdown = "" ; for ( var step in tMinus) { countdown += tMinus[step] + "n" ; } console.log(countdown); // => "Two // One // Blast Off! // James Earl Jones // " |
不过,我们可以借助hasOwnProperty函数来避免这一问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Array.prototype.voice = "James Earl Jones" ; var tMinus = [ "Two" , "One" , "Blast off!" ]; var countdown = "" ; for ( var step in tMinus) { if (tMinus.hasOwnProperty(step)) { countdown += tMinus[step] + "n" ; } } console.log(countdown); // => "Two // One // Blast Off! // " |
此外,在ECMAScript5.1规范中提到,for…in循环可能以任意顺序来遍历对象的属性。
对于无序的普通对象来说,属性的访问顺序无关紧要。但有时候你可能不想Javascript engine以随机顺序处理你的数组元素,因为它会导致不可预知的结果:
1
2
3
4
5
|
console.log(countdown); // => "Blast Off! // One // Two // " |
最后,for…in循环除了访问数组元素以外,还会访问其它的可遍历属性。正如我们在之前的文章所提到的,我们可以向数组变量添加额外的属性。而这样的操作同样会导致不可预知的后果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
var tMinus = [ "Two" , "One" , "Blast off!" ]; tMinus.announcer = "Morgan Freeman" ; var countdown = "" ; for ( var step in tMinus) { if (tMinus.hasOwnProperty(step)) { countdown += tMinus[step] + "n" ; } } console.log(countdown); // => "Two // One // Blast Off! // Morgan Freeman // " |
由此可见,当你需要遍历数组元素的时候,应使用for循环或者数组对象的内置迭代函数(如forEach、map等),而不是for…in循环。
JavaScript 中 for in 循环和数组的问题的更多相关文章
- 深入理解javascript中的事件循环event-loop
前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...
- [译]Javascript中的for循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- [译]Javascript中的do-while循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- JavaScript中的事件循环机制跟函数柯里化
一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 深入了解 JavaScript 中的 for 循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
- JavaScript中for..in循环陷阱介绍
for...in循环中的循环计数器是字符串,而不是数字它包含当前属性的名称或当前数组元素的索引,下面有个不错的示例大家可以参考下 大家都知道在JavaScript中提供了两种方式迭代对象: (1) ...
- javascript中for/in循环及使用技巧
JavaScript 支持不同类型的循环: for - 循环代码块一定的次数 for/in - 循环遍历对象的属性 while - 当指定的条件为 true 时循环指定的代码块 do/while - ...
- 深入了解JavaScript中的for循环
在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...
随机推荐
- Linux及安全——程序破解
Linux及安全——程序破解 由于我的Ubuntu的vi有故障,所以用kaili做. 运行原程序 1.反汇编代码,查看 objdump -d login 2.修改代码 vi login 转换为16进制 ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- pythonchallenge(三)
PythonChallenge_3 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux ...
- 打开mmc后添加单元,出现停止工作的解决方法
出现mmc停止工作,一般是其他软件的影响.关闭其他软件就可以了,但不知道是什么软件,所以只有进入干净状态.(也可以进入安全模式) 1.如何进入干净启动状态: ===================== ...
- ASP.NET MVC5 插件化机制简单实现
一.前言 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体 ...
- threejs构建web三维视图入门教程
本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...
- cookie的操作
比如这样如果一个网站上有两个域名的时候,我们需要考虑,两个域名下的cookie. 我们所说的跨域只的就是lesport.com和le.com js的cookie是不能跨域的,为了防止过大. js增加删 ...
- 【Groovy基础系列】 Groovy运算符
?运算符 在java中,有时候为了避免出现空指针异常,我们通常需要这样的技巧: if(rs!=null){ rs.next() … … } 在groovy中,可以使用?操作符达到同样的目的: rs?. ...
- 每天一个linux命令(52):scp命令
scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且 scp传输是加密的.可能会稍微影响一下速度.当你服 ...
- android学习——error opening trace file: No such file or directory (2)
1.疑惑: 程序运行起来的时候日志总是显示下面这个错误,但是不影响程序的正常进行,我是用真机来测试的,android4.4.4(API17). 02-11 14:55:03.629 15525-155 ...