recursal/MDN huggingface dataset:
DataView.prototype.setBigUint64()
=================================

**`setBigUint64()`** 方法在距 DataView 的起始位置的指定字节偏移处存储一个无符号的 64 位整数（unsigned long long 类型）值。

尝试一下
----

语法
--
```

dataview.setBigUint64(byteOffset, value [, littleEndian])
```

### 参数说明

byteOffset

字节偏移量，为从视图的起始位置到数据存储位置的字节字节偏移量。

value

作为一个 BigInt 类型设置的数值。满足一个无符号的 64 位整数的最大可能数值是 `2n ** 64n - 1n` (`18446744073709551615n`)。当发生溢出时，将会变成 0。

littleEndian

为可选参数，表示这个 64 位整数是否以 little-endian 或者 big-endian 格式存储。如果设置为 false 或者未指定（undefined），将会写入一个 big-endian（大端模式：高位字节排放在内存的低地址端，低位字节排放在内存的高地址端）格式的数值。

### 返回值

`undefined`.

### 抛出的错误

`RangeError`

如果 byteOffset 设置导致存储该数值时超出了视图的末尾位置，将会抛出错误。

示例
--

### 使用 `setBigUint64` 方法


```js
var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.setBigUint64(0, 3n);
dataview.getBigUint64(0); // 3n
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-dataview.prototype.setbiguint64 |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

请参阅
---

* `DataView`
* `ArrayBuffer`
* `BigInt`
DataView.prototype.buffer
=========================

**`buffer`** 属性描述了在构造时被 DataView 引用的 `ArrayBuffer`。

尝试一下
----

语法
--
```

dataview.buffer
```

描述
--

`buffer` 属性是一个访问器 (accessor) 属性，它的 `set` 属性为 `undefined`，这意味着它是只读的。值在 `DataView` 被创建时就确定了，且不能改变。

示例
--

### 使用 `buffer` 属性


```js
var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.buffer; // ArrayBuffer { byteLength: 8 }
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-dataview.prototype.buffer |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `DataView`
* `ArrayBuffer`
DataView.prototype.byteLength
=============================

**`byteLength`** 属性描述了视图从它的 `ArrayBuffer` 开始的字节长度。

尝试一下
----

语法
--
```

dataview.byteLength
```

描述
--

`byteLength` 属性是一个获取 (accessor) 属性，它的 set 属性为 `undefined`，这意味着它是只读的。值在 `DataView` 被创建时就确定了，且不能改变。如果 `DataView` 没有指定偏移量或 `byteLength`，那么被引用的 `ArrayBuffer` 的字节长度将被返回。

Examples
--------

### Using the `byteLength` property


```js
var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.byteLength; // 8 (matches the byteLength of the buffer)

var dataview2 = new DataView(buffer, 1, 5);
dataview2.byteLength; // 5 (as specified when constructing the DataView)

var dataview3 = new DataView(buffer, 2);
dataview3.byteLength; // 6 (due to the offset of the constructed DataView)
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-dataview.prototype.bytelength |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `DataView`
* `ArrayBuffer`
DataView.prototype.getUint32()
==============================

**`getUint32()`** 方法从 `DataView` 相对于起始位置偏移 n 个字节处开始，获取一个 32-bit 数 (无符号长整型，4 个字节)。

尝试一下
----

语法
--
```

dataview.getUint32(byteOffset [, littleEndian])
```

### 参数

byteOffset

偏移量，单位为字节，从头开始计算。

littleEndian

可选 Indicates whether the 32-bit int is stored in little- or big-endian format. If false or undefined, a big-endian value is read.

### 返回

一个无符号长整型 32 位数。

### 抛出错误

`RangeError`

如果 byteOffset 超出了视图能储存的值，就会抛出错误。

描述
--

没有对齐约束; 多字节值可以从任何偏移量获取。

示例
--


```js
var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.getUint32(1); // 0
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-dataview.prototype.getuint32 |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

另见
--

* `DataView`
* `ArrayBuffer`
DataView.prototype.getInt32()
=============================

**`getInt32()`** 方法从 `DataView` 相对于起始位置偏移 n 个字节处开始，获取一个 32-bit 数 (长整型，4 个字节)。

