我正在尝试将toLowerCase
或toUpperCase
中的一个绑定到一个变量,而我却错过了一些步骤。这是我的代码的简化版本:
for(let i = 0; i < arr.length; i++) {
if(flag) {
arr[i] = arr[i].toUpperCase();
}
else {
arr[i] = arr[i].toLowerCase();
}
}
我希望我可以做类似的事情:
let func = flag ? String.prototype.toUpperCase : String.prototype.toLowerCase;
arr = arr.map(x=>func(x));
虽然我可以设置该功能,但看起来我没有正确使用它,因为我得到了Uncaught TypeError: String.prototype.toLowerCase called on null or undefined
。我在这里缺少什么?
答案 0 :(得分:5)
你可以这样做,但你必须使用.call
(或.apply
)才能在{{1}的调用中正确设置this
1}} / toUpperCase
,因为他们希望看到字符串用作toLowerCase
,而不是传递参数:
this
(我也从let func = flag ? String.prototype.toUpperCase : String.prototype.toLowerCase;
arr = arr.map(x=>func.call(x));
//-------------------^^^^^
前面的let
放弃了第二行,arr
位于arr
的右侧将是=
。[或者,根据之前声明的undefined
的位置/方式,这将是一个错误。])
示例:
arr
另一种选择是给自己一个包装函数,然后你可以按照你想要的方式调用它:
let arr = ["one", "TWO", "three", "FOUR"];
const flag = Math.random() < 0.5;
console.log("Flag is: " + flag);
let func = flag ? String.prototype.toUpperCase : String.prototype.toLowerCase;
arr = arr.map(x=>func.call(x));
console.log(arr);
示例:
let func = flag ? s => s.toUpperCase() : s => s.toLowerCase();
arr = arr.map(x=>func(x));
但在这种特定情况下,更简单的方法是使用括号表示法和字符串函数名称:
let arr = ["one", "TWO", "three", "FOUR"];
const flag = Math.random() < 0.5;
console.log("Flag is: " + flag);
let func = flag ? s => s.toUpperCase() : s => s.toLowerCase();
arr = arr.map(x=>func(x));
console.log(arr);
示例:
let funcName = flag ? "toUpperCase" : "toLowerCase";
arr = arr.map(x=>x[funcName]());
答案 1 :(得分:2)
您可以使用func.call(x)
call
功能 - 请参阅下面的演示:
let func = true ? String.prototype.toUpperCase : String.prototype.toLowerCase;
let arr = ['test', 'TEST', "Test"].map(x=>func.call(x));
console.log(arr);
&#13;