在JavaScript中,字符的長(zhǎng)度一直是開(kāi)發(fā)者們非常關(guān)注的話(huà)題之一。既然你已經(jīng)來(lái)到這篇文章,我相信你也對(duì)這一話(huà)題有著濃厚的興趣。那接下來(lái)我們一起來(lái)探究一下在JavaScript中,字符長(zhǎng)度這一話(huà)題到底有哪些重要的知識(shí)點(diǎn)以及需要注意些什么吧!
在JavaScript中,我們常遇到需要限制字符長(zhǎng)度的場(chǎng)合。比如,在微信朋友圈里發(fā)表說(shuō)說(shuō)時(shí),所能輸入的字符數(shù)總是有著明確的限制。此時(shí),如何計(jì)算字符的長(zhǎng)度顯得尤為重要。在JavaScript中,通過(guò)length屬性可以輕松獲得字符串的長(zhǎng)度。下面的代碼就展示了如何使用length屬性來(lái)獲取字符串的長(zhǎng)度:
在上面的代碼中,我們定義了一個(gè)字符串 "hello world",并且使用了length屬性來(lái)獲取它的長(zhǎng)度。結(jié)果輸出了11,也就是這個(gè)字符串總共由11個(gè)字符組成。
但問(wèn)題在于,對(duì)于非英文字符串(如中文、日文、韓文等等)的長(zhǎng)度計(jì)算,使用length屬性并不能得出準(zhǔn)確的結(jié)果。下面,我們就來(lái)探討這一問(wèn)題。
對(duì)于非英文字符串,JavaScript會(huì)采用Unicode編碼來(lái)表示其字符。至于什么是Unicode編碼,我們這里就不再贅述了,我們關(guān)心的是,在計(jì)算非英文字符長(zhǎng)度時(shí),應(yīng)該如何處理呢?
JavaScript提供了charCodeAt()方法和fromCharCode()方法來(lái)處理字符的Unicode編碼,同時(shí)ECMAScript2015更提供了codePointAt()方法來(lái)處理Unicode編碼。下面的代碼就展示了如何使用這些方法來(lái)計(jì)算非英文字符串的長(zhǎng)度:
在上面的代碼中,getLength()函數(shù)采用了for循環(huán)遍歷字符串中的每一個(gè)字符,通過(guò)charCodeAt()方法得到其Unicode編碼,再判斷其范圍,最后統(tǒng)計(jì)非英文字符的個(gè)數(shù)。getLength2()函數(shù)則采用了codePointAt()方法,作用相同。
可以看到,在輸入 "你好世界" 這個(gè)字符串時(shí),如果直接使用length屬性,將會(huì)得出6這樣一個(gè)顯然不準(zhǔn)確的結(jié)果。但當(dāng)我們使用getLength()或getLength2()函數(shù)時(shí),統(tǒng)計(jì)的長(zhǎng)度卻為8,這才是正確答案。
但在實(shí)際工程中,我們還需要注意另外一個(gè)問(wèn)題——一些特殊字符的Unicode編碼并不會(huì)被視作一個(gè)完整的字符。例如,表情符號(hào)
在JavaScript中,我們常遇到需要限制字符長(zhǎng)度的場(chǎng)合。比如,在微信朋友圈里發(fā)表說(shuō)說(shuō)時(shí),所能輸入的字符數(shù)總是有著明確的限制。此時(shí),如何計(jì)算字符的長(zhǎng)度顯得尤為重要。在JavaScript中,通過(guò)length屬性可以輕松獲得字符串的長(zhǎng)度。下面的代碼就展示了如何使用length屬性來(lái)獲取字符串的長(zhǎng)度:
var str = "hello world"; console.log(str.length); // 輸出結(jié)果:11
在上面的代碼中,我們定義了一個(gè)字符串 "hello world",并且使用了length屬性來(lái)獲取它的長(zhǎng)度。結(jié)果輸出了11,也就是這個(gè)字符串總共由11個(gè)字符組成。
但問(wèn)題在于,對(duì)于非英文字符串(如中文、日文、韓文等等)的長(zhǎng)度計(jì)算,使用length屬性并不能得出準(zhǔn)確的結(jié)果。下面,我們就來(lái)探討這一問(wèn)題。
對(duì)于非英文字符串,JavaScript會(huì)采用Unicode編碼來(lái)表示其字符。至于什么是Unicode編碼,我們這里就不再贅述了,我們關(guān)心的是,在計(jì)算非英文字符長(zhǎng)度時(shí),應(yīng)該如何處理呢?
JavaScript提供了charCodeAt()方法和fromCharCode()方法來(lái)處理字符的Unicode編碼,同時(shí)ECMAScript2015更提供了codePointAt()方法來(lái)處理Unicode編碼。下面的代碼就展示了如何使用這些方法來(lái)計(jì)算非英文字符串的長(zhǎng)度:
// 1. 采用for循環(huán)遍歷字符串中的每一個(gè)字符,通過(guò)charCodeAt()方法得到其Unicode編碼,再判斷其編碼的范圍,最后統(tǒng)計(jì)非英文字符的個(gè)數(shù)。 function getLength(str) { var length = 0; for (var i = 0; i < str.length; i++) { var charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <= 128) { length++; } else { length += 2; } } return length; } var str1 = "hello world"; console.log(getLength(str1)); // 輸出結(jié)果:11 var str2 = "你好世界"; console.log(getLength(str2)); // 輸出結(jié)果:8 // 2. 采用codePointAt()方法獲取字符的十進(jìn)制Unicode編碼值,根據(jù)編碼值的范圍來(lái)判斷該字符所占長(zhǎng)度。 function getLength2(str) { var length = 0; for (var i = 0; i < str.length; i++) { var codePoint = str.codePointAt(i); if (codePoint >= 0 && codePoint <= 128) { length++; } else { length += 2; } } return length; } var str3 = "hello world"; console.log(getLength2(str3)); // 輸出結(jié)果:11 var str4 = "你好世界"; console.log(getLength2(str4)); // 輸出結(jié)果:8
在上面的代碼中,getLength()函數(shù)采用了for循環(huán)遍歷字符串中的每一個(gè)字符,通過(guò)charCodeAt()方法得到其Unicode編碼,再判斷其范圍,最后統(tǒng)計(jì)非英文字符的個(gè)數(shù)。getLength2()函數(shù)則采用了codePointAt()方法,作用相同。
可以看到,在輸入 "你好世界" 這個(gè)字符串時(shí),如果直接使用length屬性,將會(huì)得出6這樣一個(gè)顯然不準(zhǔn)確的結(jié)果。但當(dāng)我們使用getLength()或getLength2()函數(shù)時(shí),統(tǒng)計(jì)的長(zhǎng)度卻為8,這才是正確答案。
但在實(shí)際工程中,我們還需要注意另外一個(gè)問(wèn)題——一些特殊字符的Unicode編碼并不會(huì)被視作一個(gè)完整的字符。例如,表情符號(hào)