国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6 系列之模板字符串

Travis / 2867人閱讀

摘要:最終的代碼如下第二版假設有這樣一段為了保持可讀性,我希望最終輸入的樣式為其實就是匹配每行前面的空格,然后將其替換為空字符串。

基礎用法
let message = `Hello World`;
console.log(message);

如果你碰巧要在字符串中使用反撇號,你可以使用反斜杠轉義:

let message = `Hello ` World`;
console.log(message);

值得一提的是,在模板字符串中,空格、縮進、換行都會被保留:

let message = `
    
  • 1
  • 2
`; console.log(message);

注意,打印的結果中第一行是一個換行,你可以使用 trim 函數消除換行:

let message = `
    
  • 1
  • 2
`.trim(); console.log(message);

嵌入變量

模板字符串支持嵌入變量,只需要將變量名寫在 ${} 之中,其實不止變量,任意的 JavaScript 表達式都是可以的:

let x = 1, y = 2;
let message = `
  • ${x}
  • ${x + y}
`; console.log(message); //
  • 1
  • 3

值得一提的是,模板字符串支持嵌套:

let arr = [{value: 1}, {value: 2}];
let message = `
    
    ${arr.map((item) => { return `
  • ${item.value}
  • ` })}
`; console.log(message);

打印結果如下:

注意,在 li 標簽中間多了一個逗號,這是因為當大括號中的值不是字符串時,會將其轉為字符串,比如一個數組 [1, 2, 3] 就會被轉為 1,2,3,逗號就是這樣產生的。

如果你要消除這個逗號,你可以先 join 一下:

let arr = [{value: 1}, {value: 2}];
let message = `
    
    ${arr.map((item) => { return `
  • ${item.value}
  • ` }).join("")}
`; console.log(message);

打印結果如下:

標簽模板

模板標簽是一個非常重要的能力,模板字符串可以緊跟在一個函數名后面,該函數將被調用來處理這個模板字符串,舉個例子:

let x = "Hi", y = "Kevin";
var res = message`${x}, I am ${y}`;
console.log(res);

我們可以自定義 message 函數來處理返回的字符串:

// literals 文字
// 注意在這個例子中 literals 的第一個元素和最后一個元素都是空字符串
function message(literals, value1, value2) {
    console.log(literals); // [ "", ", I am ", "" ]
    console.log(value1); // Hi
    console.log(value2); // Kevin
}

我們利用這些參數將其拼合回去:

function message(literals, ...values) {
    let result = "";

    for (let i = 0; i < values.length; i++) {
        result += literals[i];
        result += values[i];
    }

    result += literals[literals.length - 1];

    return result;
}

你也可以這樣寫:

function message(literals, ...values) {
    let result = literals.reduce((prev, next, i) => {
        let value = values[i - 1];
        return prev + value + next;
    });

    return result;
}

學著拼合回去是一件非常重要的事情,因為我們經過各種處理,最終都還是要拼回去的……

oneLine

講完了基礎,我們可以來看一些實際的需求:

let message = `
    Hi,
    Daisy!
    I am
    Kevin.
`;

出于可讀性或者其他原因,我希望書寫的時候是換行的,但是最終輸出的字符是在一行,這就需要借助模板標簽來實現了,我們嘗試寫一個這樣的函數:

// oneLine 第一版
function oneLine(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {
        let expression = expressions[i - 1];
        return prev + expression + next;
    });

    result = result.replace(/(s+)/g, " ");
    result = result.trim();

    return result;
}

實現原理很簡單,拼合回去然后將多個空白符如換行符、空格等替換成一個空格。

使用如下:

let message = oneLine `
    Hi,
    Daisy!
    I am
    Kevin.
`;
console.log(message); // Hi, Daisy! I am Kevin.

不過你再用下去就會發現一個問題,如果字符間就包括多個空格呢?舉個例子:

let message = oneLine`
  Preserve eg sentences.  Double
  spaces within input lines.
`;

如果使用這種匹配方式,sentences.Double 之間的兩個空格也會被替換成一個空格。

我們可以再優化一下,我們想要的效果是將每行前面的多個空格替換成一個空格,其實應該匹配的是換行符以及換行符后面的多個空格,然后將其替換成一個空格,我們可以將正則改成:

result = result.replace(/(
s*)/g, " ");

就可以正確的匹配代碼。最終的代碼如下:

// oneLine 第二版
function oneLine(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {
        let expression = expressions[i - 1];
        return prev + expression + next;
    });

    result = result.replace(/(
s*)/g, " ");
    result = result.trim();

    return result;
}
stripIndents

假設有這樣一段 HTML:

let html = `
    1
    2
        3
`;

為了保持可讀性,我希望最終輸入的樣式為:

1
2
3

其實就是匹配每行前面的空格,然后將其替換為空字符串。

// stripIndents 第一版
function stripIndents(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {
        let expression = expressions[i - 1];
        return prev + expression + next;
    });


    result = result.replace(/
[^S
]*/g, "
");
    result = result.trim();

    return result;
}

最難的或許就是這個正則表達式了:

result = result.replace(/
[^S
]*/g, "
");

S 表示匹配一個非空白字符

[^S ] 表示匹配非空白字符換行符之外的字符,其實也就是空白字符去除換行符

[^S ]* 表示匹配換行符以及換行符后的多個不包含換行符的空白字符

replace(/ [^S ]*/g, " ") 表示將一個換行符以及換行符后的多個不包含換行符的空白字符替換成一個換行符,其實也就是將換行符后面的空白字符消掉的意思

其實吧,不用寫的這么麻煩,我們還可以這樣寫:

result = result.replace(/^[^S
]+/gm, "");

看似簡單了一點,之所以能這樣寫,是因為匹配模式的緣故,你會發現,這次除了匹配全局之外,這次我們還匹配了多行,m 標志用于指定多行輸入字符串時應該被視為多個行,而且如果使用 m 標志,^ 和 $ 匹配的開始或結束是輸入字符串中的每一行,而不是整個字符串的開始或結束。

1 表示匹配空白字符去除換行符

^2+ 表示匹配以去除換行符的空白字符為開頭的一個或者多個字符

result.replace(/^3+/gm, "") 表示將每行開頭一個或多個去除換行符的空白字符替換成空字符串,也同樣達到了目的。

最終的代碼如下:

// stripIndents 第二版
function stripIndents(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {
        let expression = expressions[i - 1];
        return prev + expression + next;
    });


    result = result.replace(/^[^S
]+/gm, "");
    result = result.trim();

    return result;
}
stripIndent

注意,這次的 stripIndent 相比上面一節的標題少了一個字母 s,而我們想要實現的功能是:

let html = `
    
  • 1
  • 2
  • 3
    • `;

其實也就是去除第一行的換行以及每一行的部分縮進。

這個實現就稍微麻煩了一點,因為我們要計算出每一行到底要去除多少個空白字符。

實現的思路如下:

使用 match 函數,匹配每一行的空白字符,得到一個包含每一行空白字符的數組

數組遍歷比較,得到最小的空白字符長度

構建一個正則表達式,然后每一行都替換掉最小長度的空白字符

實現的代碼如下:

let html = `
    
  • 1
  • 2
  • 3
    • `; function stripIndent(template, ...expressions) { let result = template.reduce((prev, next, i) => { let expression = expressions[i - 1]; return prev + expression + next; }); const match = result.match(/^[^S ]*(?=S)/gm); console.log(match); // Array [ " ", " ", " ", " ", " " ] const indent = match && Math.min(...match.map(el => el.length)); console.log(indent); // 4 if (indent) { const regexp = new RegExp(`^.{${indent}}`, "gm"); console.log(regexp); // /^.{4}/gm result = result.replace(regexp, ""); } result = result.trim(); return result; }

值得一提的是,我們一般會以為正則中 . 表示匹配任意字符,其實是匹配除換行符之外的任何單個字符。

最終精簡的代碼如下:

function stripIndent(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {
        let expression = expressions[i - 1];
        return prev + expression + next;
    });

    const match = result.match(/^[^S
]*(?=S)/gm);
    const indent = match && Math.min(...match.map(el => el.length));

    if (indent) {
        const regexp = new RegExp(`^.{${indent}}`, "gm");
        result =  result.replace(regexp, "");
    }

    result = result.trim();

    return result;
}
includeArrays

前面我們講到為了避免 ${} 表達式中返回一個數組,自動轉換會導致多個逗號的問題,需要每次都將數組最后再 join("") 一下,再看一遍例子:

let arr = [{value: 1}, {value: 2}];
let message = `
    
    ${arr.map((item) => { return `
  • ${item.value}
  • ` }).join("")}
`; console.log(message);

利用標簽模板,我們可以輕松的解決這個問題:

function includeArrays(template, ...expressions) {
    let result = template.reduce((prev, next, i) => {

        let expression = expressions[i - 1];

        if (Array.isArray(expression)) {
            expression = expression.join("");
        }

        return prev + expression + next;
    });

    result = result.trim();

    return result;
}
最后

你會發現以上這些函數拼合的部分都是重復的,我們完全可以將其封裝在一起,根據不同的配置實現不能的功能。如果你想在項目中使用這些函數,可以自己封裝一個或者直接使用 common-tags。

ES6 系列

ES6 系列目錄地址:https://github.com/mqyqingfen...。

ES6 系列預計寫二十篇左右,旨在加深 ES6 部分知識點的理解,重點講解塊級作用域、標簽模板、箭頭函數、Symbol、Set、Map 以及 Promise 的模擬實現、模塊加載方案、異步處理等內容。

如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。如果喜歡或者有所啟發,歡迎star,對作者也是一種鼓勵。

  • Sn ?

  • Sn ?

  • Sn ?

  • 文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

    轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107826.html

    相關文章

    • ES6 完全使用手冊

      摘要:前言這里的泛指之后的新語法這里的完全是指本文會不斷更新這里的使用是指本文會展示很多的使用場景這里的手冊是指你可以參照本文將項目更多的重構為語法此外還要注意這里不一定就是正式進入規范的語法。 前言 這里的 ES6 泛指 ES5 之后的新語法 這里的 完全 是指本文會不斷更新 這里的 使用 是指本文會展示很多 ES6 的使用場景 這里的 手冊 是指你可以參照本文將項目更多的重構為 ES6...

      kgbook 評論0 收藏0
    • underscore 的源碼該如何閱讀?

      摘要:所以它與其他系列的文章并不沖突,完全可以在閱讀完這個系列后,再跟著其他系列的文章接著學習。如何閱讀我在寫系列的時候,被問的最多的問題就是該怎么閱讀源碼我想簡單聊一下自己的思路。感謝大家的閱讀和支持,我是冴羽,下個系列再見啦 前言 別名:《underscore 系列 8 篇正式完結!》 介紹 underscore 系列是我寫的第三個系列,前兩個系列分別是 JavaScript 深入系列、...

      weknow619 評論0 收藏0
    • ES6系列文章 模板符串

      摘要:為我們提供了模板字符串,語法使用反引號。模板字符串具有以下三個優點多行文本字符串中插入變量字符串中插入表達式基本語法模板字符串和的字符串的聲明一樣。總結模板字符串就是這么的簡單這么的好用。 ES6為我們提供了模板字符串,語法使用反引號`。模板字符串具有以下三個優點: 多行文本 字符串中插入變量 字符串中插入表達式 基本語法 模板字符串和 ES5的字符串的聲明一樣。 // ES5 v...

      woshicixide 評論0 收藏0
    • ES6 Features系列:Template Strings & Tagged Templ

      摘要:由兩部分組成模板起始符,稱為沉音符反引號,其內容被識別為字符串模板。其實這是通過屬性操作中的結果,也就是說屬性將對控制符進行轉義從而實現按照普通字符輸出。的語法是緊跟在后面,兩者間不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份發布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過Node.js 0.12和io....

      MyFaith 評論0 收藏0
    • ES6語法符串的擴展

      摘要:模板字符串連接符在之前,將字符串連接到一起的舊方法是使用字符串連接運算符。這樣更容易構建字符串。返回布爾值,表示參數字符串是否在原字符串的頭部。它針對前個字符,而其他兩個方法針對從第個位置直到字符串結束。 模板字符串 + 連接符 在 ES6 之前,將字符串連接到一起的舊方法是使用字符串連接運算符 (+)。 const student = { name: Richard Kaleho...

      孫淑建 評論0 收藏0

    發表評論

    0條評論

    Travis

    |高級講師

    TA的文章

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