尝试一下
----

语法
--
```

dataview.getInt32(byteOffset [, littleEndian])
```

### 参数

byteOffset

偏移量，单位为字节，从头开始计算。

littleEndian

可选 Indicates whether the 32-bit int is stored in little- or big-endian format. If false or undefined, a big-endian value is read.

### 返回

一个长整型 32 位数。

### 抛出错误

`RangeError`

如果 byteOffset 超出了视图能储存的值，就会抛出错误。

描述
--

没有对齐约束; 多字节值可以从任何偏移量获取。

示例
--


```js
var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.getInt32(1); // 0
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-dataview.prototype.getint32 |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

另见
--

* `DataView`
* `ArrayBuffer`
Map.prototype.get()
===================

`Map` 实例的 **`get()`** 方法返回该 map 中的指定元素。如果与所提供的键相关联的值是一个对象，那么你将获得该对象的引用，对该对象所做的任何更改都会有效地在 `Map` 对象中修改它。

尝试一下
----

语法
--


```js
get(key)
```

### 参数

`key`

从 `Map` 对象返回的元素的键。

### 返回值

与指定键相关联的元素，如果键在 `Map` 对象中找不到，则返回 `undefined`。

示例
--

### 使用 get()


```js
const myMap = new Map();
myMap.set("bar", "foo");

console.log(myMap.get("bar")); // 返回 "foo"
console.log(myMap.get("baz")); // 返回 undefined
```

### 使用 get() 获取对对象的引用


```js
const arr = [];
const myMap = new Map();
myMap.set("bar", arr);

myMap.get("bar").push("foo");

console.log(arr); // ["foo"]
console.log(myMap.get("bar")); // ["foo"]
```


注意，持有原始对象引用的映射实际上意味着对象不能被垃圾回收，这可能会导致意外的内存问题。如果你希望存储在 map 中的对象具有与原始对象相同的生命周期，请考虑使用 `WeakMap`。

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.get |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
* `Map.prototype.set()`
* `Map.prototype.has()`
Map.prototype.has()
===================

`Map` 实例的 **`has()`** 方法返回一个布尔值，指示具有指定键的元素是否存在。

尝试一下
----

语法
--


```js
has(key)
```

### 参数

`key`

用于测试 `Map` 对象中是否存在的元素的键。

### 返回值

如果 `Map` 对象中存在具有指定键的元素，则返回 `true`；否则返回 `false`。

示例
--

### 使用 has()


```js
const myMap = new Map();
myMap.set("bar", "foo");

console.log(myMap.has("bar")); // true
console.log(myMap.has("baz")); // false
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.has |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
* `Map.prototype.set()`
* `Map.prototype.get()`
Map.prototype.clear()
=====================

`Map` 实例的 **`clear()`** 方法会移除该 map 中的所有元素。

尝试一下
----

语法
--


```js
clear()
```

### 参数

无。

### 返回值

无（`undefined`）。

示例
--

### 使用 clear()


```js
const myMap = new Map();
myMap.set("bar", "baz");
myMap.set(1, "foo");

console.log(myMap.size); // 2
console.log(myMap.has("bar")); // true

myMap.clear();

console.log(myMap.size); // 0
console.log(myMap.has("bar")); // false
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.clear |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
Map.prototype[@@iterator]()
===========================

`Map` 实例的 **`[@@iterator]()`** 方法实现了可迭代协议以允许 `Map` 对象被大多数语法所接受，例如展开语法和 `for...of` 循环。它返回一个 map 迭代器对象，此对象会以插入顺序生成 map 的键值对。

该属性的初始值与 `Map.prototype.entries` 属性的初始值是同一个函数对象。

尝试一下
----

语法
--


```js
map[Symbol.iterator]()
```

### 参数

无。

### 返回值

与 `Map.prototype.entries()` 返回值相同：一个新的迭代器对象，它会以插入顺序生成 map 的键值对。

示例
--

### 使用 for...of 循环进行迭代

请注意，通常你不需要直接调用此方法。`@@iterator` 方法的存在使得 `Map` 对象可迭代，而像 `for...of` 循环这样的迭代语法会自动调用此方法以获取用于循环的迭代器。


```js
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap) {
  console.log(entry);
}
// ["0", "foo"]
// [1, "bar"]
// [{}, "baz"]

