天行健, 君子以自强不息
Sunny's Blog
Title

ES6 Demos(二) Strings and Regular Expressions(字符串与正则表达式)

Demo1: 更好的 Unicode 支持

这块用到很少,简单说明: 在 ES6 之前, JS 的字符串以 16 位字符编码( UCS-2 )为基础,然而由于Unicode 引入了扩展字符集,这就不再够用了。

ES5原有的匹配string的方法不够用了,所以进行了几个方法的扩展。由此,ES6 为全面支持 UTF-16新增了一些方法,具体有:

                //codePointAt()/String.fromCodePoint() 这两个是一对,是字符于代码点的互换
                let text = '𠮷';
                console.log(text.codePointAt(0)); // 134071
                console.log(String.fromCodePoint(134071)); //𠮷

                //normalize()

                //ES6 为正则表达式定义了用于处理Unicode 的 u 标志
                console.log(text.length); // 2
                console.log(/^.$/.test(text)); // false
                console.log(/^.$/u.test(text)); // true
            

Demo2: 字符串的其他改动

1.includes() 方法,在给定文本存在于字符串中的任意位置时会返回 true ,否则返回 false

2.startsWith() 方法,在给定文本出现在字符串起始处时返回 true ,否则返回 false

3.endsWith() 方法,在给定文本出现在字符串结尾处时返回 true ,否则返回 false

每个方法都接受两个参数:需要搜索的文本,以及可选的搜索起始位置索引

                var 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
                console.log(msg.endsWith("o", 8)); // true, 8-1(o的length)=7,从7开始往前
                console.log(msg.includes("o", 8)); // false

                //ES5
                console.log( msg.indexOf('orl') !== -1 ) //true
                //ES6
                console.log( msg.includes('orl') ) //true
            

4.repeat() 方法, 它接受一个参数作为字符串的重复次数

                console.log("x".repeat(3)); // "xxx"
                console.log("hello".repeat(2)); // "hellohello"
                console.log("abc".repeat(4)); // "abcabcabcabc"
            

Demo3: 正则表达式的其他改动

1.正则表达式 y 标志, 不常用暂时忽略

2.复制正则表达式

                var re1 = /ab/i,
                // ES5 中会抛出错误, ES6 中可用
                re2 = new RegExp(re1, "g");
                console.log(re1.toString()); // "/ab/i"
                console.log(re2.toString()); // "/ab/g"
            

3.flags属性

                var re = /ab/g;
                console.log(re.source); // "ab"
                console.log(re.flags); // "g"
            

Demo4: 模板字面量(template literal)

ES6的模板字面量( template literal )提供了创建领域专用语言( domain-specific language ,DSL )的语法

                //1.模板字面量的最简单语法,是使用反引号( ` )来包裹普通字符串
                let message1 = `Hello world!`;
                console.log(message1) // Hello world!
                //若你想在字符串中包含反引号,只需使用反斜杠( \ )转义即可
                let message2 = `\`Hello\` world!`;
                console.log(message2) // `Hello` world!
                //2.多行字符串
                let message3 = `Multiline
                string`;
                console.log(message3) 
                // Multiline
                // string

                //反引号之内的所有空白符都是字符串的一部分,因此需要留意缩进
                let message4 = `Multiline
                                string`;
                console.log(message4)
                // Multiline
                //                  string

                //HTML 标签的缩进增强了可读性,之后再调用 trim() 方法移除了起始的空行
                let html = `
                <div>
                    <h1>Title</h1>
                </div>`.trim();
                console.log(html)

                //3.制造替换位,加变量
                //替换位由起始的 ${ 与结束的 } 来界定,之间允许放入任意的 JS 表达式

                //简单变量
                let name = "Nicholas",
                message5 = `Hello, ${name}.`;
                console.log(message5); // "Hello, Nicholas."
                //变量计算
                let count = 10,
                price = 0.25,
                message6 = `${count} items cost $${(count * price).toFixed(2)}.`;
                console.log(message6); // "10 items cost $2.50."
                //模板嵌套
                let name2 = "Nicholas",
                message7 = `Hello, ${
                `my name is ${ name2 }`
                }.`;
                console.log(message7); // "Hello, my name is Nicholas."
            

Demo5: 标签化模板

标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。

                let count4 = 10,
                price4 = 0.25,
                message = passthru`${count4} items cost $${(count4 * price4).toFixed(2)}.`;

                function passthru(literals, ...substitutions) {
                    // 仅使用 substitution 的元素数量来进行循环
                    for (let i = 0; i < substitutions.length; i++) {
                        console.log(literals[i]);
                        console.log(substitutions[i]);
                    }
                    console.log(literals[literals.length - 1]);
                }
                //results:
                // ''
                // 10
                // items cost $
                // 2.50
                // .

                //用途1: 可以过滤 HTML 字符串,防止用户输入恶意内容

                function SaferHTML(literals, ...substitutions) {
                    let result = "";
                    // 仅使用 substitution 的元素数量来进行循环
                    for (let i = 0; i < substitutions.length; i++) {
                        result += literals[i];
                        result += substitutions[i].replace(/&/g, "&").replace(//g, ">");
                    }
                    // 添加最后一个字面量
                    result += literals[literals.length - 1];
                    return result;
                }
                let test1 = `<script>alert("abc")</script>`;
                let results1 = SaferHTML`<p>${test1} this is bad.</p>`;

                console.log(results1);

                //用途2: i18n国际化
                function i18n(literals, ...substitutions){
                    let result = "";
                    let CN = ['欢迎', '您的号码是'];

                    // 仅使用 substitution 的元素数量来进行循环
                    for (let i = 0; i < substitutions.length; i++) {
                        result += literals[i].replace(literals[i], CN[i] );
                        result += substitutions[i];
                    }
                    // 添加最后一个字面量
                    result += literals[literals.length - 1];
                    return result;
                }
                let userName = `Sheldon`, userNumber = 10001;
                let results2 = i18n`Welcome to ${userName}, your number is ${userNumber}!`;
                console.log(results2);
                //欢迎Sheldon您的号码是10001!
            
地势坤,君子以厚德载物