1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
---
title: String.fromCodePoint()
slug: Web/JavaScript/Reference/Global_Objects/String/fromCodePoint
translation_of: Web/JavaScript/Reference/Global_Objects/String/fromCodePoint
---
<div>{{JSRef}}</div>
<p><strong><code>String.fromCodePoint()</code> 静态方法返回使用指定的代码点序列创建的字符串。</strong></p>
<div>{{EmbedInteractiveExample("pages/js/string-fromcodepoint.html")}}</div>
<h2 id="语法">语法</h2>
<pre class="syntaxbox"><code>String.fromCodePoint(<var>num1</var>[, ...[, <var>numN</var>]])</code></pre>
<h3 id="参数">参数</h3>
<dl>
<dt><code>num1, ..., num<em>N</em></code></dt>
<dd>一串 Unicode 编码位置,即“代码点”。</dd>
</dl>
<h3 id="返回值">返回值</h3>
<p>使用指定的 Unicode 编码位置创建的字符串。</p>
<h3 id="异常">异常</h3>
<dl>
<dt>{{jsxref("RangeError")}}</dt>
<dd>如果传入无效的 Unicode 编码,将会抛出一个{{jsxref("RangeError")}} (例如: "RangeError: NaN is not a valid code point")。</dd>
</dl>
<h2 id="说明">说明</h2>
<p>该方法返回一个字符串,而不是一个 {{jsxref("String")}} 对象。</p>
<p>因为 <code>fromCodePoint()</code> 是 {{jsxref("String")}} 的一个静态方法,所以只能通过 <code>String.fromCodePoint()</code> 这样的方式来使用,不能在你创建的 {{jsxref("String")}} 对象实例上直接调用。</p>
<h2 id="例子">例子</h2>
<h3 id="使用_fromCodePoint()">使用 <code>fromCodePoint()</code></h3>
<pre class="brush: js">String.fromCodePoint(42); // "*"
String.fromCodePoint(65, 90); // "AZ"
String.fromCodePoint(0x404); // "\u0404"
String.fromCodePoint(0x2F804); // "\uD87E\uDC04"
String.fromCodePoint(194564); // "\uD87E\uDC04"
String.fromCodePoint(0x1D306, 0x61, 0x1D307) // "\uD834\uDF06a\uD834\uDF07"
String.fromCodePoint('_'); // RangeError
String.fromCodePoint(Infinity); // RangeError
String.fromCodePoint(-1); // RangeError
String.fromCodePoint(3.14); // RangeError
String.fromCodePoint(3e-2); // RangeError
String.fromCodePoint(NaN); // RangeError
</pre>
<pre class="brush: js">// String.fromCharCode() 方法不能单独获取在高代码点位上的字符
// 另一方面,下列的示例中,可以返回 4 字节,也可以返回 2 字节的字符
// (也就是说,它可以返回单独的字符,使用长度 2 代替 1!)
console.log(String.fromCodePoint(0x2F804)); // or 194564 in decimal
</pre>
<h2 id="Polyfill">Polyfill</h2>
<p><code>String.fromCodePoint</code> 方法是 ECMAScript2015(ES6)新增加的特性,所以一些老的浏览器可能还不支持。可以通过使用下面的 polyfill 代码来保证浏览器的支持:</p>
<pre class="brush: js">if (!String.fromCodePoint) (function(stringFromCharCode) {
var fromCodePoint = function(_) {
var codeUnits = [], codeLen = 0, result = "";
for (var index=0, len = arguments.length; index !== len; ++index) {
var codePoint = +arguments[index];
// correctly handles all cases including `NaN`, `-Infinity`, `+Infinity`
// The surrounding `!(...)` is required to correctly handle `NaN` cases
// The (codePoint>>>0) === codePoint clause handles decimals and negatives
if (!(codePoint < 0x10FFFF && (codePoint>>>0) === codePoint))
throw RangeError("Invalid code point: " + codePoint);
if (codePoint <= 0xFFFF) { // BMP code point
codeLen = codeUnits.push(codePoint);
} else { // Astral code point; split in surrogate halves
// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
codePoint -= 0x10000;
codeLen = codeUnits.push(
(codePoint >> 10) + 0xD800, // highSurrogate
(codePoint % 0x400) + 0xDC00 // lowSurrogate
);
}
if (codeLen >= 0x3fff) {
result += stringFromCharCode.apply(null, codeUnits);
codeUnits.length = 0;
}
}
return result + stringFromCharCode.apply(null, codeUnits);
};
try { // IE 8 only supports `Object.defineProperty` on DOM elements
Object.defineProperty(String, "fromCodePoint", {
"value": fromCodePoint, "configurable": true, "writable": true
});
} catch(e) {
String.fromCodePoint = fromCodePoint;
}
}(String.fromCharCode));
</pre>
<h2 id="规范">规范</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">规范</th>
<th scope="col">状态</th>
<th scope="col">备注</th>
</tr>
<tr>
<td>{{SpecName('ES2015', '#sec-string.fromcodepoint', 'String.fromCodePoint')}}</td>
<td>{{Spec2('ES2015')}}</td>
<td>Initial definition.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-string.fromcodepoint', 'String.fromCodePoint')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p>{{Compat("javascript.builtins.String.fromCodePoint")}}</p>
<h2 id="参见">参见</h2>
<ul>
<li>{{jsxref("String.fromCharCode()")}}</li>
<li>{{jsxref("String.prototype.charAt()")}}</li>
<li>{{jsxref("String.prototype.codePointAt()")}}</li>
<li>{{jsxref("String.prototype.charCodeAt()")}}</li>
</ul>
|