ES5 Array

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CJXBShowZhouyujuan/article/details/86033675

数组

数组

定义

数组是个对象,创建后在堆中分配内存

数组是有序的。下标从0开始

任何类型的数据,都可以放到数组

数组的本质

数组属于一种特殊的对象。typeof 返回的数组类型是 object

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

数组的特殊性体现在,它的键名是按次序排列的一组整数

var array = ['a', 'b', 'c']
Object.keys(array) // ["0", "1", "2"]

对象每个成员必须指定键名。

对象的键名一律为字符串,所以,数组的键名其实也是字符串。之所以可以用数值读取,是因为非字符串的键名会被转为字符串

var array = ["1", "2"];
array[0] // "1"
array["0"] // "1"

对象有两种读取成员的方法:点结构(object.key)和方括号结构(object[key])。但是,对于数值的键名,不能使用点结构

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

length 属性

数组的length属性,返回数组的成员数量.

length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值。

扫描二维码关注公众号,回复: 4822561 查看本文章
var array = ["a","b","c"];
array.length = 3;
array.length = 2;
console.log(array) //  ["a","b"]

清空数组的一个有效方法,就是将length属性设为0。

如果人为设置length大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空位.

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

length属性的值就是等于最大的数字键加1

var a = [];
a['p'] = 'abc';
a[2.1] = 'bcd';
console.log(a) 
// [p: "abc", 2.1: "bcd"]
console.log(a.length) // 0

如果数组的键名是添加超出范围的数值,该键名会自动转为字符串。

in 运算符

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

var arr = [ 'a', 'b', 'c' ];
2 in arr  // true
'2' in arr // true
4 in arr // false
var dict = {method: 'GET', url: 'url'}
if ('method' in dict)

如果数组的某个位置是空位,in运算符返回false。

var arr = [];
arr[10] = 'a';
arr[1] = undefined;
if (1 in arr) {
    console.log('1--true')
}
if (0 in arr) {
    console.log('0--true')
}
if (10 in arr) {
    console.log('10---true')
}
//1--true
// 10---true

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

forEach方法

var colors = ['red', 'green', 'blue'];
colors.forEach(function (color) {
  console.log(color);
});
// red
// green
// blue

delete 删除一个数组成功,会形成一个空位,不影响length的属性

var a = [1,2,3]
delete a[1]
a[1] // undefined
a.length // 3

length属性不过滤空位。所以,使用length属性进行数组遍历,一定要非常小心.

数组的某个位置是空位,与某个位置是undefined,是不一样的

如果是空位,使用数组的forEach方法、for…in结构、以及Object.keys方法进行遍历,空位都会被跳过。

var a = [, , ,];
a.forEach(function (x, i) {
  console.log(i + '. ' + x);
})
// 不产生任何输出
for (var i in a) {
  console.log(i);
}
// 不产生任何输出
Object.keys(a)
// []
// 数值是undefined的情况
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
  console.log(i + '. ' + x);
});
// 0. undefined
// 1. undefined
// 2. undefined
for (var i in a) {
  console.log(i);
}
// 0
// 1
// 2
Object.keys(a)
// ['0', '1', '2']

空位就是数组没有这个元素,所以不会被遍历到,而undefined则表示数组有这个元素,值是undefined,所以遍历不会跳过。

类似数组的对象

如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”

这种length属性不是动态值,不会随着成员的变化而变化。

var dict = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3 // 这里必须写
}
console.log(dict.length) // 3
dict['3'] = 'd'
console.log(dict.length) // 3

典型的例子

// arguments对象
function args() { return arguments }
var arrayLike = args('a', 'b');
arrayLike[0] // 'a'
arrayLike.length // 2
arrayLike instanceof Array // false
// DOM元素集
var elts = document.getElementsByTagName('h3');
elts.length // 3
elts instanceof Array // false
// 字符串
'abc'[1] // 'b'
'abc'.length // 3
'abc' instanceof Array // false

“类似数组的对象”变成真正的数组

var arr = Array.prototype.slice.call(arrayLike);
function logArgs() {
  Array.prototype.forEach.call(arguments, function (elem, i) {
    console.log(i + '. ' + elem);
  });
}

静态方法

  • Array.isArray()
var arr = [1,1]
typeof arr // "object"
Array.isArray(arr) // true
  • valueOf()

数组的valueOf方法返回数组本身。

var arr = [1,2,3];
arr.valueOf() // [1,2,3]
  • toString()

数组的toString方法返回数组的字符串形式

var arr = [1,2,3,[4,5,6]];
arr.toString() // "1,2,3,4,5,6"
  • push()

push 在数组的末端添加一个/多个元素,返回值:添加后的数组的长度。

  • pop()

pop方法删除数组的最后一个元素,并返回这个元素

  • shift()

shift()方法用户删除数组的第一个元素,并返回该元素。

push和shift构成一个“先进先出”的队列

  • unshift()

在数组的第一个位置添加元素,返回添加后的数组长度

  • join()

以指定的参数分割父,将所有的数组成员连接为一个字符串。默认的是逗号

如果数组成员是undefined或者null 会转换为空字符串

  • concat() (不改变原数组)

多个数组的合并。它将新数组的成员添加到原数组成员的后部,返回一个新的数组,原数组不变。

['hello'].concat(['world'])
// ["hello","world"]
  • reverse()

reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。

var a = ['a','b','c']
a.reverse() // ['c','b','a']
  • slice() (不改变原数组)

提取目标数组的一部分,返回一个新数组,原数组不变

arr.slice(start,end)

猜你喜欢

转载自blog.csdn.net/CJXBShowZhouyujuan/article/details/86033675
ES5