一、一些JavaScript对象,例如document.getElementsByTagName()返回的NodeList或者函数内部可用的arguments对象,他们表面上看起来,外观和行为像数组,但是不共享他们所有的方法。
1、arguments对象就提供一个length属性,但是不实现forEach()方法
二、Array的原生(prototype)方法可以用来处理类似数组行为的对象

  1. function printArguments() {
  2. Array.prototype.forEach.call(arguments, function(item) {
  3. console.log(item)
  4. })
  5. }
  6. printArguments('test')
  7. // test

三、Array的常规方法也可以用来处理字符串,因为它提供了序列访问字符转为数组的简单方法

  1. Array.prototype.forEach.call('a string', function(chr) {
  2. console.log(chr)
  3. })
  4. // a
  5. //
  6. // s
  7. // t
  8. // r
  9. // i
  10. // n
  11. // g

定义

一、类数组对象示例

  1. let arrayLike = {
  2. '0': 'a',
  3. '1': 'b',
  4. '2': 'c',
  5. length: 3
  6. };

类数组转换的几种方式

见可迭代对象#可迭代对象 / 类数组对象 转换的几种方式:https://www.yuque.com/tqpuuk/yrrefz/okaiah

类数组对象(array-like objects) / 类型化数组(Typed Arrays)

一、JavaScript typed arrays 是类数组对象(array-like object),其提供访问原始二进制数据的机制。
二、 [Array](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Array) 对象动态增长和收缩,可以有任何JavaScript值。但对于类型化数组,JavaScript引擎执行优化使得这些数组访问速度快速。
三、随着Web应用程序变得越来越强大,添加音频和视频处理等功能、可以使用 WebSockets 、使用原始数据, 这都需要访问原始的二进制数据,所以专门的优化将有助于JavaScript代码能够快速和容易地操纵原始二进制数据类型的数组。

缓冲区和视图:类型化的数组结构

一、为了实现最大的灵活性和效率,JavaScript类型数组被分解为缓冲(Buffer)和视图(views)。
1、缓冲(由ArrayBuffer 实现)是代表数据块的对象,它没有格式可言,并没有提供任何机制来访问其内容。为了访问包含在缓冲区中的内存,您需要使用视图。
2、视图提供了一个上下文,即数据类型、起始偏移量和元素数,这些元素将数据转换为实际类型数组。
image.png

ArrayBuffer

一、 ArrayBuffer是一种数据类型,用于表示一个通用的、固定长度的二进制数据缓冲区。你不能直接操纵一个ArrayBuffer中的内容;你需要创建一个数组类型视图或DataView来代表特定格式的缓冲区,并从而实现读写缓冲区的内容。

类型数组视图(Typed array views)

一、类型数组视图具有自描述性的名字,并且提供数据类型信息,例如Int8, Uint32, Float64等等。如一个特定类型数组视图Uint8ClampedArray. 它意味着数据元素只包含0到255的整数值。它通常用于Canvas数据处理

Type Value Range Size in bytes Description Web IDL type Equivalent C type
Int8Array -128 to 127 1 8-bit two’s complement signed integer byte int8_t
Uint8Array 0 to 255 1 8-bit unsigned integer octet uint8_t
Uint8ClampedArray 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t
Int16Array -32768 to 32767 2 16-bit two’s complement signed integer short int16_t
Uint16Array 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t
Int32Array -2147483648 to 2147483647 4 32-bit two’s complement signed integer long int32_t
Uint32Array 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t
Float32Array 1.2×10-38 to 3.4×1038 4 32-bit IEEE floating point number (7 significant digits e.g., 1.1234567) unrestricted float float
Float64Array 5.0×10-324 to 1.8×10308 8 64-bit IEEE floating point number (16 significant digits e.g., 1.123…15) unrestricted double double
BigInt64Array -263 to 263-1 8 64-bit two’s complement signed integer bigint int64_t (signed long long)
BigUint64Array 0 to 264-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long)