読者です 読者をやめる 読者になる 読者になる

JS.next

JavaScriptの最新実装情報を追うブログ

String.prototype.{startsWith,endsWith,includes} が正規表現を受け付けなくなった

☆☆☆ ES2015 実装更新 V8

概要

これらは文字列を期待するメソッドだが、splitの用に正規表現も受け付けると思われて解決しづらいバグの元になってしまわないように、正規表現オブジェクトが渡された時は専用のエラーを出すことになり、V8の実装も追従した。


メソッドの説明

文字列str1が文字列str2で始まっているかどうかを『str1.startsWith(str2)』、
文字列str1が文字列str2で終わっているかどうかを『str1.endsWith(str2)』、
文字列str1が文字列str2を含んでいるかどうかを 『str1.includes(str2)』で得ることができる。
【注意】「includes」は当初「contains」という名前でしたが改名されました。

'123abc789'.startsWith('123')  // true

'123abc789'.startsWith(/\d{3}/)
  // TypeError: First argument to String.prototype.startsWith must not be a regular expression


範囲を持たせたいときは RegExp.prototype.testString.prototype.match と「^」や「$」を使おう

// startsWith
/^\d{3}/.test('123abc789')     // true
!!'123abc789'.match(/^\d{3}/)  // true

// endsWith
/\d{3}$/.test('123abc789')     // true
!!'123abc789'.match(/\d{3}$/)  // true

// contains
/[a-z]{3}/.test('123abc789')     // true
!!'123abc789'.match(/[a-z]{3}/)  // true


変更が加えられたバージョン

V8 3.24.26(startsWith,endsWith) 3.26.8(contains) 3.31.15(contains→includes)