深入理解ES6 010【學習筆記】

改進的陣列功能

new Array()的怪異行為,當建構函式傳入一個數值型的值,那麼陣列的 length 屬性會被設定為該值;如果傳入多個值,此時無論這些值是不是數值型的,都會變成陣列的元素。這個特性令人困惑,你不可能總是注意傳入資料的型別,所以存在一定的風險。

Array.of()

無論傳入多少個參數,不存在單一數值的特例(一個參數且數值型),總是回傳包含所有參數的陣列。

let items = Array.of(1,2); 
console.log(items.length); //2
console.log(items[0]); // 1
console.log(items[1]); // 2
items = Array.of(2);
console.log(items.length); //1
console.log(items[0]); //2
items = Array.of("2");
console.log(items.length); //1
console.log(items[0]); //"2"

Array.from()

將類陣列物件轉換成陣列物件來使用,Array.from()呼叫基於 arguments 物件中的元素來建立一個新陣列,args 是 Array 的一個實例,包含 arguments 物件中相同位置的相同值。如下所示:

function doSomthing(){
  var args = Array.from(arguments);
  // 使用args
}
// 可以提供一個映射函數作為Array.from()的第二個參數,這個函數用來將類陣列物件中的每一個值轉換成其他形式
// 還有第三個參數,是為了綁定上下文的
function translage(){
  return Array.from(arguments,(value)=>value+1)
}
let numbers = translage(1,2,3)
console.log(numbers) // 2,3,4
// 可以轉換可迭代物件

let numbers = {
  *[Symbol.iterator](){
    yield 1;
    yield 2;
    yield 3;
  }
}
let number2 = Array.from(numbers,(value)=>value+1)
console.log(numbers2) // 2,3,4

所有物件的新方法

  • find() 和 findIndex() 方法
  • fill()
  • copyWithin

型別化陣列 (Typed Array)

一種用於處理數值型別(正如其名,不是所有型別)資料的專用陣列。

型別化陣列的使用要先建立資料緩衝區

let buffer = new ArrayBuffer(10) // 分配10個位元組
console.log(buffer.byteLength) // 10

也可以使用slice方法分割已有的陣列緩衝區來建立一個新的,這個 slice() 方法與陣列上的 slice() 方法很像,傳入開始索引和結束索引作為參數,然後回傳一個新的 ArrayBuffer 實例,新實例由原始陣列緩衝區的切片組成。

let buffer = new ArrayBuffer(10)
let buffer2 = buffer.slice(2,6);
console.log(buffer2.byteLength) //2

透過視圖操作陣列緩衝區

先建立 ArrayBuffer 實例,然後再用這個實例來建立新的 DataView

let buffer = new ArrayBuffer(10),
view = new DataView(buffer);
// view物件可以存取緩衝區中所有10個位元組,如果提供一個表示位元偏移的數值,那麼這個緩衝區的其中一部分來建立視圖
view = new DataView(buffer,5,2); // 包含位於索引5和6的字元
  • 透過以下幾個屬性可以獲取視圖資訊
  • buffer 綁定的陣列緩衝區
  • byteOffset 預設是 0
  • byteLength

讀取寫入資料

JavaScript 有 8 種數值型資料型別,對於其中的每一種,都能在 DataView 的原型上找到相對應的陣列緩衝區中寫入資料和讀取資料的方法。這些方法名稱都以 set 或 get 開頭,緊接著是每種資料型別的縮寫,如下所示:

  • getInt8(byteOffset,litteEndian)
  • setInt8(byteOffset,litteEndian)
  • getUnit8(byteOffset,litteEndian)
  • setUnit8(byteOffset,litteEndian)
  • ...
let buffer = new ArrayBuffer(10),
view = new DataView(buffer);
view.setInt8(0,5);
view.setInt8(1,-1);
console.log(view.getInt16(0)); //1535
console.log(view.getInt8(0)); //5
console.log(view.getInt8(1)); //-1

型別化陣列是視圖

  • 型別化陣列與普通陣列的相似之處
  • 差異

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/4336

(0)
Walker的頭像Walker
上一篇 2026年3月10日 00:00
下一篇 2026年3月8日 15:40

相關推薦

  • Node深入淺出(聖思園教育) 001【學習筆記】

    node 從非同步程式設計典範理解 Node.js Node.js 的定位與核心思想 基於 V8 引擎 + libuv 事件驅動函式庫,將 JavaScript 從瀏覽器帶到伺服器端。 採用單執行緒事件迴圈處理 I/O,最大化利用 CPU 等待 I/O 的時間切片,特別適合高併發、I/O 密集型情境。 「不要阻塞主執行緒」是設計哲學:盡量把耗時操作交給核心或執行緒池,回呼結果…

    個人 2025年11月24日
    34400
  • TS珠峰 002【學習筆記】

    泛型 /* * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git &a…

    個人 2025年3月27日
    1.6K00
  • Go工程師體系課 protobuf_guide【學習筆記】

    Protocol Buffers 入門指南 1. 簡介 Protocol Buffers(簡稱 protobuf)是 Google 開發的一種語言無關、平台無關、可擴充的結構化資料序列化機制。與 JSON、XML 等序列化方式相比,protobuf 更小、更快、更簡單。 專案首頁:https://github.com/protocolbuffers/prot…

    個人 2025年11月25日
    1.3K00
  • TS珠峰 003【學習筆記】

    裝飾器 // 裝飾器 // 只能在類別中使用(類別本身,類別成員使用) // 裝飾器,類別的裝飾器,屬性裝飾器,存取器裝飾器 參數裝飾器 // 1. 類別裝飾器 給類別進行擴充,也可以回傳一個子類別 // 必須先在tsconfig.json中啟用experimentalDecorators const classDecorator1 =

    個人 2025年3月27日
    1.5K00
  • 深入理解ES6 012【學習筆記】

    代理(Proxy)和反射(Reflection)API 代理是一種可以攔截並改變底層 JavaScript 引擎操作的包裝器,在新語言中透過它暴露內部運作物件,從而讓開發者可以建立內建物件。 代理陷阱 覆寫的特性 預設特性 get 讀取一個屬性值 Reflect.get() set 寫入一個屬性值 Reflect.set() has in 運算子 Reflect…

    個人 2025年3月8日
    1.2K00
簡體中文 繁體中文 English