Files
scriptc/tests/corpus/3042-string-padding-coercion.js

59 lines
1.7 KiB
JavaScript

console.log(JSON.stringify([
"xy".padStart(),
"xy".padEnd(),
"xy".padStart(undefined, "_"),
"xy".padEnd(null, "_"),
"xy".padStart(4, undefined),
"xy".padEnd(4, void 0),
"xy".padStart(5, null),
"xy".padEnd(5, false),
"xy".padStart("5.9", true),
"xy".padEnd("5.9", NaN),
String.prototype.padStart.call(42, 5, "0"),
String.prototype.padEnd.call(false, 8, "-"),
]));
let order = "";
function receiver() {
order += "r";
return {
toString: function() { order += "T"; return {}; },
valueOf: function() { order += "V"; return "xy"; },
};
}
function length() {
order += "l";
return {
valueOf: function() { order += "N"; return {}; },
toString: function() { order += "S"; return "5.9"; },
};
}
function fill() {
order += "f";
return {
toString: function() { order += "F"; return {}; },
valueOf: function() { order += "G"; return "_"; },
};
}
console.log(String.prototype.padStart.call(receiver(), length(), fill()), order);
let fillCalls = 0;
const skippedFill = { toString: function() { fillCalls++; return "$"; } };
console.log("abc".padStart(2, skippedFill), "abc".padEnd(NaN, skippedFill), fillCalls);
let sideEffects = "";
function ignoredFill() { sideEffects += "f"; return "_"; }
console.log("abc".padEnd(2, ignoredFill()), sideEffects);
const dynamicFill = Math.floor(1.9) === 1 ? false : "_";
console.log("xy".padStart(6, dynamicFill), "xy".padEnd(6, dynamicFill));
let nullishOrder = "";
function badLength() { nullishOrder += "l"; return 2; }
function badFill() { nullishOrder += "f"; return "_"; }
try {
String.prototype.padEnd.call(null, badLength(), badFill());
} catch (error) {
console.log(nullishOrder, error.name, error.message);
}