JavaScriptのシンボルメソッドiterator, asyncIterator, match, replace, search, splitについて

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は、文字列内での検索位置をカスタマイズするためのシンボルです。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']
    

これらのシンボルメソッドを活用することで、標準的な文字列操作や反復処理を柔軟にカスタマイズできます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です