`toLocaleString()` 返回一个字符串表示数组中的元素。数组中的元素将使用各自的 `toLocaleString` 方法转成字符串，这些字符串将使用一个特定语言环境的字符串（例如一个逗号 ","）隔开。

## 语法

    arr.toLocaleString([locales[,options]]);

### 参数

`locales` 可选
  带有BCP 47语言标记的字符串或字符串数组，关于`locales`参数的形式与解释，请看`Intl`页面。
`options` 可选
  一个可配置属性的对象，对于数字 `Number.prototype.toLocaleString()`，对于日期`Date.prototype.toLocaleString()`.

### 返回值

表示数组元素的字符串。

## 示例

### 使用`locales`和`options`

数组中的元素将会使用各自的 toLocaleString 方法：

- `Object`: `Object.prototype.toLocaleString()`
- `Number`: `Number.prototype.toLocaleString()`
- `Date`: `Date.prototype.toLocaleString()`

总是在`prices`数组中显示字符串和数字的货币符号：

    var prices = ['￥7', 500, 8123, 12];
    prices.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' });

    // "￥7,￥500,￥8,123,￥12"

更多实例请看 `Intl`，`NumberFormat`和`DateTimeFormat`页面。

## Polyfill

    // https://tc39.github.io/ecma402/#sup-array.prototype.tolocalestring
    if (!Array.prototype.toLocaleString) {
      Object.defineProperty(Array.prototype, 'toLocaleString', {
        value: function(locales, options) {
          // 1. Let O be ? ToObject(this value).
          if (this == null) {
            throw new TypeError('"this" is null or not defined');
          }

          var a = Object(this);

          // 2. Let len be ? ToLength(? Get(A, "length")).
          var len = a.length >>> 0;

          // 3. Let separator be the String value for the
          //    list-separator String appropriate for the
          //    host environment's current locale (this is
          //    derived in an implementation-defined way).
          // NOTE: In this case, we will use a comma
          var separator = ',';

          // 4. If len is zero, return the empty String.
          if (len === 0) {
            return '';
          }

          // 5. Let firstElement be ? Get(A, "0").
          var firstElement = a[0];
          // 6. If firstElement is undefined or null, then
          //  a.Let R be the empty String.
          // 7. Else,
          //  a. Let R be ?
          //     ToString(?
          //       Invoke(
          //        firstElement,
          //        "toLocaleString",
          //        « locales, options »
          //       )
          //     )
          var r = firstElement == null ?
            '' : firstElement.toLocaleString(locales, options);

          // 8. Let k be 1.
          var k = 1;

          // 9. Repeat, while k < len
          while (k < len) {
            // a. Let S be a String value produced by
            //   concatenating R and separator.
            var s = r + separator;

            // b. Let nextElement be ? Get(A, ToString(k)).
            var nextElement = a[k];

            // c. If nextElement is undefined or null, then
            //   i. Let R be the empty String.
            // d. Else,
            //   i. Let R be ?
            //     ToString(?
            //       Invoke(
            //        nextElement,
            //        "toLocaleString",
            //        « locales, options »
            //       )
            //     )
            r = nextElement == null ?
              '' : nextElement.toLocaleString(locales, options);

            // e. Let R be a String value produced by
            //   concatenating S and R.
            r = s + r;

            // f. Increase k by 1.
            k++;
          }

          // 10. Return R.
          return r;
        }
      });
    }

如果你需要支持真正不支持`Object.defineProperty`的JavaScript引擎，最好不要对`Array.prototype`方法进行填充，因为你不能使它们不可枚举。

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript Latest Draft (ECMA-262) Array.prototype.toLocaleString | Draft | Initial definition was in ECMAScript 3.
ECMAScript Internationalization API 4.0 (ECMA-402) Array.prototype.toLocaleString | Draft | This definition supersedes the definition provided in ECMA-262.

## 浏览器兼容性

The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`toLocaleString` | Chrome Full support Yes | Edge Full support 12 | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Optional `locales` parameter | Chrome ? | Edge ? | Firefox Full support 52 | IE ? | Opera ? | Safari ? | WebView Android ? | Chrome Android ? | Edge Mobile ? | Firefox Android No support No | Opera Android ? | Safari iOS ? | Samsung Internet Android ? | nodejs ?
Optional `options` parameter | Chrome ? | Edge ? | Firefox Full support 52 | IE ? | Opera ? | Safari ? | WebView Android No support No | Chrome Android ? | Edge Mobile ? | Firefox Android No support No | Opera Android ? | Safari iOS ? | Samsung Internet Android ? | nodejs ?

### Legend

Full support
  Full support
No support
  No support
Compatibility unknown
  Compatibility unknown

## 参见

- `Array.prototype.toString()`
- `Intl`
- `Object.prototype.toLocaleString()`
- `Number.prototype.toLocaleString()`
- `Date.prototype.toLocaleString()`