成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解ES6之《字符串及正則》

liaosilzu2007 / 1562人閱讀

摘要:字符串中的字符有兩種,一種是由一個編碼單元位表示的字符,另一種是由兩個編碼單元位表示的輔助平面字符在中,所有字符串的操作都是基于位編碼單元接受編碼單元的位置而非字符位置作為參數(shù),返回與字符串中給定位置對應(yīng)的碼位,即一個整數(shù)值也就是說對于字符

字符串中的字符有兩種,一種是由一個編碼單元16位表示的BMP字符,另一種是由兩個編碼單元32位表示的輔助平面字符
在ES5中,所有字符串的操作都是基于16位編碼單元

codePointAt

codePointAt 接受編碼單元的位置而非字符位置作為參數(shù),返回與字符串中給定位置對應(yīng)的碼位,即一個整數(shù)值
也就是說對于BMP字符集中的字符,codePointAt方法的返回值與charCodeAt方法的相同,而對于非BMP字符集來說返回值則不同

let txt="?a"
console.log(txt.charCodeAt(0))//55362  --僅僅返回位置0處的第一個編碼單元
console.log(txt.charCodeAt(1))//57271
console.log(txt.charCodeAt(2))//97

console.log(txt.codePointAt(0))//134071  --返回完整的碼位,即使這個碼位包含多個編碼單元
console.log(txt.codePointAt(1))//57271
console.log(txt.codePointAt(2))//97

檢測字符占用編碼單元數(shù)量

function is32Bit(c) {
  return c.codePointAt(0)>0xFFFF
}
console.log(is32Bit("?"))//true
console.log(is32Bit("a"))//false
String.fromCodePoint

codePoint方法在字符串中檢索一個字符的碼位,也可以使用String.fromCodePoint方法根據(jù)指定的碼位生成一個字符

可以將String.fromCodePoint看成更完整版本的String.fromCharCode,因為對于BMP中的所有字符,這倆方法執(zhí)行結(jié)果相同,只有傳遞非BMP的碼位作用參數(shù)時,二者執(zhí)行結(jié)果才有可能不同

normalize

在對不同字符進(jìn)行排序或比較時,會存在一種可能它們是等效的
1、規(guī)范的等效是指無論從哪個角度來看,兩個序列的碼位都是沒有區(qū)別的
2、兩個互相兼容的碼位序列看起來不同,但是在特定情況下可以被交換使用
切記:在對比字符串前一定要把它們標(biāo)準(zhǔn)化為同一種形式

let values = ["test", "demo", "compare", "sort"]
let normalized = values.map(function (txt) {
  return txt.normalize()
})
normalized.sort(function (first, second) {
  if (first < second) return -1
  else if (first === second) return 0
  else return 1
})

或者上述代碼也可以這樣

let values = ["test", "demo", "compare", "sort"]
values.sort(function (first, second) {
  // let firstNormalized = first.normalize(),
  //   secondNormalized = second.normalize();  //可以寫成這種形式也可以寫成如下這種形式
  let firstNormalized = first.normalize("NFC"),
  secondNormalized = second.normalize("NFC");
  if (firstNormalized < secondNormalized) return -1
  else if (firstNormalized === secondNormalized) return 0
  else return 1
})

Unicode標(biāo)準(zhǔn)化形式有如下幾種

正則u修飾符

當(dāng)一個正則表達(dá)式使用u修飾符時,它就從編碼單元操作切換為字符模式

let txt = "?"
console.log(txt.length)//2
console.log(/^.$/.test(txt))//false
console.log(/^.$/u.test(txt))//true

通過上述特性,可檢測字符串真正長度

function codePointLength(txt) {
  let result = txt.match(/[sS]/gu)
  return result ? result.length : 0
}
console.log(codePointLength("abc"))//3
console.log(codePointLength("?ab"))//3
console.log("?ab".length)//4

檢測引擎是否支持u修飾符

function hasRegExpU(params) {
  try {
    var pattern = new RegExp(".", "u")
    return true
  } catch (ex) {
    return false
  }
}

如果你的代碼仍然需要運(yùn)行在老式的JS引擎中,使用修飾符時切記使用RegExp構(gòu)造函數(shù),這樣可以避免發(fā)生語法錯誤,并且你可以有選擇的檢測和使用u修飾符而不會造成系統(tǒng)異常終止

字符串中的子串識別

includes 在字符串中檢測是否包含指定文本
startsWith 在字符串的起始部分是否包含指定文本
endsWith 在字符串的結(jié)束部分是否包含指定文本
以上三個方法都接受兩個參數(shù):1、要搜索的文本 2、可選 開始搜索的索引值,如果指定的第二個參數(shù)則會比這個索引值的位置開始匹配,endsWith則從字符串長度減法這個索引值的位置開始匹配

let msg = "Hello world!"
console.log(msg.startsWith("Hello"))//true
console.log(msg.endsWith("!"))//true
console.log(msg.includes("o"))//true

