考完试后闲来无事,想起好多天没写js了,于是打算实践一下最近看到的一些好玩的点子。结果写着写着,发现了一点有趣的小问题。出现问题的代码如下:

1 var array = [];
2 array["a"] = "hello";
3 array["b"] = "world";
4 array["c"] = "yes";
5 console.log("length: " + array.length);

  因为在之前看多的许多javascript书籍中,都宣称js是可以使用字符串作为数组下标的,因此我在用的时候也没觉得有什么不妥。但是在查看最后一句的控制台输出结果的时候,始料未及的情况出现了:

  显示的数组的length值居然是零,接着测试一下之前的步骤是否成功对数组进行了操作,console.log("array[b]: " + array["b"]); 的控制台输出结果如下:

  证明了之前的操作是成功的,那么既然数组的下标可以是字符串,为什么插入元素之后数组的长度显示仍然为零呢?为了进一步探索这其中的问题,我将上面的代码做了一点改动:

1 var array = [];
2 array["a"] = "hello";
3 array["b"] = "world";
4 array["c"] = "yes";
5 array["10"] = "no";
6 console.log("length: " + array.length);
7 console.log(array);

此时控制台中显示的结果为:

  唔,现在length的值变成了11。为了一探究竟,我把最后一行赋值语句的数组下标从10加到了100,并在控制台打印整个array数组的信息,输出结果如下:

  这下可以看到我们之前往数组中添加的所有元素的信息了,但是等等。。。这样的显示方式有点眼熟,看起来不像一般数组的显示方式,反而像是个对象!(表打我。。我知道数组也是对象::><::)我们知道Array对象是从Object对象继承得到的,那么莫非这些“看不见”的“数组元素”都变成了当前这个Array实例对象的属性?

  好吧,一个人在这里纯YY是木有用处的,还是看看网上的大神们是怎么说的吧。我在stackoverflow找到了一个一模一样的问题:http://stackoverflow.com/questions/10326635/string-index-in-js-array,对于这个问题,Michael Berkowski大神是这样解释的:

  Javascript的数组其实不像PHP或者其他一些语言一样拥有真正的字符串下标,当我们试图为一个js数组添加字符串下标的时候,其实就相当于为该数组对象添加了一个属性,属性名称就是我们所谓的“字符串下标”。由于为数组对象添加属性不会影响到同为该对象属性的length的值,因此该值将始终为零。同样地,.pop()和.shift()等作用于数组元素的方法也不能够作用于这些对象属性。因此,如果要使用的是一个完全由“字符串下标”组成的数组,那还是将其声明为一个Object类型的对象要更好一些。

  但是到了这里新的问题又冒出来了,既然具有字符串下标的元素会被作为该数组对象的属性,那么为什么array["10"]这一项会导致length的值变成11呢?我找到了以下这篇文章:《JS数组下标的总结》http://www.phper.org.cn/?post=65,在该文章的第一句中就回答了这个问题。根据经过一系列讨论之后得到的结果,将上述问题的答案整理如下:

  Javascript数组下标值的范围为0到2的32次方。对于任意给定的数字下标值,如果不在此范围内,js会将它转换为一个字符串,并将该下标对应的值作为该数组对象的一个属性值而不是数组元素,例如array[-1] = "yes" 其实就相当于给array对象添加了一个名为-1的属性,属性值为yes。如果该下标值在合法范围内,则无论该下标值是数字还是数字字符串,都一律会被转化为数字使用,即 array["100"] = 0 和 array[100] = 0 执行的是相同的操作。 

转载于:https://www.cnblogs.com/ZJAJS/archive/2013/01/19/2867847.html

