Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web/JavaScript/Reference/Global_Objects/String/codePointAt 他5件を更新 #23967

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
title: String.prototype.codePointAt()
slug: Web/JavaScript/Reference/Global_Objects/String/codePointAt
l10n:
sourceCommit: a49d60648404407784b04ff5ff7e16a6a8d1ac25
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

**`codePointAt()`** は {{jsxref("String")}} のメソッドで、指定されたインデックスから始まる文字の Unicode コードポイント値である非負の整数を返します。インデックスは Unicode コードポイントではなく、UTF-16 コード単位に基づくことに注意してください。

{{EmbedInteractiveExample("pages/js/string-codepointat.html","shorter")}}
{{EmbedInteractiveExample("pages/js/string-codepointat.html", "shorter")}}

## 構文

Expand All @@ -27,8 +27,8 @@ codePointAt(index)
指定された位置 `index` にある文字のコードポイント値を表す非負の整数値です。

- `index` が `0` – `str.length - 1` の範囲外であれば、`codePointAt()` は {{jsxref("undefined")}} を返します。
- `index` の位置の要素が UTF-16 高サロゲートであった場合、そのコードポイントのサロゲートペアを返します。
- `index` の位置の要素が UTF-16 低サロゲートであった場合、低サロゲートコードポイントのみを返します
- `index` の位置の要素が UTF-16 上位サロゲートであった場合、そのコードポイントのサロゲートペアを返します。
- `index` の位置の要素が UTF-16 下位サロゲートであった場合、下位サロゲートコード単位のみを返します

## 解説

Expand Down Expand Up @@ -57,7 +57,7 @@ Unicode のコードポイントは `0` から `1114111` (`0x10FFFF`) までの

### codePointAt() の繰り返し

要素が UTF-16 の低サロゲートである `index` へのインデックス付けは、低サロゲートのみを返すので、文字列のインデックスをループに使わない方がよいでしょう
文字列インデックスを使用してループ処理を行うと、同じコードポイントが 2 回参照されることになります(1 回目は上位サロゲート、2 回目は下位サロゲート)。また、2 回目に `codePointAt()` が返すのは下位サロゲートのみです。そのため、インデックスによるループ処理は避けた方が良いでしょう

```js example-bad
const str = "\ud83d\udc0e\ud83d\udc71\u2764";
Expand All @@ -68,7 +68,7 @@ for (let i = 0; i < str.length; i++) {
// '1f40e', 'dc0e', '1f471', 'dc71', '2764'
```