for (const [key, value] of myMap) {
  console.log(`${key}: ${value}`);
}
// 0: foo
// 1: bar
// [Object]: baz
```

### 手动控制迭代器

你仍然可以手动调用返回的迭代器对象的 `next()` 方法来获得最大程度的控制权。


```js
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap[Symbol.iterator]();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype-@@iterator |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
* `Map.prototype.entries()`
* `Map.prototype.keys()`
* `Map.prototype.values()`
* `Symbol.iterator`
* 迭代协议
Map.prototype.keys()
====================

`Map` 实例的 **`keys()`** 方法返回一个新的 *map 迭代器*对象，该对象包含了此 map 中每个元素的键，按插入顺序排列。

尝试一下
----

语法
--


```js
keys()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 keys()


```js
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap.keys();

console.log(mapIter.next().value); // "0"
console.log(mapIter.next().value); // 1
console.log(mapIter.next().value); // {}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.keys |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map.prototype.entries()`
* `Map.prototype.values()`
Map.prototype.size
==================

`Map` 实例的 **`size`** 访问器属性返回此 map 中元素的数量。

尝试一下
----

描述
--

`size` 的值是一个整数，表示 `Map` 对象有多少个键值对。`size` 的设置访问器函数是 `undefined`；你无法更改此属性的值。

示例
--

### 使用 size


```js
const myMap = new Map();
myMap.set("a", "alpha");
myMap.set("b", "beta");
myMap.set("g", "gamma");

console.log(myMap.size); // 3
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-map.prototype.size |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
Map.prototype.entries()
=======================

`Map` 实例的 **`entries()`** 方法返回一个新的 *map 迭代器*对象，该对象包含了此 map 中的每个元素的 `[key, value]` 对，按插入顺序排列。

尝试一下
----

语法
--


```js
entries()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 entries()


```js
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.entries |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map.prototype.keys()`
* `Map.prototype.values()`
Map.prototype.values()
======================

`Map` 实例的 **`values()`** 方法返回一个新的 *map 迭代器*对象，该对象包含此 map 中每个元素的值，按插入顺序排列。

尝试一下
----

语法
--


```js
values()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 values()


```js
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap.values();

