padStart と padEnd この章では、Jordan Harband 氏と Rick Waldron 氏による ECMAScript 2017 の「文字列パディング」機能について説明します。
ECMAScript 2017 には 2 つの新しい文字列メソッドがあります。
> 'x'.padStart(5, 'ab')
'ababx'
> 'x'.padEnd(5, 'ab')
'xabab'
文字列をパディングするユースケースには以下が含まれます。
'file 001.txt''Test 001: ✓''0x00FF'String.prototype.padStart(maxLength, fillString=' ') このメソッドは受信者に対して fillString を (繰り返すことも場合によってはある) プレフィックスとして追加し、それが maxLength の長さになるまで続けます。
> 'x'.padStart(5, 'ab')
'ababx'
必要に応じて fillString のフラグメントが使用され、結果の長さがちょうど maxLength になるようにします。
> 'x'.padStart(4, 'ab')
'abax'
受信者が maxLength と同じ長さか、それよりも長い場合、変更されずに返されます。
> 'abcd'.padStart(2, '#')
'abcd'
maxLength と fillString.length が同じ場合、fillString は受信者が最後から挿入されるマスクになります。
> 'abc'.padStart(10, '0123456789')
'0123456abc'
fillString を省略すると、スペースが 1 つある文字列 (' ') が使用されます。
> 'x'.padStart(3)
' x'
padStart() の簡単な実装 次の実装は、padStart() の仕組みをおおまかに示していますが、完全には仕様に準拠していません (端的なケースがいくつかあります)。
String.prototype.padStart =
function (maxLength, fillString=' ') {
let str = String(this);
if (str.length >= maxLength) {
return str;
}
fillString = String(fillString);
if (fillString.length === 0) {
fillString = ' ';
}
let fillLen = maxLength - str.length;
let timesToRepeat = Math.ceil(fillLen / fillString.length);
let truncatedStringFiller = fillString
.repeat(timesToRepeat)
.slice(0, fillLen);
return truncatedStringFiller + str;
};
String.prototype.padEnd(maxLength, fillString=' ') padEnd() は padStart() と似て動作しますが、繰り返した fillString を開始時に挿入するのではなく、終了時に挿入します。
> 'x'.padEnd(5, 'ab')
'xabab'
> 'x'.padEnd(4, 'ab')
'xaba'
> 'abcd'.padEnd(2, '#')
'abcd'
> 'abc'.padEnd(10, '0123456789')
'abc0123456'
> 'x'.padEnd(3)
'x '
padEnd() の実装は最後の行のみが padStart() の実装とは異なります。
return str + truncatedStringFiller;
padStart と padEnd padLeft と padRight と呼ばれないのはなぜですか? 双方向または右から左の言語では、left と right という用語は適切に機能しません。したがって、padStart と padEnd の命名は、既存の名前の startsWith と endsWith に従っています。