代わりに、[`for...of`](/ja/docs/Web/JavaScript/Guide/Loops_and_iteration#for...of_statement) 文や[スプレッド構文](/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)を使用してください。どちらも文字列の [`@@iterator`](/ja/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator) を呼び出し、コードポイント単位で反復処理をします。それから、`codePointAt(0)` でそれぞれの要素のコードポイントを取得してください。
代わりに、[`for...of`](/ja/docs/Web/JavaScript/Guide/Loops_and_iteration#for...of_statement) 文や[スプレッド構文](/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)を使用してください。どちらも文字列の [`[Symbol.iterator]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/String/Symbol.iterator) を呼び出し、コードポイント単位で反復処理をします。それから、`codePointAt(0)` でそれぞれの要素のコードポイントを取得してください。

```js
for (const codePoint of str) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "String: length"
slug: Web/JavaScript/Reference/Global_Objects/String/length
l10n:
sourceCommit: f01f00dd9fb1dbb2af9c40c5b06421e883d71910
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}
Expand Down Expand Up @@ -33,15 +33,15 @@ l10n:
const str1 = "a".repeat(2 ** 29 - 24); // 成功する
const str2 = "a".repeat(2 ** 29 - 23); // RangeError: Invalid string length

const buffer = new Uint8Array(2 ** 29 - 24).fill("a".codePointAt(0)); // このバッファのサイズは 512MiB
const buffer = new Uint8Array(2 ** 29 - 24).fill("a".codePointAt(0)); // このバッファーのサイズは 512MiB
const str = new TextDecoder().decode(buffer); // この文字列のサイズは 1GiB
```

空文字列の場合、`length` は 0 になります。

静的プロパティの `String.length` は文字列の長さとは関係なく、 `String` 関数の[アリティ](/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/length)(簡単に言えば、それが持つ形式的な引数の数)であり、1 です。

`length` は文字数ではなくコード単位で数えるため、文字数を取得したい場合は、まず文字列を[イテレーター](/ja/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator)で分割し、文字ごとに反復処理をしてください。
`length` は文字数ではなくコード単位で数えるため、文字数を取得したい場合は、まず文字列を[イテレーター](/ja/docs/Web/JavaScript/Reference/Global_Objects/String/Symbol.iterator)で分割し、文字ごとに反復処理をしてください。

```js
function getCharacterLength(str) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
title: String.prototype.matchAll()
slug: Web/JavaScript/Reference/Global_Objects/String/matchAll
l10n:
sourceCommit: d85a7ba8cca98c2f6cf67a0c44f0ffd467532f20
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

**`matchAll()`** は[正規表現](/ja/docs/Web/JavaScript/Guide/Regular_expressions)に一致するすべての文字列を、[キャプチャグループ](/ja/docs/Web/JavaScript/Guide/Regular_expressions/Groups_and_backreferences)を含み、イテレーターで返すメソッドです。
**`matchAll()`** は {{jsxref("String")}} 値のメソッドで、この文字列と[正規表現](/ja/docs/Web/JavaScript/Guide/Regular_expressions)を照合したすべての結果を、[キャプチャグループ](/ja/docs/Web/JavaScript/Guide/Regular_expressions/Groups_and_backreferences)を含み、イテレーターで返すメソッドです。

{{EmbedInteractiveExample("pages/js/string-matchall.html")}}

Expand All @@ -29,7 +29,7 @@ matchAll(regexp)

### 返値

一致したものの[反復可能なイテレーターオブジェクト](/ja/docs/Web/JavaScript/Reference/Global_Objects/Iterator)(再起動不可能なもの)です。それぞれの一致する配列は {{jsxref("RegExp.prototype.exec()")}} の返値と同じ形です。
一致したものの[反復可能なイテレーターオブジェクト](/ja/docs/Web/JavaScript/Reference/Global_Objects/Iterator)(再起動不可能なもの)、または一致するものがなければ空のイテレーターです。イテレーターが生成するそれぞれの値は、{{jsxref("RegExp.prototype.exec()")}} の返値と同じ形です。

### 例外

Expand All @@ -38,7 +38,7 @@ matchAll(regexp)

## 解説

`String.prototype.matchAll` の実装自体は、正規表現がグローバルであるという余分な入力検証を除けば)非常にシンプルで、引数の文字列を最初の引数として `Symbol.matchAll` メソッドを呼び出すだけです。実際の実装は [`RegExp.prototype[@@matchAll]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@matchAll) から来ています。
`String.prototype.matchAll` の実装自体は、正規表現がグローバルであるという余分な入力検証を除けば)非常にシンプルで、引数の文字列を最初の引数として `Symbol.matchAll` メソッドを呼び出すだけです。実際の実装は [`RegExp.prototype[Symbol.matchAll]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.matchAll) から来ています。

## 例

Expand Down Expand Up @@ -92,7 +92,7 @@ str.matchAll(regexp);
// TypeError
```

`matchAll` では内部的に `regexp` の複製を作成します。そのため {{jsxref("Global_Objects/RegExp/exec", "regexp.exec()")}} とは違って文字列をスキャンした際に `lastIndex` が変わることはありません。
`matchAll` では内部的に `regexp` の複製を作成します。そのため {{jsxref("RegExp/exec", "regexp.exec()")}} とは違って文字列をスキャンした際に `lastIndex` が変わることはありません。

```js
const regexp = /[a-c]/g;
Expand All @@ -108,7 +108,7 @@ Array.from(str.matchAll(regexp), (m) => `${regexp.lastIndex} ${m[0]}`);

`matchAll` はキャプチャグループへのよりよいアクセスを実現します。

{{jsxref("Global_Objects/String/match", "match()")}} では、グローバル `g` フラグを使用するとキャプチャグループが無視されてしまいます。
{{jsxref("String/match", "match()")}} では、グローバル `g` フラグを使用するとキャプチャグループが無視されてしまいます。

```js
const regexp = /t(e)(st(\d?))/g;
Expand All @@ -128,7 +128,7 @@ array[1];
// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]
```

### matchAll() を RegExp ではない @@matchAll を実装しているオブジェクトで使用
### matchAll() を RegExp ではない `[Symbol.matchAll]()` を実装しているオブジェクトで使用

オブジェクトに `Symbol.matchAll` メソッドがあれば、それをカスタムマッチャーとして使うことができます。`Symbol.matchAll` の返値は `matchAll()` の返値となる。

Expand All @@ -154,9 +154,9 @@ str.matchAll({

- [`String.prototype.matchAll` のポリフィル (`core-js`)](https://github.com/zloirock/core-js#ecmascript-string-and-regexp)
- {{jsxref("String.prototype.match()")}}
- [JavaScript での正規表現の使用](/ja/docs/Web/JavaScript/Guide/Regular_expressions)
- [キャプチャグループ](/ja/docs/Web/JavaScript/Guide/Regular_expressions/Groups_and_backreferences)
- [JavaScript での正規表現の使用](/ja/docs/Web/JavaScript/Guide/Regular_expressions)ガイド
- [グループと後方参照](/ja/docs/Web/JavaScript/Guide/Regular_expressions/Groups_and_backreferences)ガイド
- {{jsxref("RegExp")}}
- {{jsxref("RegExp.prototype.exec()")}}
- {{jsxref("RegExp.prototype.test()")}}
- [`RegExp.prototype[@@matchAll]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@matchAll)
- [`RegExp.prototype[Symbol.matchAll]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.matchAll)
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
title: String.prototype.replaceAll()
slug: Web/JavaScript/Reference/Global_Objects/String/replaceAll
l10n:
sourceCommit: 6e3889be77fa45d5823216d0cc61b4f7c4b99e1b
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

**`replaceAll()`** メソッドは、`pattern` に一致したすべての文字列を `replacement` で置き換えた新しい文字列を返します。`pattern` は文字列または {{jsxref("RegExp")}} を指定することができ、`replacement` は文字列または各一致に対して呼び出される関数を指定することができます。元の文字列は変更されません。
**`replaceAll()`** は {{jsxref("String")}} 値のメソッドで、`pattern` に一致したすべての文字列を `replacement` で置き換えた新しい文字列を返します。`pattern` には文字列または {{jsxref("RegExp")}} を指定することができ、`replacement` は文字列または各一致に対して呼び出される関数を指定することができます。元の文字列は変更されません。

{{EmbedInteractiveExample("pages/js/string-replaceall.html")}}

Expand Down Expand Up @@ -58,14 +58,14 @@ console.log(unsafeRedactName(report, "ha.*er")); // "A [REDACTED]s in their name
console.log(safeRedactName(report, "ha.*er")); // "A hacker called [REDACTED] used special characters in their name to breach the system."
```

`pattern` が [`Symbol.replace`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace) メソッドを持つオブジェクト(`RegExp` オブジェクトを含む)である場合、そのメソッドは対象の文字列と `replacement` を引数として呼び出されます。その返値は `replaceAll()` の返値となります。この場合、`replaceAll()` の動作は完全に `@@replace` メソッドによってエンコードされるので、 `replace()` と同じ結果になります(正規表現がグローバルであるかどうかの余分な入力検証を除けば)。
`pattern` が [`Symbol.replace`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace) メソッドを持つオブジェクト(`RegExp` オブジェクトを含む)である場合、そのメソッドは対象の文字列と `replacement` を引数として呼び出されます。その返値は `replaceAll()` の返値となります。この場合、`replaceAll()` の動作は完全に `[Symbol.replace]()` メソッドによってエンコードされるので、 `replace()` と同じ結果になります(正規表現がグローバルであるかどうかの余分な入力検証を除けば)。
`pattern` が空文字列の場合、[`split()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split) の動作と同様に、UTF-16 のコード単位ごとに置換文字列が挿入されます。

```js
"xxx".replaceAll("", "_"); // "_x_x_x_"
```

正規表現プロパティ(特に [sticky](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky) フラグ)と `replaceAll()` との相互作用については、[`RegExp.prototype[@@replace]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@replace) を参照してください。
正規表現プロパティ(特に [sticky](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky) フラグ)と `replaceAll()` との相互作用については、[`RegExp.prototype[Symbol.replace]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.replace) を参照してください。

## 例

Expand Down Expand Up @@ -103,7 +103,7 @@ console.log(safeRedactName(report, "ha.*er")); // "A hacker called [REDACTED] us
## 関連情報

- [`String.prototype.replaceAll` のポリフィル (`core-js`)](https://github.com/zloirock/core-js#ecmascript-string-and-regexp)
- {{jsxref("String.prototype.replace", "String.prototype.replace()")}}
- {{jsxref("String.prototype.match", "String.prototype.match()")}}
- {{jsxref("RegExp.prototype.exec", "RegExp.prototype.exec()")}}
- {{jsxref("RegExp.prototype.test", "RegExp.prototype.test()")}}
- {{jsxref("String.prototype.replace()")}}
- {{jsxref("String.prototype.match()")}}
- {{jsxref("RegExp.prototype.exec()")}}
- {{jsxref("RegExp.prototype.test()")}}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
title: String.prototype.search()
slug: Web/JavaScript/Reference/Global_Objects/String/search
l10n:
sourceCommit: d85a7ba8cca98c2f6cf67a0c44f0ffd467532f20
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

**`search()`** メソッドは、正規表現とこの {{jsxref("String")}} オブジェクトが一致するかどうかを調べます
**`search()`** {{jsxref("String")}} 値のメソッドで、正規表現とこの文字列の一致する箇所を検索し、文字列内の最初に一致する箇所の位置を返します

{{EmbedInteractiveExample("pages/js/string-search.html")}}

Expand All @@ -31,14 +31,14 @@ search(regexp)

## 解説

`String.prototype.search()` 自体の実装はとてもシンプルです。引数の文字列を最初の引数として `Symbol.search` メソッドを呼び出すだけです。実際の実装は [`RegExp.prototype[@@search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@search) から来ています。
`String.prototype.search()` 自体の実装はとてもシンプルです。引数の文字列を最初の引数として `Symbol.search` メソッドを呼び出すだけです。実際の実装は [`RegExp.prototype[Symbol.search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.search) から来ています。

`regexp` の `g` フラグは `search()` の結果には影響がなく、検索は常に正規表現の `lastIndex` が 0 であるかのように行われます。`search()` の動作についての詳しい情報は、[`RegExp.prototype[@@search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@search) を参照してください。
`regexp` の `g` フラグは `search()` の結果には影響がなく、検索は常に正規表現の `lastIndex` が 0 であるかのように行われます。`search()` の動作についての詳しい情報は、[`RegExp.prototype[Symbol.search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.search) を参照してください。

パターンが見つかるかどうかを知りたい場合、かつ、文字列内のインデックスを知りたい場合は、`search()` を使用してください。

- パターンが存在するかどうかを知りたいだけであれば、{{jsxref("RegExp.prototype.test()")}} メソッドを使用してください。これは論理値を返します。
- 一致したテキストの内容が必要な場合は、{{jsxref("String.prototype.match()", "match()")}} または {{jsxref("RegExp.prototype.exec()")}} を使用してください。
- 一致したテキストの内容が必要な場合は、{{jsxref("String.prototype.match()")}} または {{jsxref("RegExp.prototype.exec()")}} を使用してください。

## 例

Expand All @@ -65,7 +65,7 @@ console.log(str.search(reDot)); // ドット記号 '.' が見つからないの
## 関連情報

- [`String.prototype.search` のポリフィル (`core-js`) (`Symbol.search` のようなの現代の修正や挙動つき)](https://github.com/zloirock/core-js#ecmascript-string-and-regexp)
- [JavaScript の正規表現の使用](/ja/docs/Web/JavaScript/Guide/Regular_expressions)
- [正規表現](/ja/docs/Web/JavaScript/Guide/Regular_expressions)ガイド
- {{jsxref("String.prototype.match()")}}
- {{jsxref("RegExp.prototype.exec()")}}
- [`RegExp.prototype[@@search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@search)
- [`RegExp.prototype[Symbol.search]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.search)
Loading