console.log(msg.startsWith("o"))//false
console.log(msg.endsWith("world!"))//true
console.log(msg.includes("x"))//false

console.log(msg.startsWith("o", 4))//true--從字符串Hello中的o開始
console.log(msg.endsWith("o", 8))//true--字符串的位置是12減去8之后還余下4
console.log(msg.includes("o", 8))//false--從字符串world中的r開始匹配

indexOf和lastIndexof是尋找子串的位置,并且如果你傳一個正則表達(dá)式進(jìn)去的話,它們會將傳入的正則表達(dá)式轉(zhuǎn)化為字符串并搜索它,而在includes等這三方法中,如果你不是傳入字符串而是一個正則表達(dá)式則會報錯

repeat 接受一個number類型的參數(shù),表示該字符串的重復(fù)次數(shù),返回當(dāng)前字符串重復(fù)一定次數(shù)后的新字符串

console.log("X".repeat(5))//XXXXX
正則表達(dá)式y(tǒng)修飾符

在字符串開始字符匹配時,它會通知搜索從正則表達(dá)式的lastIndex屬性開始進(jìn)行,如果在指定位置未能成功匹配則停止繼續(xù)匹配

let text = "hello1 hello2 hello3",
  pattern = /hellods?/,
  result = pattern.exec(text),
  globalPattern = /hellods?/g,
  glogbalResult = globalPattern.exec(text),
  stickyPattern = /hellods?/y,
  stickyResult = stickyPattern.exec(text);

console.log(result[0])//hello1
console.log(glogbalResult[0])//hello1
console.log(stickyResult[0])//hello1
pattern.lastIndex = 1
globalPattern.lastIndex = 1
stickyPattern.lastIndex = 1
result = pattern.exec(text)
glogbalResult = globalPattern.exec(text)
stickyResult = stickyPattern.exec(text)
console.log(result[0])//hello1
console.log(glogbalResult[0])//hello2
console.log(stickyResult[0])//報錯

關(guān)于修飾符有2點(diǎn):
1、只有調(diào)用exec和test方法才會涉及l(fā)astIndex
2、當(dāng)lastIndex的值為0時,如果正則表達(dá)式中含有^則是否使用粘滯正則表達(dá)式并無差別,如果lastIndex的值不為0則該表達(dá)式永遠(yuǎn)不會匹配到正確結(jié)果

let pattern=/hellod/y
console.log(pattern.sticky)//true
正則表達(dá)式復(fù)制

ES5中復(fù)制正則表達(dá)式只能這樣

var re1 = /ab/i,
  re2 = new RegExp(re1);

如果想要對re1重新指定修飾符則不行,ES6 增加了這一新功能

var re1 = /ab/i,
  re2 = new RegExp(re1, "g")
console.log(re1)//   /ab/i
console.log(re2)//   /ab/g
console.log(re1.test("ab"))//true
console.log(re2.test("ab"))//true
console.log(re1.test("AB"))//true
console.log(re2.test("AB"))//false
正則中的flags屬性
let re=/ab/g
console.log(re.source)// ab
console.log(re.flags)// g   --ES新增的屬性
模板字面量

在ES6之前多行字符串只能在一個新行最前方添加反斜杠來承接上一行代碼

var message="Multiline
string"

但是這樣有一個問題,在控制臺輸出在了同一行,所以只能通過手工插入n換行符

ES6中通過反撇號來創(chuàng)建多行字符串,在反撇號中所有空白符都屬于字符串的一部分,所以千萬要小心縮進(jìn)

字符串占位符可以包含任意的JS表達(dá)式,占位符中可訪問作用域中所有可訪問的變量,嘗試嵌入一個未定義的變量總是會拋出錯誤

let count = 10,
  price = 2.5,
  message = `${count} items cost $ ${(count * price).toFixed(2)}.`
  //10 items cost $ 25.00.

字符串占位符還可以內(nèi)嵌,內(nèi)嵌的{后必須包含在反撇號中

let name = "angela",
  message = `Hello,${`
    my name is ${name}`
  }`
console.log(message)

String.raw訪問字符串前的原生字符串

let msg1 = `Multiline
stirng`,
  msg2 = String.raw`Multiline
string`
console.log(msg1)//Multiline
//string
console.log(msg2)//Multiline
string

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87367.html

相關(guān)文章

  • H5學(xué)習(xí)

    摘要:為此決定自研一個富文本編輯器。本文,主要介紹如何實(shí)現(xiàn)富文本編輯器,和解決一些不同瀏覽器和設(shè)備之間的。 對ES6Generator函數(shù)的理解 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同。 JavaScript 設(shè)計模式 ② 巧用工廠模式和創(chuàng)建者模式 我為什么把他們兩個放在一起講?我覺得這兩個設(shè)計模式有相似之處,有時候會一個設(shè)計模式不能滿...

    aristark 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<