簡體   English   中英

為什么Javascript map函數String.toLowerCase在nodejs 6中不起作用?

[英]Why doesn't Javascript map function String.toLowerCase doesn't work in nodejs 6?

我正在閱讀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中運行呢?

String.toLowerCase不存在。 但是, String.prototype.toLowerCase可以。 但請記住, this將需要該呼叫成功進行設置,而map通過它作為一個參數 因此,這是最直接的事情:

const lcNames = names.map(name => name.toLowerCase());

該函數在原型( String.prototype.toLowerCase )上定義,這意味着字符串類型的實例可以訪問toLowerCase函數。

這就是你可以通過const lcNames = names.map(x => x.toLowerCase());訪問該函數的原因const lcNames = names.map(x => x.toLowerCase());

另一方面,這是有效的,因為isFinite不是通過原型定義的,而是基於Number本身。

const prices = cart.map(x => x.price);
prices.map(Number.isFinite);

注意:

names.map(String.toLowerCase);

在Firefox中有效,因為它具有包含toLowerCase的 String泛型方法 ,並記錄了注釋:

字符串泛型是非標准的,已棄用,將來會被刪除。 請注意,如果不使用下面提供的墊片,則不能跨瀏覽器依賴它們。

最重要的是它們不是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)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM