前言

前面已經瞭解了使用內建函數建構子的某些危險地方,但其實陣列與for in,也是有一些危險的地方。

陣列與for in

在前面幾個章節有講過陣列就是物件,所以我們一樣可以使用 for in來做處理。

1
2
3
4
5
var arr = ['John', 'Jane', 'Jim'];

for (var prop in arr) {
console.log(prop + ': ' + arr[prop]);
}

JavaScript 的陣列與其他程式語言有點不太一樣,prop 其實是名稱而 arr[prop] 是值的配對,而這就像名稱/值的配對,所以我們可以透過中括號取的,有點模糊吧,試著寫出物件會比較清楚。

1
2
3
4
5
6
7
var obj = {
0: 'John',
1: 'Jane',
2: 'Jim',
} obj[0];

而這代表著有一些問題,課堂上是著在原型上加入一個原型。

1
2
3大专栏  [JS奇怪的世界]No.55 危險小叮嚀:陣列與for in>
4
5
6
7
Array.prototype.myCustomFeature = 'cool!';

var arr = ['John', 'Jane', 'Jim'];

for (var prop in arr) {
console.log(prop + ': ' + arr[prop]);
}

我們可以看到剛剛加入至原型中的東西被跟著輸出了,原因是 var arr = ['John', 'Jane', 'Jim']; 這一段實體語法是在呼叫 new Array,所以在某些情況下不要對陣列使用 for in,而是使用 for

1
2
3
4
5
6
7
Array.prototype.myCustomFeature = 'cool!';

var arr = ['John', 'Jane', 'Jim'];

for (var i = 0; i < arr.length; i++) {
console.log(i + ': ' + arr[i]);
}

所以一般來講都會避免再 JavaScript 中使用 for in,因為陣列就是物件。

圖源

JavaScript 全攻略:克服 JS 奇怪的部分

[JS奇怪的世界]No.55 危險小叮嚀:陣列與for in的更多相关文章

  1. JS的异步世界

    前言 JS的异步由来已久,各种异步概念也早早堆在开发者面前.可现实代码中,仍然充斥了各种因异步顺序处理不当的bug,或因不好好思考,或因不了解真相.今天,就特来再次好好探索一番JS的异步世界. 01 ...

  2. Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法

    Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法 最近在适用Ext JS4开发 ...

  3. js - 奇怪的回调探索

    做一个手机端页面是发现的奇怪的问题,函数调用的问题(回调). 一句话描述: 某一个dom元素绑定的事件函数在全局能trigger方法调用,但是在ajax成功回调函数里不能被trigger方法调用. 具 ...

  4. CRM 2016 js 奇怪现象

    假如 js 中如果定义了 两个字段的onchage 事件. 如果一个字段的onchange事件,改变了另一个字段的值,那么也会触发另一个字段的onchange事件!!!!????

  5. vue.js - 奇怪的 event 对象

    好久都没有写点东西了, 前段时间工作搞得头大,真的就是一起加班到死了.废话不多说,写这篇文章是因为这次因为 event 对象闹了一个乌龙,以此总结一下. 一.event 对象 (一)事件的 event ...

  6. 使用Vue.js时,对Chrome控制台的一点小心得

    之前对Chrome控制台的console.log()输出没太放心上,其实仔细研究后,对工作效率有显著的提示.看下面的五段代码: console.log(''); console.log(typeof ...

  7. [Node.js] ECMAScript 6中的生成器及koa小析

    原文地址:http://www.moye.me/2014/11/10/ecmascript-6-generator/ 引子 老听人说 koa大法好,这两天我也赶了把时髦:用 n 安上了node 0.1 ...

  8. 使用Hammer.js的H5页面开发DOM的一些小说法

    前几天,一个小伙伴说叫我帮他写一个移动端上的一个轮播图,个人一般是不接私活的,毕竟平时工作也是单双休,时间也不很多. 可能大部分程序员,多余的时间都是看看新闻,打游戏,或者学习新的知识,缺少运动吧. ...

  9. 原生js添加博客点击鼠标出小心心效果~~

    昨天刚申请成功JS权限,心血来潮想添加点东西,记得之前看到别人家博客首页点击鼠标的时候会出现炫酷的 “小心心”,自己也来搞一个.没有用jquery啥的框架,原生js写起来麻烦了点,不过主要是怕博客首页 ...

随机推荐

  1. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:windows操作系统删除tensorflow

    输入:pip uninstall tensorflow Proceed(y/n):y

  2. 吴裕雄--天生自然 JAVA开发学习:抽象类

    public abstract class Employee { private String name; private String address; private int number; pu ...

  3. mysql之DTS的那些事

    最近才考虑数据库迁移,想起了之前做DTS踩过的那些坑. 基于数据库迁移,比如从源A库迁移到源B库,包括但不限于数据库上云. 数据库迁移方案有两种场景: (1).停机迁移方案 这种方案是允许停服的场景, ...

  4. php面向对象理解(一)

    常用的继承过程,以及对public.private.protected修饰符的理解: /*****************************父类************************* ...

  5. Hibernate相关概念及序列化和持久化的区别

    hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中. hibernate要做的事, ...

  6. 记录ionic 最小化应用时所遇的问题

    ionic3与ionic4最小化插件安装不一样: ionic3安装方法: $ ionic cordova plugin add cordova-plugin-appminimize $ npm ins ...

  7. 3)PHP的http 并发

    详解浏览器最大并发连接数:http://www.iefans.net/liulanqi-zuida-bingfa-lianjieshu/ 并发连接数对浏览器加载速度的测试:http://www.ief ...

  8. Events|sample space|mutually exclusive events

    5.2Events The collection of all 52 cards—the possible outcomes—is called the sample space for this e ...

  9. bind() 方法

    一. 定义和用法 bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 语法: $(selector).bind(event,data,function) 举例:  

  10. 解决2013Lost connection to MySQL server during query错误方法

    在my.ini配置文件 mysqld 节点下添加 max_allowed_packet = 500M 也就是配置MySQL允许的最大数据包大小,上面的500M你可以根据你的项目修改为你自己的值,只要比 ...