ArrayBuffer is a low-level data structure that represents a chunk of memory. It is used in contexts where you need to handle binary data directly, like image processing, file handling, or WebAssembly.
Common Use Cases:
An ArrayBuffer was created with a fixed size and couldn't be modified after creation. This meant that resizing required creating a new buffer and copying data manually.
let buffer = new ArrayBuffer(10); // Fixed size of 10 bytes // To "resize", you had to create a new ArrayBuffer: let newBuffer = new ArrayBuffer(15); new Uint8Array(newBuffer).set(new Uint8Array(buffer));
You can create resizable ArrayBuffer objects with the option to resize and transfer their contents, making them more flexible for handling variable-length data.
Expanded Example:
let buffer = new ArrayBuffer(10, { maxByteLength: 20 }); console.log(buffer.byteLength); // Initial length: 10 bytes // Resize the buffer buffer.resize(15); console.log(buffer.byteLength); // Resized length: 15 bytes // Transfer the buffer's contents to a new buffer with a different length let newBuffer = buffer.transfer(5); console.log(newBuffer.byteLength); // Transferred length: 5 bytes
Pros:
Cons:
A regular expression (regex) is a sequence of characters that forms a search pattern. They are commonly used for tasks like searching, replacing, and validating strings.
Common Use Cases:
Regex sets were limited in how they could represent complex character ranges or combinations. Creating specific sets required verbose patterns.
// Matching "a", "c", "d", or "e" required explicit listing: let regex = /[acd]|e/; console.log(regex.test("d")); // true
The /v flag introduces advanced set operations, allowing more expressive patterns.
Expanded Example:
// Using the /v flag for advanced sets let regex = /[a[c-e]]/v; // Matches "a", "c", "d", or "e" console.log(regex.test("d")); // true console.log(regex.test("b")); // false
Pros:
Cons:
A Promise is an object representing the eventual completion or failure of an asynchronous operation. It allows developers to write asynchronous code that can handle eventual results in a more readable way compared to traditional callback-based code.
Common Use Cases:
Manually handling resolve and reject functions outside the Promise constructor was cumbersome.
let buffer = new ArrayBuffer(10); // Fixed size of 10 bytes // To "resize", you had to create a new ArrayBuffer: let newBuffer = new ArrayBuffer(15); new Uint8Array(newBuffer).set(new Uint8Array(buffer));
Promise.withResolvers simplifies this pattern by returning an object containing the promise, resolve, and reject functions directly.
Expanded Example:
let buffer = new ArrayBuffer(10, { maxByteLength: 20 }); console.log(buffer.byteLength); // Initial length: 10 bytes // Resize the buffer buffer.resize(15); console.log(buffer.byteLength); // Resized length: 15 bytes // Transfer the buffer's contents to a new buffer with a different length let newBuffer = buffer.transfer(5); console.log(newBuffer.byteLength); // Transferred length: 5 bytes
Pros:
Cons:
Grouping refers to the process of categorizing data into collections based on shared properties or criteria. It simplifies data analysis and presentation.
Common Use Cases:
Grouping data often involved using the reduce() method or custom logic, which could be verbose and repetitive.
// Matching "a", "c", "d", or "e" required explicit listing: let regex = /[acd]|e/; console.log(regex.test("d")); // true
Object.groupBy and Map.groupBy simplify data grouping.
Expanded Example:
// Using the /v flag for advanced sets let regex = /[a[c-e]]/v; // Matches "a", "c", "d", or "e" console.log(regex.test("d")); // true console.log(regex.test("b")); // false
Pros:
Cons:
Atomics allow operations on shared memory that multiple workers can access. This is crucial for parallel computing, where tasks need to be synchronized and safe from race conditions.
Common Use Cases:
Waiting for changes to shared memory had to be done synchronously or required complex workaround code.
let buffer = new ArrayBuffer(10); // Fixed size of 10 bytes // To "resize", you had to create a new ArrayBuffer: let newBuffer = new ArrayBuffer(15); new Uint8Array(newBuffer).set(new Uint8Array(buffer));
Atomics.waitAsync allows developers to asynchronously wait for a change in shared memory, simplifying concurrency.
Expanded Example:
let buffer = new ArrayBuffer(10, { maxByteLength: 20 }); console.log(buffer.byteLength); // Initial length: 10 bytes // Resize the buffer buffer.resize(15); console.log(buffer.byteLength); // Resized length: 15 bytes // Transfer the buffer's contents to a new buffer with a different length let newBuffer = buffer.transfer(5); console.log(newBuffer.byteLength); // Transferred length: 5 bytes
Pros:
Cons:
Unicode is a standard for text representation that ensures characters from different languages and scripts can be represented consistently across platforms. Sometimes, Unicode strings can have issues such as unpaired surrogate characters, which can lead to errors or unexpected behavior.
Common Issues:
Ensuring well-formed Unicode strings required custom checks and conversions.
// Matching "a", "c", "d", or "e" required explicit listing: let regex = /[acd]|e/; console.log(regex.test("d")); // true
The new isWellFormed and toWellFormed methods make it easy to check and fix strings.
Expanded Example:
// Using the /v flag for advanced sets let regex = /[a[c-e]]/v; // Matches "a", "c", "d", or "e" console.log(regex.test("d")); // true console.log(regex.test("b")); // false
Pros:
Cons:
|
Description |
Example | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Resizable ArrayBuffer | Allows resizing of ArrayBuffer objects. | buffer.resize(15); | ||||||||||||||||||||||||
Transferable ArrayBuffer | Enables transferring ArrayBuffer without copying data. | let newBuffer = buffer.transfer(5); | ||||||||||||||||||||||||
/v Flag for RegExp | Supports advanced set operations in regex. | /[a[c-e]]/v | ||||||||||||||||||||||||
Promise.withResolvers | Simplifies custom Promise construction. | let { promise, resolve } = Promise.withResolvers(); | ||||||||||||||||||||||||
Object.groupBy and Map.groupBy | Groups data by a callback result. | Object.groupBy(array, item => item[0]); | ||||||||||||||||||||||||
Atomics.waitAsync | Asynchronously waits on shared memory changes. | Atomics.waitAsync(int32, 0, 0).value.then(...); | ||||||||||||||||||||||||
String.isWellFormed and toWellFormed | Checks and fixes Unicode strings for well-formedness. | str.isWellFormed(); str.toWellFormed(); |
The above is the detailed content of Exploring the ECMAScript pdates: A Beginner's Guide. For more information, please follow other related articles on the PHP Chinese website!