我正在阅读Ethan Brown撰写的“学习Javascript”一书。有一个关于如何使用map函数将数组中的所有元素转换为小写的示例:
const cart = [ { name: "Widget", price: 9.95 }, { name: "Gadget", price: 22.95 }];
const names = cart.map(x => x.name);
const lcNames = names.map(String.toLowerCase);
如果我在Firefox(v51)浏览器控制台中运行它,它可以工作,但是如果我尝试在nodejs v6.9.4中运行它,我得到:
TypeError: undefined is not a function
at Array.map (native)
at repl:1:27
at sigintHandlersWrap (vm.js:22:35)
at sigintHandlersWrap (vm.js:96:12)
at ContextifyScript.Script.runInThisContext (vm.js:21:12)
at REPLServer.defaultEval (repl.js:346:29)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:545:10)
at emitOne (events.js:101:20)
如果我将lcNames赋值更改为nodejs的以下内容,那么它运行正常:
const lcNames = names.map(x => x.toLowerCase());
我检查了node6与Firefox 50的ES6 Javascript兼容性图表,他们似乎都支持相同的功能。那么为什么本书中的代码不能在nodejs中工作呢?
答案 0 :(得分:1)
String.toLowerCase
不存在。但是,String.prototype.toLowerCase
会这样做。但请记住,需要为该调用设置this
才能成功,而map
将将其作为参数传递。因此,这是最直截了当的事情:
const lcNames = names.map(name => name.toLowerCase());
答案 1 :(得分:1)
该函数在原型(String.prototype.toLowerCase
)上定义,这意味着字符串类型的实例可以访问toLowerCase
函数。
这就是您可以通过const lcNames = names.map(x => x.toLowerCase());
访问该功能的原因。
另一方面,这是有效的,因为isFinite
未通过原型定义,而是在Number
本身定义。
const prices = cart.map(x => x.price);
prices.map(Number.isFinite);
答案 2 :(得分:1)
请注意:
names.map(String.toLowerCase);
在Firefox中有效,因为它有String generic methods,其中包含 toLowerCase ,并附有说明:
字符串泛型是非标准的,已弃用并将在附近删除 未来。请注意,您不能在不使用的情况下依赖于跨浏览器 下面提供的垫片。
最重要的是它们不是ECMAScript的一部分,因此很可能在其他浏览器中不受支持。如果你想使用它,你可以有条件地添加一个pollyfill,虽然有一个垫片可以在MDN添加所有通用方法。
// Built-in support?
console.log('Has built-in String.toLowerCase? ' + (typeof String.toLowerCase == 'function'));
// Polyfill if not supported
if (!String.toLowerCase) {
String.toLowerCase = function(s) {
return String(s).toLowerCase();
}
}
// Test it
console.log(['A','B','C'].map(String.toLowerCase))