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

資訊專欄INFORMATION COLUMN

ES6—字符串模板引擎(4)

cnio / 1898人閱讀

摘要:字符串模板引擎中的字符串缺乏多行字符串字符串格式化轉(zhuǎn)義等特性。字符串中嵌入變量模板字面量看上去僅僅是普通字符串的升級版,但二者之間真正的區(qū)別在于模板字面量的變量占位符。黑子在上面的代碼中,就是模板標簽。

字符串模板引擎

ES5中的字符串缺乏多行字符串、字符串格式化、HTML轉(zhuǎn)義等特性。

而ES6通過模板字面量的方式進行了填補,模板字面量試著跳出JS已有的字符串體系,通過一些全新的方法來

解決問題。

1.基本用法
 
ES5字符串寫法:

let message = "我的寵物狗叫黑子,今年16歲了"

將其轉(zhuǎn)化成ES6寫法,其實非常簡單:

只需把最外圍的雙引號(")或者單引號(") 轉(zhuǎn)化成反引號(`)即可。

let message = `我的寵物狗叫黑子,今年16歲了`

如果想在字符串內(nèi)部使用反引號,只需使用反斜杠( )轉(zhuǎn)義即可

let message = `我的寵物狗叫`黑子`,今年16歲了`;
console.log(message); // "我的寵物狗叫`黑子`,今年16歲了"

2.多行字符串

傳統(tǒng)的JavaScript語言,輸出模板通常是這樣寫的:

var name = "黑子";
var age = 8;
$("#result").append(
  "我的寵物狗叫 " + name + "
" +
      "今年
" +
      "" + age+ "歲,
"+
  "十分可愛!"
);

但是在ES6中,要獲得同樣效果的多行字符串,只需使用如下代碼:

let name = "黑子";
let age = 8;
$("#result").append(
  `我的寵物狗叫 ${name}
      今年 
      ${age}歲,
  十分可愛!`
);

對比兩段拼接的代碼,模板字符串使得我們不再需要反復(fù)使用雙引號(或者單引號)了;而是改用反引號標識符

(`),插入變量的時候也不需要再使用加號(+)了,而是把變量放入${ }即可。

也不用再通過寫 n 進行換行了,ES6 的模板字面量使多行字符串更易創(chuàng)建,因為它不需要特殊的語法,只需在想

要的位置直接換行即可,此處的換行會同步出現(xiàn)在結(jié)果中。簡單、清晰、明了。

注意:如果使用模板字符串表示多行字符串,所有的空格和縮進都會被保留在輸出之中。因此需要特別留意縮進。

console.log(`我的寵物狗叫黑子
                             今年16歲了`);
結(jié)果:                             
//我的寵物狗叫黑子
//                             今年16歲了

以上代碼中,模板字面量第二行前面的所有空白符都被視為字符串自身的一部分。

如果一定要通過適當?shù)目s進來對齊文本,可以考慮在多行模板字面量的第一行空置并在后面的幾行縮進

let html = `

Title

`.trim();

以上代碼中,模板字面量的第一行沒有任何文本,第二行才有內(nèi)容。 HTML標簽的縮進增強了可讀性,之后再

調(diào)用trim()方法移除了起始的空行。

3.字符串中嵌入變量

模板字面量看上去僅僅是普通JS字符串的升級版,但二者之間真正的區(qū)別在于模板字面量的變量占位符。

ES5寫法:

const age = 8;
const message  = "我的寵物狗叫黑子,今年" + age*2 + "歲了" ;
//我的寵物狗叫黑子,今年16歲了

ES6寫法:

const age = 8;
const message  = `我的寵物狗叫黑子,今年 ${age*2} 歲了` ;
//我的寵物狗叫黑子,今年16歲了

變量占位符允許將任何有效的JS表達式嵌入到模板字面量中,并將其結(jié)果輸出為字符串的一部分。

如上面的例子,占位符 ${age} 會訪問變量 age,并將其值插入到 message 字符串中。


既然占位符是JS表達式,還可以輕易嵌入運算符、函數(shù)調(diào)用等。

const age = 8;
const message = `我的寵物狗叫黑子,今年 ${(age*2).toFixed(2)} 歲了`;
//"我的寵物狗叫黑子,今年 16.00 歲了"

function fn() {
  return "小黃";
}
`我朋友家的寵物叫${fn()}`
//"我朋友家的寵物叫小黃"

4.帶標簽的模板字符串

要用 ES6 模板實現(xiàn)復(fù)雜一點的字符串處理邏輯,要依賴寫函數(shù)來實現(xiàn)。

幸運的是,除了在模板的插值表達式里想辦法調(diào)用各種字符串轉(zhuǎn)換的函數(shù)之外,ES6 還提供了更加優(yōu)雅且更

容易復(fù)用的方案——帶標簽的模板字面量(tagged template literals,以下簡稱標簽?zāi)0澹?/p>

標簽?zāi)0宓恼Z法很簡單,就是在模板字符串的起始反撇號前加上一個標簽。

let message = tag`黑子`;

在上面的代碼中,tag就是模板標簽。tag其實是一個函數(shù),這個函數(shù)會被調(diào)用來處理這個模板字符串。

4.1 定義標簽

let  name = "黑子",
     age = 8,
     message = tag`我的寵物狗叫${name},今年${age}歲了`;

function tag(stringArr, value1, value2) {
    console.log(stringArr);  //["我的寵物狗叫", ",今年", "歲了", raw: Array(3)]
                             //該數(shù)組有一個raw屬性,保存的是轉(zhuǎn)義后的原字符串
    console.log(value1);     // 黑子
    console.log(value2);     // 8
    return;
}

標簽函數(shù)通常使用不定參數(shù)特性來定義占位符,從而簡化數(shù)據(jù)處理的過程

function tag(stringArr, ...values) {
     console.log(values); // ?["黑子", 8]
}

4.2 實際應(yīng)用


“標簽?zāi)0濉钡囊粋€重要應(yīng)用,就是過濾HTML字符串,防止用戶輸入惡意內(nèi)容

var message =  filterHTML`

${sender} 你好啊

`; function filterHTML(templateData) { var s = templateData[0]; for (var i = 1; i < arguments.length; i++) { var arg = String(arguments[i]); // 轉(zhuǎn)義占位符中的特殊字符。 s += arg.replace(/&/g, "&") .replace(//g, ">"); // 不轉(zhuǎn)義模板中的特殊字符。 s += templateData[i]; } return s; }

上面代碼中,sender變量往往是用戶提供的,經(jīng)過filterHTML函數(shù)處理,里面的特殊字符都會被轉(zhuǎn)義。

var sender = ""; // 惡意代碼
var message = filterHTML`

${sender} 你好啊

`; console.log(message); //

你好啊

即使一個惡意命名的用戶,例如黑客向其他用戶發(fā)送一條騷擾信息,無論如何這條信息都會被轉(zhuǎn)義為普通字符串,

其他用戶不會受到潛在攻擊的威脅。

標簽?zāi)0宓牧硪粋€應(yīng)用,就是多語言轉(zhuǎn)換(國際化處理)

let name = "ES6專欄 ";  let  number = 666;  
let chinese = ["歡迎訪問","您是第","位訪問者"];

i18n`Welcome to ${name}, you are the ${number}  visitor`;  

function i18n(stringArr, ...values){
    let str="";  
    stringArr.map((item,index)=>{
        str += (chinese[index] +  (values[index] ? values[index] : "" ))   
    });
    console.log(str) 
}
//歡迎訂閱ES6專欄 您是第666位訪問者

5.新增的字符串方法

5.1 查找字符串

在以前在字符串中查找字符串的時候,都是使用indexOf方法。

ES6新增了三個方法來查找字符串 :

includes 方法會在給定文本存在于字符串中的任意位置時返回 true,否則返回 false 。

startsWith 方法會在給定文本出現(xiàn)在字符串開頭時返回 true,否則返回 false 。

endsWith 方法會在給定文本出現(xiàn)在字符串末尾時返回 true,否則返回 false 。

var msg = "Hello world!";

console.log(msg.startsWith("Hello"));       // true
console.log(msg.endsWith("!"));             // true
console.log(msg.includes("d"));             // true

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

每個方法都接收兩個參數(shù):需要搜索的文本和可選的起始索引值。

若第二個參數(shù)未提供,includes 和 startsWith 會從字符串的起始中開始檢索,endsWith 則是從字符串的末尾。

實際上,第二個參數(shù)減少了需要檢索的字符串的總量。

當提供第二個參數(shù)后,includes 和 startsWith 會以該索引為起始點進行匹配

console.log(msg.includes("d", 8));          // true
console.log(msg.includes("d", 11));         // false
console.log(msg.startsWith("d", 10));       // true
console.log(msg.startsWith("d", 9));        // false

endsWith 將字符串的長度與參數(shù)值相減并將得到的值作為檢索的起始點

console.log(msg.endsWith("d", 11));         // true ( 長度13 - 參數(shù)值11 = 起始點2 )
console.log(msg.endsWith("d", 8));          // false ( 長度13 - 參數(shù)值8 = 起始點5 )

應(yīng)用場景:

(1)利用includes檢查用戶使用的瀏覽器

if (navigator.userAgent.includes("Chrome")) {
     console.log("是谷歌瀏覽器");
} else {
      console.log("不是谷歌瀏覽器");
}

(2)利用startsWith檢查路徑

let urlstr = "http://www.baidu.com";
let urlstr1 = "file:///C:/Users/xxx.html";
console.log(urlstr.startsWith("https://"));    //false
console.log(urlstr1.startsWith("file://"))     //true

(3)利用startsWith檢查文件格式

let path = "111.jpg";
console.log(path.endsWith(".png"));   //false

5.2 字符串重復(fù) -- repeat方法

接受一個數(shù)字參數(shù)作為字符串的重復(fù)次數(shù)。該方法返回一個重復(fù)包含初始字符串的新字符串,重復(fù)次數(shù)等于參數(shù)。

例如:

console.log("abc".repeat(4));       // "abcabcabcabc"
let str = "小樣兒";
console.log(str.repeat(10));     //小樣兒小樣兒小樣兒小樣兒小樣兒小樣兒小樣兒小樣兒小樣兒小樣兒

5.3 填充字符串

string.padStart 往字符串前面填充(在字符串前面插入字符串)

string.padEnd 往字符串后面填充(在字符串后面插入字符串)

let str = "Iphone";
let leftStr = "我的";
console.log(str.padStart(str.length + leftStr.length, leftStr));//我的Iphone

let iphone = "Iphone";    
let rightStr = "10";    
console.log(iphone.padEnd(iphone.length + rightStr.length, rightStr));    //Iphone10

6.總結(jié)

ES6給字符串帶來了很多實用性的擴展:

模板字符串、標簽?zāi)0?、repeat函數(shù)、includes函數(shù)、startsWith函數(shù)、endsWith函數(shù)、padStart函數(shù)、padEnd

函數(shù)。

字符串模版的出現(xiàn)讓我們再也不用拼接變量了,而且支持在模板里有簡單計算操作。

希望大家能動手練習(xí)一下,并把這些新特性應(yīng)用到工作中,很快就掌握了,用起來能讓大家的工作更輕松,愉悅。

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

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

相關(guān)文章

  • 珠峰培訓(xùn)ES6學(xué)習(xí)筆記1

    摘要:消除字符串頭部空格消除尾部空格從頭部補全字符串從尾部補全字符串 let和const var關(guān)鍵字定義變量的特點: 可以重復(fù)定義 不能定義常量 不支持塊級作用域 let的特點 不可以重復(fù)定義 變量不能提升,在變量定義之前,不能使用 在大括號當中定義的變量(塊級作用域中),在作用域外無法訪問 解決一些ES5當中需要閉包實現(xiàn)的功能,比如:每隔1秒循環(huán)輸出一個當前的值 const的特點...

    番茄西紅柿 評論0 收藏0
  • Web前端模板引擎符串模板

    摘要:這是一個系列文章,將會介紹目前前端領(lǐng)域里用到的三種模板引擎技術(shù),它們分別是基于字符串的模板基于操作的模板基于虛擬的模板本文是這個系列的第一篇,著重介紹基于字符串的模板引擎的實現(xiàn)原理,分析它的優(yōu)點缺點以及使用的場景。 這是一個系列文章,將會介紹目前Web前端領(lǐng)域里用到的三種模板引擎技術(shù),它們分別是: 基于字符串的模板 基于Dom操作的模板 基于虛擬Dom的模板 本文是這個系列的第一篇...

    Pluser 評論0 收藏0
  • koa 實現(xiàn) react-view 原理

    摘要:今天,其實講的是在實現(xiàn)同構(gòu)過程中看到過,可能非常容易被忽視更小的一個點。每一個架構(gòu)的框架都會涉及到層的展現(xiàn),也不例外。這種說法即對也不對。總結(jié)其實,實現(xiàn)非常簡單,我們也從一些維度看到了設(shè)計一個的一般方法。 在之前我們有過一篇『React 同構(gòu)實踐與思考』的專欄文章,給讀者實踐了用 React 怎么實現(xiàn)同構(gòu)。今天,其實講的是在實現(xiàn)同構(gòu)過程中看到過,可能非常容易被忽視更小的一個點 —— R...

    zxhaaa 評論0 收藏0
  • ECMAScript 6不完全教程

    摘要:從到有兩種新的方式來聲明變量用于聲明塊級作用于變量用于聲明常量,其值不能被改變。更多信息箭頭函數(shù)處理多個返回值一些函數(shù)或方法能通過數(shù)組或?qū)ο蠓祷囟鄠€值。在中,總是需要創(chuàng)建中間變量來訪問返回值。內(nèi)置了模塊語法,但并沒有得到引擎良好支持。 1. 嘗試ES6 這里有三種簡單地方式用于ES6編程: Web瀏覽器:使用Babel REPL,可以將ES6編譯成ES5的平臺,并且并不需要安裝。 命...

    姘存按 評論0 收藏0

發(fā)表評論

0條評論

cnio

|高級講師

TA的文章

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