1.两种方法的对比

数组在JavaScript中,就像大多数的其它语言 一样,是对象。我们可以使用JavaScript内置的数组构造函数Array()来创建数组。就象对象的字面声名法一样,数组也可以采用字面法来声名。 而且我们建议使用数组的字面声名法。下面来看看这两种创建数组的方法:
// array of three elements
// warning: antipattern
var a = new Array("itsy", "bitsy", "spider"); // the exact same array
var a = ["itsy", "bitsy", "spider"]; console.log(typeof a); // "object", because arrays are objects
console.log(a.constructor === Array); // true

如上代码,采用字面的声名法来声名数组时,数组就是一组放在方括号中的数据,里面的数据元素可以是任意的数据类型,包括对象。字面的声名法更直观,更优雅,也更简洁,没有必要,也就应该用new Array()来创建数组。

2. 内置的数组构造函数中的陷阱

离内置的数组构造函数的原因并不只是上面列举的那些。这个”免费的“的内置构造函数有着许多让人意想不到的问题。比如,如果只传入一个整数作为参数,它并
不把这个整数作为第一个数据元素,而是用它来设置数组的长度 。如:new Array(3)
创建的是一个长度为3的数组,接下来如果你尝试读取第一个数据元素,你得到的将是undefined

// an array of one element
var a = [3];
console.log(a.length); // 1
console.log(a[0]); // 3 // an array of three elements
var a = new Array(3);
console.log(a.length); // 3
console.log(typeof a[0]); // "undefined"

仅仅传递一个整数作为内置数组的构造函数作为参数,其结果有些恶心但还可以理解,但当你传递一个浮点数作为参数时,事情变得更糟糕了:

// using array literal
var a = [3.14];
console.log(a[0]); // 3.14 var a = new Array(3.14); // RangeError: invalid array length
console.log(typeof a); // "undefined"

3. 判断一个对象是不是数组

对数组使用typeof操作符,返回的是"object"。虽然数组是个对象,但这个结果显然并不太有用:

console.log(typeof [1, 2]); // "object"

在ECMAScript 5中JavaScript有一个全新的方法检查一个对象到底是不是数据:使用 Array.isArray()。它可不是好骗的:

Array.isArray([]); // true

// trying to fool the check
// with an array-like object
Array.isArray({
length: 1,
"0": 1,
slice: function () {}
}); // false

在ExtJS框架里也有类似的方法:Ext.isArray()。如果你的代码的执行环境不支持ECMAScript 5,也没有其它框架,也可以使用下面的方法来验证数组对象:

if (typeof Array.isArray === "undefined") {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === "[object Array]";
};
}

最新文章

  1. 自定义RatingBar,不同分辨率屏幕下图片拉伸或者显示不完整问题解决
  2. HTML 5 应用程序缓存(上)
  3. 查看APK方法数的工具dex-method-counts
  4. python 五子棋
  5. CART(分类回归树)原理和实现
  6. wikioi 1475 m进制转十进制
  7. 查看mysql表结构的几种方法
  8. 二十四、Struts2中的UI标签
  9. <转载>gcc/g++编译
  10. C#中sealed关键字
  11. Python isinstance判断对象类型
  12. ios消息的交互方式
  13. 在OpenWrt上编写自己的硬件操作程序
  14. MDK下调试时提示AXF文件无法导入的解决方法(转)
  15. 手机自动化测试:appium源码分析之bootstrap十六
  16. Unity 继承MonoBehaviour脚本 执行顺序 详解
  17. Django_'utf-8' codec can't decode 问题解决
  18. JMeter Ultimate Thread Group阶梯式减压
  19. AI算法第一天【概述与数学初步】
  20. eclipse配置JDK

热门文章

  1. 分布式事务专题笔记(一) 基础概念 与 CAP 理论
  2. Java实现 LeetCode 775 全局倒置与局部倒置(分析题)
  3. Java实现 LeetCode 645 错误的集合(暴力)
  4. Java实现 LeetCode 155 最小栈
  5. java实现SPFA算法
  6. Java 是如何实现跨平台的?
  7. Linux 用户管理命令-usermod和chage
  8. ESXI多网卡网络配置
  9. Python Opencv-contrib Camshift&kalman卡尔曼滤波&CSRT算法 目标跟踪实现
  10. vj提交时常见问题