diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:42:52 -0500 |
commit | 074785cea106179cb3305637055ab0a009ca74f2 (patch) | |
tree | e6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/web/javascript/reference/global_objects/string/charat | |
parent | da78a9e329e272dedb2400b79a3bdeebff387d47 (diff) | |
download | translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2 translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip |
initial commit
Diffstat (limited to 'files/ru/web/javascript/reference/global_objects/string/charat')
-rw-r--r-- | files/ru/web/javascript/reference/global_objects/string/charat/index.html | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/files/ru/web/javascript/reference/global_objects/string/charat/index.html b/files/ru/web/javascript/reference/global_objects/string/charat/index.html new file mode 100644 index 0000000000..c86dae26aa --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/string/charat/index.html @@ -0,0 +1,270 @@ +--- +title: String.prototype.charAt() +slug: Web/JavaScript/Reference/Global_Objects/String/charAt +tags: + - JavaScript + - Method + - Prototype + - Reference + - String +translation_of: Web/JavaScript/Reference/Global_Objects/String/charAt +--- +<div>{{JSRef("Global_Objects", "String")}}</div> + +<h2 id="Summary" name="Summary">Сводка</h2> +<p>Метод <strong><code>charAt()</code></strong> возвращает указанный символ из строки.</p> + +<h2 id="Syntax" name="Syntax">Синтаксис</h2> +<pre class="syntaxbox"><code><var>str</var>.charAt(<var>index</var>)</code></pre> + +<h3 id="Parameters" name="Parameters">Параметры</h3> +<dl> + <dt><code>index</code></dt> + <dd>Целое число от 0 до длины строки минус 1.</dd> +</dl> + +<h2 id="Description" name="Description">Описание</h2> +<p>Символы в строке идут слева направо. Индекс первого символа равен 0, а последнего символа в строке <code>stringName</code> равен <code>stringName.length - 1</code>. Если предоставленный вами параметр <code>index</code> выходит за пределы этого диапазона, JavaScript вернёт пустую строку.</p> + +<h2 id="Examples" name="Examples">Примеры</h2> + +<h3 id="Example:_Displaying_characters_at_different_locations_in_a_string" name="Example:_Displaying_characters_at_different_locations_in_a_string">Пример: отображение символов из различных позиций строки</h3> +<p>Следующий пример показывает символы в различных позициях в строке <code>"Дивный новый мир"</code>:</p> +<pre class="brush: js">var anyString = 'Дивный новый мир'; + +console.log("Символ по индексу 0 равен '" + anyString.charAt(0) + "'"); +console.log("Символ по индексу 1 равен '" + anyString.charAt(1) + "'"); +console.log("Символ по индексу 2 равен '" + anyString.charAt(2) + "'"); +console.log("Символ по индексу 3 равен '" + anyString.charAt(3) + "'"); +console.log("Символ по индексу 4 равен '" + anyString.charAt(4) + "'"); +console.log("Символ по индексу 5 равен '" + anyString.charAt(5) + "'"); +console.log("Символ по индексу 999 равен '" + anyString.charAt(999) + "'"); +</pre> +<p>Этот код отобразит следующее:</p> +<pre class="brush: js">Символ по индексу 0 равен 'Д' +Символ по индексу 1 равен 'и' +Символ по индексу 2 равен 'в' +Символ по индексу 3 равен 'н' +Символ по индексу 4 равен 'ы' +Символ по индексу 5 равен 'й' +Символ по индексу 999 равен '' +</pre> + +<h3 id="Example:_Getting_whole_characters" name="Example:_Getting_whole_characters">Пример: получение целых символов</h3> +<p>Следующий пример показывает, как обойти строку в цикле, каждый раз гарантированно получая целый символ, даже если строка содержит символы, не помещающиеся на Базовую многоязыковую плоскость (БМП).</p> +<pre class="brush: js">var str = 'A \uD87E\uDC04 Z'; // Также можно использовать не-БМП символы напрямую +for (var i = 0, chr; i < str.length; i++) { + if ((chr = getWholeChar(str, i)) === false) { + continue; + } + // Поместите эти строки в самое начало каждого цикла, передавая в функцию строку + // и текущую итерацию; возвращаемая переменная будут представлять + // отдельный символ + + console.log(chr); +} + +function getWholeChar(str, i) { + var code = str.charCodeAt(i); + + if (isNaN(code)) { + return ''; // Позиция не найдена + } + if (code < 0xD800 || code > 0xDFFF) { + return str.charAt(i); + } + + // Старшая часть суррогатной пары (последнее число можно изменить на 0xDB7F, + // чтобы трактовать старшую часть суррогатной пары в частной плоскости как + // одиночный символ) + if (0xD800 <= code && code <= 0xDBFF) { + if (str.length <= (i + 1)) { + throw 'Старшая часть суррогатной пары без следующей младшей'; + } + var next = str.charCodeAt(i + 1); + if (0xDC00 > next || next > 0xDFFF) { + throw 'Старшая часть суррогатной пары без следующей младшей'; + } + return str.charAt(i) + str.charAt(i + 1); + } + // Младшая часть суррогатной пары (0xDC00 <= code && code <= 0xDFFF) + if (i === 0) { + throw 'Младшая часть суррогатной пары без предшествующей старшей'; + } + var prev = str.charCodeAt(i - 1); + + // (последнее число можно изменить на 0xDB7F, чтобы трактовать старшую + // часть суррогатной пары в частной плоскости как одиночный символ) + if (0xD800 > prev || prev > 0xDBFF) { + throw 'Младшая часть суррогатной пары без предшествующей старшей'; + } + // Теперь мы можем пропустить младшую часть суррогатной пары, + // которую мы уже обработали + return false; +} +</pre> +<p>В среде, поддерживающей JavaScript 1.7+ (например, в Firefox), который позволяет деструктуризующее присваивание, можно использовать более лаконичную и более гибкую альтернативу в том смысле, что она автоматически увеличивает счётчик (если символ гарантированно является суррогатной парой).</p> +<pre class="brush: js">var str = 'A\uD87E\uDC04Z'; // Также можно использовать не-БМП символы напрямую +for (var i = 0, chr; i < str.length; i++) { + [chr, i] = getWholeCharAndI(str, i); + // Поместите эту строку в самое начало каждого цикла, передавая в функцию строку + // и текущую итерацию; возвращаемый массив будет содержать отдельный символ и + // новое значение счётчика цикла 'i' (изменится только при встрече суррогатной пары) + + console.log(chr); +} + +function getWholeCharAndI(str, i) { + var code = str.charCodeAt(i); + + if (isNaN(code)) { + return ''; // Позиция не найдена + } + if (code < 0xD800 || code > 0xDFFF) { + return [str.charAt(i), i]; // Обычный символ, оставляем переменную 'i' неизменной + } + + // Старшая часть суррогатной пары (последнее число можно изменить на 0xDB7F, + // чтобы трактовать старшую часть суррогатной пары в частной плоскости как + // одиночный символ) + if (0xD800 <= code && code <= 0xDBFF) { + if (str.length <= (i + 1)) { + throw 'Старшая часть суррогатной пары без следующей младшей'; + } + var next = str.charCodeAt(i + 1); + if (0xDC00 > next || next > 0xDFFF) { + throw 'Старшая часть суррогатной пары без следующей младшей'; + } + return [str.charAt(i) + str.charAt(i + 1), i + 1]; + } + // Младшая часть суррогатной пары (0xDC00 <= code && code <= 0xDFFF) + if (i === 0) { + throw 'Младшая часть суррогатной пары без предшествующей старшей'; + } + var prev = str.charCodeAt(i - 1); + + // (последнее число можно изменить на 0xDB7F, чтобы трактовать старшую + // часть суррогатной пары в частной плоскости как одиночный символ) + if (0xD800 > prev || prev > 0xDBFF) { + throw 'Младшая часть суррогатной пары без предшествующей старшей'; + } + // Возвращаем следующий символ (и увеличиваем счётчик) + return [str.charAt(i + 1), i + 1]; +} +</pre> + +<h3 id="Example:_Fixing_charAt_to_support_non-Basic-Multilingual-Plane_(BMP)_characters" name="Example:_Fixing_charAt_to_support_non-Basic-Multilingual-Plane_(BMP)_characters">Пример: добавление к методу <code>charAt()</code> поддержки символов не в Базовой многоязыковой плоскости (БМП)</h3> +<p>В то время как пример выше может быть более полезен тем, кто хочет поддерживать символы не в плоскости БМП (поскольку он не требует от вызывающей стороны знания о том, где может встретиться символ из не-БМП), в случае, если кто-то желает <em>выбирать</em> символы по индексу и трактовать суррогатную пару внутри строки как один символ, он может использовать следующий код:</p> +<pre class="brush: js">function fixedCharAt(str, idx) { + var ret = ''; + str += ''; + var end = str.length; + + var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + while ((surrogatePairs.exec(str)) != null) { + var li = surrogatePairs.lastIndex; + if (li - 2 < idx) { + idx++; + } else { + break; + } + } + + if (idx >= end || idx < 0) { + return ''; + } + + ret += str.charAt(idx); + + if (/[\uD800-\uDBFF]/.test(ret) && /[\uDC00-\uDFFF]/.test(str.charAt(idx + 1))) { + // Перешагиваем через один, поскольку один «символ» является частью суррогатной пары + ret += str.charAt(idx + 1); + } + return ret; +} +</pre> + +<h2 id="Specifications" name="Specifications">Спецификации</h2> +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Спецификация</th> + <th scope="col">Статус</th> + <th scope="col">Комментарии</th> + </tr> + <tr> + <td>ECMAScript 1-е издание.</td> + <td>Стандарт</td> + <td>Изначальное определение.</td> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-15.5.4.4', 'String.prototype.charAt')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td> </td> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-string.prototype.charat', 'String.prototype.charAt')}}</td> + <td>{{Spec2('ES6')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2> +<div>{{CompatibilityTable}}</div> +<div id="compat-desktop"> + <table class="compat-table"> + <tbody> + <tr> + <th>Возможность</th> + <th>Chrome</th> + <th>Firefox (Gecko)</th> + <th>Internet Explorer</th> + <th>Opera</th> + <th>Safari</th> + </tr> + <tr> + <td>Базовая поддержка</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + </tr> + </tbody> + </table> +</div> +<div id="compat-mobile"> + <table class="compat-table"> + <tbody> + <tr> + <th>Возможность</th> + <th>Android</th> + <th>Chrome для Android</th> + <th>Firefox Mobile (Gecko)</th> + <th>IE Mobile</th> + <th>Opera Mobile</th> + <th>Safari Mobile</th> + </tr> + <tr> + <td>Базовая поддержка</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + <td>{{CompatVersionUnknown}}</td> + </tr> + </tbody> + </table> +</div> + +<h2 id="See_also" name="See_also">Смотрите также</h2> +<ul> + <li>{{jsxref("String.prototype.indexOf()")}}</li> + <li>{{jsxref("String.prototype.lastIndexOf()")}}</li> + <li>{{jsxref("String.prototype.charCodeAt()")}}</li> + <li>{{jsxref("String.prototype.codePointAt()")}}</li> + <li>{{jsxref("String.prototype.split()")}}</li> + <li>{{jsxref("String.fromCodePoint()")}}</li> +</ul> |