ECMAScript 2017 (ECMA-262 8th edition) 既定の String.prototype.padStart
及び String.prototype.padEnd
の Polyfill(互換コード)を提供します。
String.prototype.padStart
は第一引数で「文字列の全長(maxLength
)」を指定し、第二引数で「前方に埋める文字列(fillString
)」を指定します。
第一引数で指定した「文字列の長さ(maxLength
)」になるまで、文字列の前方から第二引数で指定した「前方に埋める文字列(fillString
)」を繰り返し指定する事で埋めていきます。
良く使われる用途としては、ゼロパディングがあります。
console.log('9'.padStart(3, '0')); // "009"
第二引数が省略された場合は、第二引数に半角スペース(0x0020
)が指定された扱いとなります。
console.log('a'.padStart(3) === ' a'); // true
第一引数で指定された文字列の長さが2文字以上であり、「(第一引数で指定された文字列長 - 現在の文字列長) / 第二引数の文字列長」が割り切れなかった場合、後方が見切れる形で前方が埋まります。
console.log('abc'.padStart(10, '<e>')); // "<e><e><abc"
String.prototype.padEnd
は第一引数で「文字列の全長(maxLength
)」を指定し、第二引数で「後方に埋める文字列(fillString
)」を指定します。
第一引数で指定した「文字列の長さ(maxLength
)」になるまで、文字列の後方から第二引数で指定した「後方に埋める文字列(fillString
)」を繰り返し指定する事で埋めていきます。
console.log('9'.padEnd(3, '0')); // "900"
第二引数が省略された場合は、第二引数に半角スペース(0x0020
)が指定された扱いとなります。
console.log('a'.padEnd(3) === 'a '); // true
第一引数で指定された文字列の長さが2文字以上であり、「(第一引数で指定された文字列長 - 現在の文字列長) / 第二引数の文字列長」が割り切れなかった場合、後方が見切れる形で前方が埋まります。
console.log('abc'.padEnd(10, '<e>')); // "abc<e><e><"
IE8以下のブラウザでは、Object.defineProperty
が DOM オブジェクトにしか適用できない仕様の為、IE8 以下の場合のみ、関数オブジェクト代入のコードで各メソッドを定義しています。
String.prototype.padStart = function padStart () {};
String.prototype.padEnd = function padEnd () {};
それぞれ列挙可能(enumerable: false
)なメソッドとして定義されている為、for-in
で列挙されてしまう問題があります。
for (var key in 'foo') {
console.log(key); // ここで列挙されてしまう
}
通常、文字列に対して for-in
でプロパティを列挙する事はない為、ほぼ問題ないと思われますが、コードを書く際には Object.keys
を使ったり、Object.prototype.hasOwnProperty
を併用する事で対策する必要があります。
(※なお、IE9 以降では、Object.defineProperties
で列挙不可能にしている為、この問題はありません。)
ES3 (ECMA-262 3th edition) を実装しているブラウザであれば、動作します。 IE11 のエミュレーションモードでは、IE5 まで期待通りに動作しました。