javascript数组中数字和非数字下标的区别相关推荐

  1. 找出数组中任一重复的数字

    找出数组中任一重复的数字 找出数组中任一重复的数字   在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重 ...

  2. Java 高级算法——数组中查询重复的数字

    题目一:找到数组中重复的数字. 在一个长度为N的数组里的所有数字都在0--n-1的范围之内,数组中某些数字是重复的,但是不知道有几个数字是重复了,也不知道数字重复了几次,请找到数组中任意一个重复的数字 ...

  3. Java 高级算法——数组中查询重复的数字之二

    题目二:不修改数组找到重复的数字. 在一个长度为n+1的数组中,所有的数字都在1-n的范围之内,所以数组中至少一个是重复的,请找到重复的数字,但不能修改输入的数组 方法一:创建一个长度为n+1的辅助数 ...

  4. C语言:一个数组中只有两个数字是出现一次

    1 //1.一个数组中只有两个数字是出现一次, 2 //其他所有数字都出现了两次. 3 //找出这两个数字,编程实现.a 4 5 //^=单独两个数的^结果 6 //单独出现的两个数不同位的标记 7 ...

  5. LeetCode 2150. 找出数组中的所有孤独数字(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums .如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 ...

  6. 产生10个1-100的随机数,并放到一个数组中, 把数组中大于等于10的数字放到一个list集合中,并打印到控制台。

    代码 import java.util.ArrayList; import java.util.List; import java.util.Random;/*1.产生10个1-100的随机数,并放到 ...

  7. 笔试题:在整数数组中找到重复的数字

    题目描述: java编码实现在整数数组中找到重复的数字,要求复杂度低于O(N*N) 解题思路: 我用两种方法进行解答,其一是用桶的思想,其二是排序 程序代码: public class Main {p ...

  8. java 数组不重复_java如何找出数组中的不重复数字

    找出数组中不重复的一个数字,题目大致是这样的:int[] a = { 1, 2, 3, 4, 3, 2, 1 }; 在线视频教程推荐:java在线学习 解决办法是:public static int ...

  9. Excel VBA小程序03-快速提取单元格中的数字和非数字

    0.表格内容 A列 B列 手机2134 型号324 2135手机 325型号 2手机136 32型号6 1.Word法 1.1 提取非数字 遇事不决就去隔壁找Word,将表格A列内容复制到Word中, ...

  10. 如何在1到100的整数数组中找到缺失的数字

    有关编程面试的最常见问题之一就是:编写一个程序,用Java或任何其他语言查找数组中缺少的数字; 这种不仅在小型初创企业中被问到,而且还在谷歌,亚马逊,脸谱,微软等一些最大的技术公司中提出,主要是当他们 ...

最新文章

  1. 辽师836c语言真题,2018年武汉科技大学考研真题硕士研究生入学考试试题
  2. 网闸与防火墙的区别_网关和网闸、防火墙的区别?
  3. python一次性读取整个文件-使用Python读取大文件的方法
  4. html5--6-59 其他常用CSS属性
  5. 1114 Family Property (25 分)【难度: 中/ 知识点: 并查集】
  6. tif文件转pdf_PPT怎么转换成PDF文件?可以帮到你的PPT转PDF方法
  7. 一些 Linux 系统故障修复和修复技巧
  8. Eclipse新建项目里没有Web Project应该如何处理
  9. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
  10. 如何将数字转换成口语中的文本串
  11. 久谦咨询python笔试题目_python笔试含答案
  12. opencv-python 无法显示图片
  13. java 线程池与executor_详解Java线程池和Executor原理的分析
  14. 马斯克:未来将尝试打造超级高铁运输系统 时速是飞机的2倍
  15. [渝粤教育] 西南科技大学 财务会计 在线考试复习资料(2)
  16. sybase日志空间不足,增加日志空间步骤(有图有真相)
  17. IDEA设置类文件模板@Auther@Date等注释信息——idea笔记
  18. ubuntu开机出现initramfs该如何解决
  19. 打破FTTR布线标准瓶颈,让千兆光纤网络走进千家万户
  20. test case VS test scenario

热门文章

  1. 005 form组件---基本使用.
  2. leetcode 81 Search in Rotated Sorted Array II ----- java
  3. Java Project和Web Project
  4. 设计模式 - Composite
  5. Android Studio 使用Log
  6. kotlin 和java 混编
  7. C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性
  8. c++中,可以用类名直接访问非静态成员函数?
  9. C++中用new和不用new定义类的对象的区别解答
  10. Python—实训day6—爬取汽车消费投诉案例