console.log(mapIter.next().value); // "foo"
console.log(mapIter.next().value); // "bar"
console.log(mapIter.next().value); // "baz"
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.values |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map.prototype.entries()`
* `Map.prototype.keys()`
Map.prototype.forEach()
=======================

`Map` 实例的 **`forEach()`** 方法按插入顺序对该 map 中的每个键/值对执行一次提供的函数。

尝试一下
----

语法
--


```js
forEach(callbackFn)
forEach(callbackFn, thisArg)
```

### 参数

`callbackFn`

为 map 中每个元素执行的函数。使用以下参数调用该函数：

`value`

每个迭代的值。

`key`

每个迭代的键。

`map`

正在迭代的 map。


`thisArg` 可选

执行 `callbackFn` 时用作 `this` 的值。

### 返回值

无，`undefined`。

描述
--

`forEach` 方法会对 map 中每个真实存在的键执行一次提供的 `callback`。它不会为被删除的键执行函数。然而，它会为存在但值为 `undefined` 的值执行函数。

`callbackFn` 接收**三个参数**：

* 当前的 `value`
* 当前的 `key`
* 正在被遍历的 **`Map` 对象**

如果向 `forEach` 提供了 `thisArg` 参数，那么每次 `callback` 被调用时，其都会被传入以用作 `this` 的值。否则，`undefined` 将会被传入以用作 `this` 的值。最终 `callback` 可观察到的 `this` 值将会根据确定函数所观察到 `this` 的常用规则来确定。

每个值只被访问一次，除非它在 `forEach` 结束前被删除并被重新添加。对于被访问前就删除的值，`callback` 不会为其调用。在 `forEach` 结束前被新添加的值都将会被访问。

示例
--

### 输出一个 Map 对象中的内容

以下的代码在每行中打印一个 `Map` 对象中的元素：


```js
function logMapElements(value, key, map) {
  console.log(`map.get('${key}') = ${value}`);
}
new Map([
  ["foo", 3],
  ["bar", {}],
  ["baz", undefined],
]).forEach(logMapElements);
// 打印：
// "map.get('foo') = 3"
// "map.get('bar') = [object Object]"
// "map.get('baz') = undefined"
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.foreach |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Array.prototype.forEach()`
* `Set.prototype.forEach()`
Map.groupBy()
=============

Limited availability
--------------------

This feature is not Baseline because it does not work in some of the most widely-used browsers.

* Learn more
* See full compatibility
* Report feedback

**备注：** 在某些浏览器的某些版本中，此方法被实现为 `Array.prototype.groupToMap()` 方法。由于 web 兼容性问题，它现在以静态方法实现。参见浏览器兼容性表格以获取更多信息。

**`Map.groupBy()`** 静态方法使用提供的回调函数返回的值对给定可迭代对象中的元素进行分组。最终返回的 `Map` 使用测试函数返回的唯一值作为键，可用于获取每个组中的元素组成的数组。

该方法主要用于对与对象相关的元素进行分组，特别是当该对象可能随时间而变化时。如果对象不变，你可以使用字符串表示它，并使用 `Object.groupBy()` 分组元素。

尝试一下
----

语法
--


```js
Map.groupBy(items, callbackFn)
```

### 参数

`items`

一个将进行元素分组的可迭代对象（例如 `Array`）。

`callbackFn`

对可迭代对象中的每个元素执行的函数。它应该返回一个值（对象或原始类型）来表示当前元素的分组。该函数被调用时将传入以下参数：

`element`

数组中当前正在处理的元素。

`index`

正在处理的元素在数组中的索引。


### 返回值

一个包含了每一个组的键的 `Map` 对象，每个键都分配了一个包含关联组元素的数组。

描述
--

`Map.groupBy()` 为可迭代对象中的每个元素调用一次提供的 `callbackFn` 函数。该回调函数应返回一个值，用以表示相关元素的分组。`callbackFn` 返回的值会被用作 `Map.groupBy()` 返回的 `Map` 的键。每个键都有一个相关联的数组，其中包含回调函数返回相同值的所有元素。

返回的 `Map` 中的元素和原始可迭代对象中的元素相同（不是深拷贝）。更改元素的内部结构将反映在原始可迭代对象和返回的 `Map` 中。

当你需要分组与特定对象相关的信息时，此方法非常有用。因为即使对象被修改，它仍将作为返回的 `Map` 的键继续工作。如果你改为为对象创建字符串表示形式，并在 `Object.groupBy()` 中将其用作分组键，则必须在对象改变时维护原始对象和其表示之间的映射。

**备注：** 要访问返回的 `Map` 中的分组，必须使用最初用作 `Map` 键的相同对象（尽管你可以修改其属性）。你不能使用另一个恰好具有相同名称和属性的对象。

`Map.groupBy` 不会读取 `this` 值。它可以在任何对象上调用，并返回一个新的 `Map` 实例。

示例
--

### 使用 Map.groupBy()

首先，我们定义一个包含代表各种食品库存的对象的数组。每种食品都有一个 `type` 和一个 `quantity` 属性。


```js
const inventory = [
  { name: "芦笋", type: "蔬菜", quantity: 9 },
  { name: "香蕉", type: "水果", quantity: 5 },
  { name: "山羊", type: "肉", quantity: 23 },
  { name: "樱桃", type: "水果", quantity: 12 },
  { name: "鱼", type: "肉", quantity: 22 },
];
```


下面的代码使用箭头函数（函数返回名为 `restock` 或 `sufficient` 的对象键，具体取决于元素是否满足 `quantity < 6`）来调用 `Map.groupBy()`。返回的 `result` 对象是一个 `Map`，因此我们需要使用键调用 `get()` 来获取数组。


```js
const restock = { restock: true };
const sufficient = { restock: false };
const result = Map.groupBy(inventory, ({ quantity }) =>
  quantity < 6 ? restock : sufficient,
);
console.log(result.get(restock));
// [{ name: "香蕉", type: "水果", quantity: 5 }]
```


请注意，函数参数 `{ quantity }` 是函数参数的对象解构语法的一个基本示例。这会解构作为参数传递的对象的 `quantity` 属性，并将其赋值给函数体中名为 `quantity` 的变量。这是一种非常简洁的访问函数中相关元素的值的方式。

`Map` 的键在修改后仍可以使用。但是，你不能重新创建键并仍然使用它。因此，任何需要使用映射的内容都保留对其键的引用是非常重要的。


```js
// 键被修改后仍可以使用
restock["fast"] = true;
console.log(result.get(restock));
// [{ name: "香蕉", type: "水果", quantity: 5 }]

