js中的Array 数组

45 阅读2分钟

Array 数组

引用类型-Array 类型

一、js 数组(Array)

数组对象是使用单独的变量名来存储一系列的值

例子:每个数字就是数组的值(数组成员), 每个值的下标都不一样(初始值下标为 0)

[1, 2, 3, 4, 5, 6, 7]

二、创建数组

1. new 操作符

(1)使用 Array 构造函数, 实例化一个对象

let arr = new Array()
arr[0] = 'a'
arr[1] = '今天天气真不错'
arr[2] = '1234'
arr[3] = 1234
console.log(arr)

let arr = new Array(7)
let arr1 = new Array('7')
console.log(arr) // [ <7 empty items> ]
console.log(arr1) // [ '7' ]

(2)new 的简单写法

let arr1 = new Array('a', '今天天气真不错', '1234', [1, 2, 3, '3'])
console.log(arr1)

Array(n) 或者 new Array(n) 生成的数组只有长度,没有元素,所以我称之为幽灵数组。这样的数组用 forEach 或者 map 等都不能正确遍历(因为没有元素),但很神奇的是它有 [@@iterator],可以使用 for ... of 遍历,也可以使用展开运算符来展开成数组(如 [...Array(10)]),更是可以使用 Array.from() 来转换。

new Array(n) 将创建一个 n * undefined 的数组,那么为什么不能使用 new Array(n).map((_, index) => index) 函数得到 [0, 1, 2 ..., n-1] 这样的数组呢?

我知道 new Array(n).fill(0).map((_, index) => index) 这样是可以的,但 n _ undefined 和 n _ 0 的两个数组有本质区别吗?

初始化一个 n*m 的二维数组常见的坑:

// 错误方式1:所有数组指向同一个引用
new Array(n).fill(new Array(m).fill(0))
// 错误方式2: “幽灵数组”问题
new Array(n).map(v => new Array(m).fill(0))
// 正确方式1:
new Array(n).fill(0).map(v => new Array(m).fill(0))

生成数组的时候,有很多种方式。 关于创建数组,参阅:JavaScript 数据处理 - 列表篇 | 八、创建数组

2.字面量表示法创建

(1)数组里面的值,可以是任何数据类型的值

let arr2 = ['a', '今天天气真不错', 1234, '1234', [1, 2, 3, '3']]

console.log(arr[0]) //a
console.log(arr[2]) //1234
console.log(arr[10]) //undefined
let arr3 = []
arr3[0] = 1
arr3[2] = 2
arr3[10] = 10
console.log(arr3) //[ 1, <1 empty item>, 2, <7 empty items>, 10 ]

三、检测数组

1.instanceof

instanceof 操作符的问题是当开发环境引入多个框架存在多个全局环境的时候,会出现 不同的 Array 构造函数,进而出现不同的结果。

let array = [1, 2, 3]
let array2 = '[]'

console.log(array instanceof Array) //true
console.log(array2 instanceof Array) //false

2.Array.isArray()

这个方法很好的解决了 instanceof 操作符的问题

console.log(Array.isArray(arr)) //true
console.log(Array.isArray(arr1)) //true
console.log(Array.isArray(array2)) //false