为什么没有Javascript map函数String.toLowerCase在nodejs 6中不起作用?

时间:2017-02-03 00:51:12

标签: javascript node.js

我正在阅读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中工作呢?

3 个答案:

答案 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))