// 不能使用新的键，即使它具有相同的结构！
const restock2 = { restock: true };
console.log(result.get(restock2)); // undefined
```

规范
--

| Specification |
| --- |
| Array Grouping # sec-map.groupby |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `core-js` 中 `Map.groupBy` 的 polyfill
* 索引集合类
* `Array.prototype.reduce()`
* `Map()`
* `Object.groupBy()`
Map.prototype.delete()
======================

`Map` 实例的 **`delete()`** 方法从该 map 中删除指定键的元素。

尝试一下
----

语法
--


```js
mapInstance.delete(key)
```

### 参数

`key`

要从 `Map` 对象中删除的元素的键。

### 返回值

如果 `Map` 对象中的元素存在并已被移除，则为 `true`；如果该元素不存在，则为 `false`。

示例
--

### 使用 delete()


```js
const myMap = new Map();
myMap.set("bar", "foo");

console.log(myMap.delete("bar")); // 返回 true。成功地移除元素
console.log(myMap.has("bar")); // 返回 false。"bar" 元素将不再存在于 Map 实例中
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.delete |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
Map.prototype.set()
===================

`Map` 实例的 **`set()`** 方法会向 `Map` 对象添加或更新一个指定的键值对。

尝试一下
----

语法
--


```js
set(key, value)
```

### 参数

`key`

要添加到 `Map` 对象的元素的键。该值可以是任何 JavaScript 类型（任何原始值或任何类型的 JavaScript 对象）。

`value`

要添加到 `Map` 对象的元素的值。该值可以是任何 JavaScript 类型（任何原始值或任何类型的 JavaScript 对象）。

### 返回值

`Map` 对象。

示例
--

### 使用 set()


```js
const myMap = new Map();

// 将一个新元素添加到 Map 对象
myMap.set("bar", "foo");
myMap.set(1, "foobar");

// 在 Map 对象中更新某个元素的值
myMap.set("bar", "baz");
```

### 链式使用 set()

因为 `set()` 方法返回 `Map` 对象本身，所以你可以像下面这样链式调用它：


```js
// 链式添加元素
myMap.set("bar", "foo").set(1, "foobar").set(2, "baz");
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map.prototype.set |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
* `Map.prototype.get()`
* `Map.prototype.has()`
Map() 构造函数
==========

**`Map()`** 构造函数创建 `Map` 对象。

语法
--


```js
new Map()
new Map(iterable)
```


**备注：** `Map()` 只能用 `new` 构造。尝试不使用 `new` 调用它会抛出 `TypeError`。

### 参数

`iterable` 可选

一个元素是键值对的数组或其他可迭代对象。（例如，包含两个元素的数组，如 `[[ 1, 'one' ],[ 2, 'two' ]]`。）每个键值对都被添加到新的 `Map` 中。

示例
--

### 创建一个新的 Map


```js
const myMap = new Map([
  [1, "one"],
  [2, "two"],
  [3, "three"],
]);
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-map-constructor |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `core-js` 中 `Map` 的 polyfill
* `Set`
* `WeakMap`
* `WeakSet`
get Map[@@species]
==================

**`Map[@@species]`** 静态访问器属性是一个未使用的访问器属性，指定了如何复制 `Map` 对象。

语法
--


```js
Map[Symbol.species]
```

### 返回值

调用 `get @@species` 的构造函数的值（`this`）。返回值用于构造复制的 `Map` 实例。

描述
--

