2024-12-23 日报 Day44

2024-12-23 日报 Day44

Yuyang 前端小白🥬

今日的鸡汤

每当事情推进一步,你的迷茫就会减少一分。

今日学习内容

1、JS红皮书P125-127 第五章:基本引用类型

今日笔记

1、字符串模式匹配方法:

  • match():这个方法本质上跟 RegExp 对象的 exec()方法相同。match()方法接收一个参数,可以是一个正则表达式字符串,也可以是一个 RegExp 对象。
    1
    2
    3
    4
    5
    6
    7
    let text = "cat, bat, sat, fat"; 
    let pattern = /.at/;
    // 等价于 pattern.exec(text)
    let matches = text.match(pattern);
    console.log(matches.index); // 0
    console.log(matches[0]); // "cat"
    console.log(pattern.lastIndex); // 0
    match()方法返回的数组与 RegExp 对象的 exec()方法返回的数组是一样的:第一个元素是与整个模式匹配的字符串,其余元素则是与表达式中的捕获组匹配的字符串(如果有的话)。
    另一个查找模式的字符串方法是 search()。这个方法唯一的参数与 match()方法一样:正则表达式字符串或 RegExp 对象。这个方法返回模式第一个匹配的位置索引,如果没找到则返回1。search()始终从字符串开头向后匹配模式。看下面的例子:
    1
    2
    3
    let text = "cat, bat, sat, fat"; 
    let pos = text.search(/at/);
    console.log(pos); // 1
    为简化子字符串替换操作,ECMAScript 提供了 replace()方法。这个方法接收两个参数,第一个参数可以是一个 RegExp 对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,第一个参数必须为正则表达式并且带全局标记,如下面的例子所示:
    1
    2
    3
    4
    5
    let text = "cat, bat, sat, fat"; 
    let result = text.replace("at", "ond");
    console.log(result); // "cond, bat, sat, fat"
    result = text.replace(/at/g, "ond");
    console.log(result); // "cond, bond, sond, fond"
    第二个参数是字符串的情况下,有几个特殊的字符序列,可以用来插入正则表达式操作的值。
  • $&:与正则表达式相匹配的子字符串。
  • $`:位于匹配子字符串左侧的文本。
  • $’:位于匹配子字符串右侧的文本。
  • $n:匹配第 n 个捕获组的文本(如果有的话)。
  • $nn:匹配第 nn 个捕获组的文本(如果有的话)。
    1
    2
    3
    let text = "cat, bat, sat, fat"; 
    result = text.replace(/(.at)/g, "word ($1)");
    console.log(result); // word (cat), word (bat), word (sat), word (fat)
    replace()的第二个参数可以是一个函数。在只有一个匹配项时,这个函数会收到 3 个参数:与整个模式匹配的字符串、匹配项在字符串中的开始位置,以及整个字符串。在有多个捕获组的情况下,每个匹配捕获组的字符串也会作为参数传给这个函数,但最后两个参数还是与整个模式匹配的开始位置和原始字符串。这个函数应该返回一个字符串,表示应该把匹配项替换成什么。使用函数作为第二个参数可以更细致地控制替换过程,如下所示:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function htmlEscape(text) { 
    return text.replace(/[<>"&]/g, function(match, pos, originalText) {
    switch(match) {
    case "<":
    return "&lt;";
    case ">":
    return "&gt;";
    case "&":
    return "&amp;";
    case "\"":
    return "&quot;";
    }
    });
    }
    console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>"));
    // "&lt;p class=&quot;greeting&quot;&gt;Hello world!</p>"
  • split(): 这个方法会根据传入的分隔符将字符串拆分成数组。作为分隔符的参数可以是字符串,也可以是 RegExp 对象。(字符串分隔符不会被这个方法当成正则表达式。)还可以传入第二个参数,即数组大小,确保返回的数组不会超过指定大小。来看下面的例子:
    1
    2
    3
    4
    let colorText = "red,blue,green,yellow"; 
    let colors1 = colorText.split(","); // ["red", "blue", "green", "yellow"]
    let colors2 = colorText.split(",", 2); // ["red", "blue"]
    let colors3 = colorText.split(/[^,]+/); // ["", ",", ",", ",", ""]
    在这里,字符串 colorText 是一个逗号分隔的颜色名称符串。调用 split(“,”)会得到包含这些颜色名的数组,基于逗号进行拆分。要把数组元素限制为 2 个,传入第二个参数 2 即可。最后,使用正则表达式可以得到一个包含逗号的数组。注意在最后一次调用 split()时,返回的数组前后包含两个空字符串。这是因为正则表达式指定的分隔符出现在了字符串开头(”red”)和末尾(”yellow”)。
  • localeCompare(): 这个方法比较两个字符串,并返回下列值中的一个:
     如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。(通常是-1,具体还要看与实际值相关的实现。)
     如果字符串与字符串参数相等,则返回 0。
     如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。(通常是 1,具体还要看与实际值相关的实现。)
    1
    2
    3
    4
    let stringValue = "yellow"; 
    console.log(stringValue.localeCompare("brick")); // 1
    console.log(stringValue.localeCompare("yellow")); // 0
    console.log(stringValue.localeCompare("zoo")); // -1
    在这里,字符串”yellow”与 3 个不同的值进行了比较:”brick”、”yellow”和”zoo”。”brick”按字母表顺序应该排在”yellow”前头,因此 localeCompare()返回 1。”yellow”等于”yellow”,因此”localeCompare()”返回 0。最后,”zoo”在”yellow”后面,因此 localeCompare()返回-1。强调一下,因为返回的具体值可能因具体实现而异,所以最好像下面的示例中一样使用 localeCompare():
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function determineOrder(value) { 
    let result = stringValue.localeCompare(value);
    if (result < 0) {
    console.log(`The string 'yellow' comes before the string '${value}'.`);
    } else if (result > 0) {
    console.log(`The string 'yellow' comes after the string '${value}'.`);
    } else {
    console.log(`The string 'yellow' is equal to the string '${value}'.`);
    }
    }
    determineOrder("brick");
    determineOrder("yellow");
    determineOrder("zoo");
    localeCompare()的独特之处在于,实现所在的地区(国家和语言)决定了这个方法如何比较字符串。在美国,英语是 ECMAScript 实现的标准语言,localeCompare()区分大小写,大写字母排在小写字母前面。但其他地区未必是这种情况。
此页目录
2024-12-23 日报 Day44