JavaScript学习笔记(六) 数组字面量和Array()构造方法

数组字面量(Array Literal)

在JavaScript中数组是一个对象,就像其它语言一样;
数组可以通过内置的Array()构造函数创建,但也有字面量语法去创建,和对象字面量差不多,数组字面量简单并且应该优先使用。

下面我们用两种不同的方式——相同的数据——创建两个数组,使用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

数组字面量语法(Array Literal Syntax)

数组字面量语法没有非常简单,就是逗号分隔的元素的集合,并且整个集合被方括号包围;
你可以给数组元素赋任何值,包括对象或其它数组;

数组字面量语法简单,直接,优雅;毕竟,数组就是一个下标从零开始的元素的集合;
没有必要去使用new去调用Array()构造方法,减少代码。

Array构造方法的不寻常(Array Constructor Curiousness)

还有一个远离new Array()的原因就是防止中了Array()构造方法为你准备的陷阱。
当你给Array()构造函数传递一个简单的整数时,它不会成为数组的第一个元素的值,而被用来设置数组的长度;
这意味着new Array(3)会创建一个数组长度为3的数组,但没有实际的元素;
如果你尝试去访问任何一个元素,你得到的是undefined,因为元素根本都不存在;
下面这段代码会展示使用Array()构造方法和字面量的不同之处:
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"
在程序运行的时候创建动态数组的时候,为了防止这种潜在的错误,更安全的是做法是使用数组字面量模式。

判断数组(Check for Array-ness)

对数组使用typeof操作符会返回“object”;
console.log(typeof [1, 2]); // "object"
虽然这样的行为说的过去(数组也是对象),但没有多少用;
你经常需要知道一个值到底是不是一个数组,有时候你可以检查length属性的状态或者一些数组方法来判断对象是不是数组;
但这样检查不是很好,因为没有理由其他非数组对象不能有同名的属性和方法;
也有人用instanceof Array,但在IE中有些情况下也不能正常工作;
ECMAScript 5 定义了一个新方法 Array.isArrya(),如何参数是个数组,它会返回true;
Array.isArray([]); // true
// trying to fool the check
// with an array-like object
Array.isArray({
    length: 1,
    "0": 1,
    slice: function() {}
}); // false
如果这个新方法在你的环境中是无法访问的,你可以调用Object.prototype.toString()方法来判断;
如果你使用数组作为参数调用toString的call()方法,它会返回“[object Array]”;
如果使用对象作为参数,它应该会返回“[object Object]”;
所以我们可以这样:
if (typeof Array.isArray === "undefined") {
    Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}
















评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值