`@@species` 访问器属性返回 `Map` 对象的默认构造函数。子类构造函数可以覆盖它以更改构造函数赋值。

**备注：** 目前所有 `Map` 方法均未使用此属性。

示例
--

### 普通对象的 species

`@@species` 属性返回默认构造函数，即 `Map` 的构造函数。


```js
Map[Symbol.species]; // 函数 Map()
```

### 派生对象的 species

在一个自定义的 `Map` 子类（如 `MyMap`）的实例中，`MyMap` 的 `species` 是 `MyMap` 构造函数。但是，你可能希望覆盖它，以便在派生类方法中返回父 `Map` 对象：


```js
class MyMap extends Map {
  // 用父类 Map 构造函数覆盖 MyMap 的 species
  static get [Symbol.species]() {
    return Map;
  }
}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-map-@@species |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Map`
* `Symbol.species`
Intl.PluralRules
================

**`Intl.PluralRules`** 对象是用于复数敏感的格式化和复数相关的语言规则。

构造函数
----

`Intl.PluralRules()` (en-US)

创建一个新的 `Intl.PluralRules` 对象。

静态方法
----

`Intl.PluralRules.supportedLocalesOf()` (en-US)

返回一个数组，其中包含提供的区域（locale）中被运行时所支持的，而不必回退到运行时的默认区域。

实例方法
----

`Intl.PluralRules.prototype.resolvedOptions()` (en-US)

返回一个新的对象，其属性反映了在对象初始化期间计算所得的区域和一系列选项。

`Intl.PluralRules.prototype.select()` (en-US)

返回一个字符串，指示用于区域敏感的格式化的复数类别。

`Intl.PluralRules.prototype.selectRange()` (en-US)

此方法接收两个值并返回一个字符串，指示用于区域敏感的格式化的复数类别。

示例
--

### 使用 locales

此示例显示本地化复数类别的一些值。为了获得应用程序用户界面中使用的语言格式，请确保使用 `locales` 参数指定了语言（可能还有一些回退语言）：


```js
// 阿拉伯语有不同的复数类别

new Intl.PluralRules("ar-EG").select(0);
// → 'zero'
new Intl.PluralRules("ar-EG").select(1);
// → 'one'
new Intl.PluralRules("ar-EG").select(2);
// → 'two'
new Intl.PluralRules("ar-EG").select(6);
// → 'few'
new Intl.PluralRules("ar-EG").select(18);
// → 'many'
```

规范
--

| Specification |
| --- |
| ECMAScript Internationalization API Specification # pluralrules-objects |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Intl`
* FormatJS 中 `Intl.PluralRules` 的 polyfill
Intl.Collator
=============

**`Intl.Collator`** 对象用于语言敏感的字符串比较。

尝试一下
----

构造函数
----

`Intl.Collator()`

创建一个新的 `Collator` 对象。

静态方法
----

`Intl.Collator.supportedLocalesOf()` (en-US)

返回一个数字，其中包含提供的区域（locale）中被运行时所支持的，而不必回退到运行时的默认区域。

实例方法
----

`Intl.Collator.prototype.compare` (en-US)

getter 函数，根据 `Intl.Collator` 对象的排序顺序来比较两个字符串。

`Intl.Collator.prototype.resolvedOptions()` (en-US)

返回一个新对象，其属性反映了在对象初始化期间计算所得的区域和一系列选项。

示例
--

### 使用 Collator

以下示例演示了一个字符串在另一个字符串之前、之后或与另一个字符串处于同一级别时可能出现的不同结果：


```js
console.log(new Intl.Collator().compare("a", "c")); // -1，或一些其他的负值
console.log(new Intl.Collator().compare("c", "a")); // 1，或一些其他的正值
console.log(new Intl.Collator().compare("a", "a")); // 0
```


请注意，上面代码中显示的结果可能因浏览器和浏览器版本而异。这是因为这些值是特定于实现的。即，规范仅要求在比较的字符串之前和之后分别对应负值和正值。

### 使用 locales

`Collator.prototype.compare()` (en-US) 提供的结果在不同语言之间有所不同。为了获得用于你的应用程序的用户界面的语言格式，请确保使用 `locales` 参数指定了语言（可能还有一些回退语言）：


