JavaScriptのシンボルメソッドiterator, asyncIterator, match, replace, search, splitについて
このページでは、JavaScriptにおける特別な組み込みシンボルメソッドについて詳しく解説します。以下の目次から各セクションにジャンプできます。
Symbol.iterator
Symbol.iterator
は、オブジェクトが反復可能かどうかを定義するためのメソッドを指定するシンボルです。このシンボルを実装することで、そのオブジェクトをfor…ofループやスプレッド構文などで利用可能にすることができます。
// 配列はデフォルトでSymbol.iteratorを持つ
const array = [1, 2, 3];
for (const value of array) {
console.log(value); // 1, 2, 3
}
// カスタムオブジェクトにSymbol.iteratorを追加
const customIterable = {
data: [10, 20, 30],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (const value of customIterable) {
console.log(value); // 10, 20, 30
}
Symbol.asyncIterator
Symbol.asyncIterator
は、非同期の反復処理を定義するためのシンボルです。これはfor await...of
ループで利用されます。
// 非同期反復可能オブジェクト
const asyncIterable = {
data: [1, 2, 3],
[Symbol.asyncIterator]() {
let index = 0;
return {
next: async () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
(async () => {
for await (const value of asyncIterable) {
console.log(value); // 1, 2, 3
}
})();
Symbol.match
Symbol.match
は、文字列検索の挙動をカスタマイズするためのシンボルです。String.prototype.match
で呼び出されます。
class CustomMatcher {
constructor(value) {
this.value = value;
}
[Symbol.match](string) {
return string.includes(this.value);
}
}
console.log('hello world'.match(new CustomMatcher('world'))); // true
console.log('hello world'.match(new CustomMatcher('test'))); // false
Symbol.replace
Symbol.replace
は、文字列置換の挙動をカスタマイズするためのシンボルです。String.prototype.replace
で呼び出されます。
class CustomReplacer {
constructor(replacement) {
this.replacement = replacement;
}
[Symbol.replace](string, replacement) {
return string.split(' ').join(this.replacement);
}
}
console.log('hello world'.replace(new CustomReplacer('-'))); // hello-world
Symbol.search
Symbol.search
は、文字列内での検索位置をカスタマイズするためのシンボルです。String.prototype.search
で呼び出されます。
class CustomSearcher {
constructor(keyword) {
this.keyword = keyword;
}
[Symbol.search](string) {
return string.indexOf(this.keyword);
}
}
console.log('hello world'.search(new CustomSearcher('world'))); // 6
console.log('hello world'.search(new CustomSearcher('test'))); // -1
Symbol.split
Symbol.split
は、文字列の分割方法をカスタマイズするためのシンボルです。String.prototype.split
で呼び出されます。
class CustomSplitter {
constructor(delimiter) {
this.delimiter = delimiter;
}
[Symbol.split](string) {
return string.split(this.delimiter);
}
}
console.log('apple,banana,cherry'.split(new CustomSplitter(','))); // ['apple', 'banana', 'cherry']
これらのシンボルメソッドを活用することで、標準的な文字列操作や反復処理を柔軟にカスタマイズできます。