簡體   English   中英

具有'fromCharCode'(字符長度)的Javascript映射數組

[英]Javascript map array with 'fromCharCode' (character length)

以下是來自Chrome控制台中的交互式會話的信息:

myarray
//-> [67, 65, 84]

String.fromCharCode(67)
//-> "C"

String.fromCharCode(67).length
//-> 1

String.fromCharCode(myarray[0])
//-> "C"

String.fromCharCode(myarray[0]).length
//-> 1

myarray.map(String.fromCharCode)
//-> ["C", "A", "T"]

myarray.map(String.fromCharCode)[0]
//-> "C"

myarray.map(String.fromCharCode)[0].length
//-> 3

誰能解釋為什么最后一個操作返回3

非常有趣的問題。

答案是:最后得到3的原因是fromCharCode返回的字符串的字符數與調用它的參數一樣多 ,並且map調用帶有三個參數的回調函數:元素的值,元素的索引以及要遍歷的對象。 因此,一個字符串包含三個字符,但不包含三個容易顯示的字符。 整rick

具體來說,第一個參數為"C" 第二個參數的字符為0(因為我們正在查看[0][1]fromCharCode ),以及一個基於將數組強制轉換為數字的字符(使用fromCharCode使用的任何規則; ŠimeVidas下面說,它將對其執行ToUInt16 ,結果為0 )。

因此,例如:

> String.fromCharCode(67, 0, [67, 65, 84]).length
3

...就像來自map的呼叫一樣。

為了清楚起見:

> String.fromCharCode(67, 0, [67, 65, 84]).length
3
> String.fromCharCode(67, 0, null).length
3
> String.fromCharCode(67, 0, 0, 0, 0, 0, 0).length
7

如果確保每次只傳遞一個參數,則不會看到意想不到的效果,因此使用它直接給我們帶來的結果是,我想我們大多數人都不會期望:

> [67, 65, 84].map(String.fromCharCode)
["C", "A", "T"]
> [67, 65, 84].map(String.fromCharCode)[0]
"C"
> [67, 65, 84].map(String.fromCharCode)[0].length
3

...這給了我們一個更容易理解的結果:

> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })
["C", "A", "T"]
> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })[0]
"C"
> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })[0].length
1

對於TJ Crowder的好答案,我不能做太多擴展,但是我可以為這個特定問題提供解決方法。

而不是

myarray.map(String.fromCharCode);

使用

String.fromCharCode.apply(String, myarray).split("");

除了返回預期結果的好處之外,這也可以不依賴ECMAScript 5th Edition方法Array.prototype.map ,從而使其更加兼容。

遇到相同的問題並找到了該線程。 如果您使用ES6,我建議采用以下解決方案:

arr.map((c)=>String.fromCharCode(c));

暫無
暫無

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

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