```js
// 德语中，ä 使用 a 的排序
console.log(new Intl.Collator("de").compare("ä", "z"));
// -1，或一些其他的负值

// 在瑞典语中，ä 排在 z 之后
console.log(new Intl.Collator("sv").compare("ä", "z"));
// 1，或一些其他的正值
```

### 使用 options

`Collator.prototype.compare()` (en-US) 提供的结果可以使用 options 参数自定义：


```js
// 德语中，ä 使用 a 作为基本字母
console.log(new Intl.Collator("de", { sensitivity: "base" }).compare("ä", "a"));
// 0

// 瑞典语中，ä 和 a 是单独的基本字母
console.log(new Intl.Collator("sv", { sensitivity: "base" }).compare("ä", "a"));
// 1，或一些其他的正值
```

规范
--

| Specification |
| --- |
| ECMAScript Internationalization API Specification # collator-objects |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Intl`
Intl.Locale
===========

**`Intl.Locale`** 对象是 Intl 对象的标准内置属性，用于表示 Unicode 区域标识。

尝试一下
----

描述
--

**`Intl.Locale`** 对象是为了更便捷地处理 Unicode 区域设置。Unicode 使用字符串作为区域识别标识。区域标识符由*语言标识符*和*扩展标记*组成。语言标识符是区域 (locale) 的核心，包含了语言、脚本和地域子标记 (region subtags)。有关区域设置的其他信息体现在可选的扩展标记中。扩展标记保存有关区域设置方面的信息，例如日历类型、时钟类型和编号系统类型。

传统上，Intl 接口像 Unicode 一样使用字符串来表示区域设置，这是一个简单而轻量且效果好的解决方案。但是，添加一个 Locale 类可以更容易地解析和操作语言、脚本、区域以及扩展标记。

构造函数
----

`Intl.Locale()` (en-US)

实例化一个 `Locale` 对象。

实例属性
----

`Intl.Locale.prototype.baseName` (en-US)

Returns basic, core information about the `Locale` in the form of a substring of the complete data string.

`Intl.Locale.prototype.calendar` (en-US)

Returns the part of the `Locale` that indicates the Locale's calendar era.

`Intl.Locale.prototype.caseFirst` (en-US)

Returns whether case is taken into account for the locale's collation rules.

`Intl.Locale.prototype.collation` (en-US)

Returns the collation type for the `Locale`, which is used to order strings according to the locale's rules.

`Intl.Locale.prototype.hourCycle` (en-US)

Returns the time keeping format convention used by the locale.

`Intl.Locale.prototype.language` (en-US)

Returns the language associated with the locale.

`Intl.Locale.prototype.numberingSystem` (en-US)

Returns the numeral system used by the locale.

`Intl.Locale.prototype.numeric` (en-US)

Returns whether the locale has special collation handling for numeric characters.

`Intl.Locale.prototype.region` (en-US)

Returns the region of the world (usually a country) associated with the locale.

`Intl.Locale.prototype.script` (en-US)

Returns the script used for writing the particular language used in the locale.

实例方法
----

`Intl.Locale.prototype.maximize()` (en-US)

Gets the most likely values for the language, script, and region of the locale based on existing values.

`Intl.Locale.prototype.minimize()` (en-US)

Gets the most likely values for the language, script, and region of the locale based on existing values.

`Intl.Locale.prototype.toString()` (en-US)

Returns the Locale's full locale identifier string.

范例
--

### 基本使用

很简单，就是需要给`Intl.Locale` (en-US) 构造函数传入一个 locale 标识字符串作为参数：


```js
let us = new Intl.Locale("zh-Hans-CN");
```

### 使用配置实例化

构造函数支持传入 object 作为配置，object 中可包含多个配置属性。例如，设置 `hourCycle` (en-US) 属性，用于设置你所需要的小时周期类型：


```js
let zh12hour = new Intl.Locale("zh-Hans-CN", { hourCycle: "h12" });
console.log(zh12hour.hourCycle); // Prints "h12"
```

规范
--

| Specification |
| --- |
| ECMAScript Internationalization API Specification # locale-objects |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参阅
--

* The Intl.Locale Polyfill