数组

2017-02-22  本文已影响0人  尘满面鬓微霜

1.数组的定义

任何类型的数据,都可以放入数组。如果数组的元素还是数组,就形成了多维数组。

var arr = [
  {a: 1},
  [1, 2, 3],
  function() {return true;}
];

arr[0] // Object {a: 1}
arr[1] // [1, 2, 3]
arr[2] // function (){return true;}

var a = [[1, 2], [3, 4]];
a[0][1] // 2
a[1][1] // 4

2. 数组的本质

本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2…)。JavaScript语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串。对象有两种读取成员的方法:“点”结构(object.key)和方括号结构(object[key])。但是,对于数值的键名,不能使用点结构。

typeof [1, 2, 3] // "object"

var arr = ['a', 'b', 'c'];

arr['0'] // 'a'
arr[0] // 'a'

Object.keys(arr)
// ["0", "1", "2"]

var arr = [1, 2, 3];
arr.0 // SyntaxError

3.length属性

只要是数组,就一定有length属性。该属性是一个动态的值,等于键名中的最大整数加上1。

var arr = ['a', 'b'];
arr.length // 2

arr[9] = 'd';
arr.length // 10

当数组的length属性设为2(即最大的整数键只能是1)那么整数键2(值为c)就已经不在数组中了,被自动删除了。上面代码表示,当length属性设为大于数组个数时,读取新增的位置都会返回undefined。

如果人为设置length为不合法的值,JavaScript会报错。

var arr = [ 'a', 'b', 'c' ];
arr.length // 3

arr.length = 2;
arr // ["a", "b"]

var a = ['a'];

a.length = 3;
a[1] // undefined

4.类数组对象

它们看上去很像数组,可以使用length属性,但是它们并不是数组,所以无法使用一些数组的方法。类似数组的对象只有一个特征,就是具有length属性。

//数组的slice方法将类似数组的对象,变成真正的数组。
var arr = Array.prototype.slice.call(arrayLike);

// for循环
function logArgs() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(i + '. ' + arguments[i]);
  }
}

// forEach方法
function logArgs() {
  Array.prototype.forEach.call(arguments, function (elem, i) {
    console.log(i+'. '+elem);
  });

//字符串也是类似数组的对象,所以也可以用Array.prototype.forEach.call遍历。
Array.prototype.forEach.call('abc', function(chr) {
  console.log(chr);
});
// a
// b
// c
}

5.in 运算符

检查某个键名是否存在的运算符in,适用于对象,也适用于数组

var arr = [ 'a', 'b', 'c' ];
2 in arr  // true
'2' in arr // true
4 in arr // false

var arr = [];
arr[100] = 'a';

100 in arr // true
1 in arr // false

6.for…in 循环和数组的遍历

for...in循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。但是,for...in不仅会遍历数组所有的数字键,还会遍历非数字键。

var a = [1, 2, 3];
a.foo = true;

for (var key in a) {
 console.log(key);
}
// 0
// 1
// 2
// foo

7.数组的空位

当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。数组的空位不影响length属性。使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。如果某个位置是undefined,遍历的时候就不会被跳过。```javascript
var a = [1, 2, 3];
delete a[1];

a[1] // undefined
a.length // 3

上一篇 下一篇

猜你喜欢

热点阅读