数据结构-数组详解

87 阅读3分钟

定义

数组存储一系列同一种数据类型的值。虽然,JavaScript里,数组可以存储不同类型的值。

创建和初始化数组

let arr1 = [];
let arr2 = new Array(); // []
let arr3 = new Array(3); // 创建数据内存长度为3的空数组 [undefined,undefined,undefined]
let arr4 = new Array(1,2,3);  // 创建值为 [1,2,3]的数组
let arr5 = Array.of(3); // [,,]

访问元素和迭代数组

直接使用下标访问

console.log(arr3[1]); // 2

ps: 如果指定的索引是一个无效值,JavaScript 数组并不会报错,而是会返回 undefined

迭代访问

  1. forEach

arr4.forEach((value, index, originArray)=>{
    console.log(value, index, originArray) 
    // 1, 0, [1,2,3]
    // 2, 1, [1,2,3]
    // 3, 2, [1,2,3]
})
  1. for...of/ for...in
for (let value of arr4) {
  console.log(value);
  // 1
  // 2
  // 3
}
  1. for循环
for(let i = 0; i < arr4.length; i++){
    console.log(arr4[i]);
    // 1
    // 2
    // 3
}

ES6中,数组新增@@Iterator对象

  1. 使用@@Iterator对象
let iterator = arr4[Symbol.iterator]();
console.log(interator.next().value); // 1
console.log(interator.next().value); // 2
console.log(interator.next().value); // 3
  1. 同第5项,可使用数组的entries、values和keys方法

顺便讲下,经常使用的for...in和for...of的差别,具体可以点击链接去MDN看下文档,这块还是讲得比较清楚,而在作者这里只是简单记录一下。

for...offor...in的区别

无论是for...in还是for...of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。

for...in 语句以任意顺序迭代对象的可枚举属性。(输出的是遍历对象的可枚举属性,如数组输出的是下标元素)

for...of 语句遍历可迭代对象定义要迭代的数据。(输出的是迭代对象的数据)

数组方法

静态方法

  • Array.from() 从类数组对象或者可迭代对象中创建一个新的数组实例

  • Array.isArray() 用来判断某个变量是否是一个数组对象

  • Array.of() 根据一组参数来创建新的数组实例,支持任意的参数数量和类型

实例方法

用一个固定值填充一个数组中从起始索引到终止索引内的全部元素

类型数组

JavaScript 类型数组(Typed Arrays)将实现拆分为缓冲视图两部分。一个缓冲(由 ArrayBuffer 对象实现)描述的是一个数据块。缓冲没有格式可言,并且不提供机制访问其内容。为了访问在缓冲对象中包含的内存,你需要使用视图。视图提供了上下文 — 即数据类型、起始偏移量和元素数 — 将数据转换为实际有类型的数组。

image.png

使用类型数组的 Web API

// 缓冲

// 首先,创建一个 16 字节固定长度的缓冲:
var buffer = new ArrayBuffer(16);

// 确认一下数据的字节长度:以及内存值
if (buffer.byteLength === 16) {
 console.log("Yes, it's 16 bytes.");
} else {
 console.log("Oh no, it's the wrong size!");
}
// Yes, it's 16 bytes.

console.log(buffer);
// ArrayBuffer(16)



// 缓冲转视图(也可一个缓冲转多个视图)

//创建一个视图,此视图将把缓冲内的数据格式化为一个 32 位的有符号整数数组:
var int32View = new Int32Array(buffer);

// 像数组一样访问
for (var i = 0; i < int32View.length; i++) {
 console.log(int32View[i]);
 // 0 0 0 0
}

使用复杂的数据结构

通过将缓冲与不同类型视图组合,以及修改内存访问的偏移位置,你可以操作包含更多更复杂数据结构的数据。你可以使用js-ctypes操作诸如WebGL,数据文件或 C 语言结构体这些复杂的数据结构。

c语言结构

struct someStruct {
  unsigned long id;
  char username[16];
  float amountDue;
};

js读取c语言中的数据

var buffer = new ArrayBuffer(24);

// 从c语言结构体中读取数据

var idView = new Uint32Array(buffer, 0, 1); 
// id (longInt)
var usernameView = new Uint8Array(buffer, 4, 16);
// username (string)
var amountDueView = new Float32Array(buffer, 20, 1);
// amountDue (float)

类型数组转换

可以调用 Array.from实现这种转换,如果 Array.from 不支持的话,也可以通过如下代码实现:

var typedArray = new Uint8Array([1, 2, 3, 4]);
// 转换方式,Array.prototype.slice
var normalArray = Array.prototype.slice.call(typedArray);
console.log(normalArray.length); // 4
console.log(normalArray.constructor); // Array;

资料来源于: