ES6之字符串学习

以下是常用的方法不是全部方法

1.codePointAt()方法

有一些字段需要4个字节储存,这样charCodeAt方法的返回就是不正确的,用codePointAt()方法就可以返回

十进制的值。如果要十六进制的值,可以使用toString方法转换

var s = ‘??a‘;

s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"

2.String.fromCodePoint()

有一些字段需要4个字节储存,这样fromCharCode( 可接受一个指定的 Unicode 值,然后返回一个字符串) 方法

不能正确返回。fromCodePoint弥补它的不足

String.fromCodePoint(0x20BB7)
// "??"
String.fromCodePoint(0x78, 0x1f680, 0x79) === ‘x\uD83D\uDE80y‘
// true

fromCodePointcodePointAt方法相反

3.字符串的遍历器接口

字符串可以被for...of循环遍历。

var text = String.fromCodePoint(0x20BB7);

for (let i = 0; i < text.length; i++) {
  console.log(text[i]);
}
// " "
// " "

for (let i of text) {
  console.log(i);
}
// "??"

4.at()(对原来的charAt()方法的弥补)

charAt()方法是返回在指定位置的字符。该方法不能识别码点大于0xFFFF的字符。

‘abc‘.charAt(0) // "a"
‘??‘.charAt(0) // "\uD842"

5.includes(),startsWith(),endsWith()

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。

6.repeat()

repeat方法返回一个新字符串,表示将原字符串重复n次。

‘x‘.repeat(3) // "xxx"
‘hello‘.repeat(2) // "hellohello"
‘na‘.repeat(0) // ""

参数如果是小数,会被取整。

‘na‘.repeat(2.9) // "nana"

如果repeat的参数是负数或者Infinity,会报错。

‘na‘.repeat(Infinity)
// RangeError
‘na‘.repeat(-1)
// RangeError

但是,如果参数是0到-1之间的小数,则等同于0,这是因为会先进行取整运算。

0到-1之间的小数,取整以后等于-0repeat视同为0。

‘na‘.repeat(-0.9) // ""

参数NaN等同于0。

‘na‘.repeat(NaN) // ""

如果repeat的参数是字符串,则会先转换成数字。

‘na‘.repeat(‘na‘) // ""
‘na‘.repeat(‘3‘) // "nanana"

7.padStart(),padEnd()

某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,

padEnd()用于尾部补全

‘x‘.padStart(5, ‘ab‘) // ‘ababx‘
‘x‘.padStart(4, ‘ab‘) // ‘abax‘

‘x‘.padEnd(5, ‘ab‘) // ‘xabab‘
‘x‘.padEnd(4, ‘ab‘) // ‘xaba‘

如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。

如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,

则会截去超出位数的补全字符串。

‘abc‘.padStart(10, ‘0123456789‘)
// ‘0123456abc‘

如果省略第二个参数,默认使用空格补全长度。

padStart的常见用途是为数值补全指定位数。下面代码生成10位的数值字符串。

‘1‘.padStart(10, ‘0‘) // "0000000001"
‘12‘.padStart(10, ‘0‘) // "0000000012"
‘123456‘.padStart(10, ‘0‘) // "0000123456"

另一个用途是提示字符串格式。

‘12‘.padStart(10, ‘YYYY-MM-DD‘) // "YYYY-MM-12"
‘09-12‘.padStart(10, ‘YYYY-MM-DD‘) // "YYYY-09-12"

8.模板字符串

传统的JavaScript语言,输出模板通常是这样写的。

$(‘#result‘).append(
  ‘There are <b>‘ + basket.count + ‘</b> ‘ +
  ‘items in your basket, ‘ +
  ‘<em>‘ + basket.onSale +
  ‘</em> are on sale!‘
);

上面这种写法相当繁琐不方便,ES6引入了模板字符串解决这个问题。

$(‘#result‘).append(`
  There are <b>${basket.count}</b> items
   in your basket, <em>${basket.onSale}</em>
  are on sale!
`);

模板字符串(template string)是增强版的字符串,用反引号(`)标识。

它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串

中嵌入变量。

// 普通字符串
`In JavaScript ‘\n‘ is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

console.log(`string text line 1
string text line 2`);

// 字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性

var x = 1;
var y = 2;

`${x} + ${y} = ${x + y}`
// "1 + 2 = 3"

`${x} + ${y * 2} = ${x + y * 2}`
// "1 + 4 = 5"

var obj = {x: 1, y: 2};
`${obj.x + obj.y}`
// 3

模板字符串之中还能调用函数。

function fn() {
  return "Hello World";
}

`foo ${fn()} bar`
// foo Hello World bar

如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个

对象,将默认调用对象的toString方法。

如果模板字符串中的变量没有声明,将报错。

如果需要引用模板字符串本身,在需要时执行,可以像下面这样写。

// 写法一
let str = ‘return ‘ + ‘`Hello ${name}!`‘;
let func = new Function(‘name‘, str);
func(‘Jack‘) // "Hello Jack!"

// 写法二
let str = ‘(name) => `Hello ${name}!`‘;
let func = eval.call(null, str);
func(‘Jack‘) // "Hello Jack!"

9.实例:模板编译

下面,我们来看一个通过模板字符串,生成正式模板的实例。

var template = `
<ul>
  <% for(var i=0; i < data.supplies.length; i++) { %>
    <li><%= data.supplies[i] %></li>
  <% } %>
</ul>
`;

10.标签模板

模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,

该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。

alert`123`
// 等同于
alert(123)

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

但是,如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。

“标签模板”的一个重要应用,就是过滤HTML字符串,防止用户输入恶意内容。

var message =
  SaferHTML`<p>${sender} has sent you a message.</p>`;

function SaferHTML(templateData) {
  var s = templateData[0];
  for (var i = 1; i < arguments.length; i++) {
    var arg = String(arguments[i]);

    // Escape special characters in the substitution.
    s += arg.replace(/&/g, "&amp;")
            .replace(/</g, "&lt;")
            .replace(/>/g, "&gt;");

    // Don‘t escape special characters in the template.
    s += templateData[i];
  }
  return s;
}

模板字符串本身并不能取代Mustache之类的模板库,因为没有条件判断和循环处理功能,

但是通过标签函数,你可以自己添加这些功能。

// 下面的hashTemplate函数
// 是一个自定义的模板处理函数
var libraryHtml = hashTemplate`
  <ul>
    #for book in ${myBooks}
      <li><i>#{book.title}</i> by #{book.author}</li>
    #end
  </ul>
`;

10.String.raw()

String.raw方法,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义

(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。

String.raw`Hi\n${2+3}!`;
// "Hi\\n5!"

String.raw`Hi\u000A!`;
// ‘Hi\\u000A!‘

如果原字符串的斜杠已经转义,那么String.raw不会做任何处理。

引自:http://es6.ruanyifeng.com/#docs/stri ng#String-fromCodePoint

时间: 2024-11-08 09:20:32

ES6之字符串学习的相关文章

网易云课堂程序设计入门--C语言第七周:指针与字符串学习笔记

====================================== 第七周:指针与字符串学习笔记 网易云课堂 程序设计入门–C语言 指针与字符串 学习笔记 ====================================== 7-1指针初步 7-1-1类型大小与取地址运算 sizeof是一个运算符 给出某个变量货类型在内存中所占据的字节数 sizeof(int); sizeif(i); double变量在内存中占据的空间是int变量的两倍 { int a; a =6; prin

字符串学习总结

字符串前加r:表示原字符串 字符串前加u:表示Unicode编码 单引号.双引号.三引号(单引号.双引号皆可)...的含义: 在python中字符串可以用单引号括起来,也可以用双引号,这两种方式是等价的. python 三引号的形式用来输入多行文本,也就是说在三引号之间输入的内容将被原样保留,之中的单号和双引号不用转义,其中的不可见字符比如/n和/t都会被保留,这样的好处是你可以替换一些多行的文本. 可参考:http://blog.csdn.net/wanghai__/article/detai

es6从零学习(三):Class的基本用法

es6从零学习(三):Class的基本用法 一:定义一个类 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } 上面代码定义了一个"类",可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象. Point类除了构造方法,还定义了一个toString方

es6从零学习(四):Class的继承

es6从零学习(四):Class的继承 一:继承的方式 1.Class 可以通过extends关键字实现继承 class Point { } class ColorPoint extends Point { constructor(x, y, color) { super(x, y); // 调用父类的constructor(x, y) this.color = color; } toString() { return this.color + ' ' + super.toString(); /

字符串学习笔记

字符串学习笔记 注:本文涉及到的所有变量名均与模板中变量名同步.模板链接 一.Hash 1.双Hash 2.链式Hash 3.树Hash 二.KMP 1.概述 查询字符串 \(t\) 在字符串 \(s\) 中出现过的所有位置.时间复杂度 \(O(len(s)+len(t))\). char *s = "abacaba"; char *t = "aba"; 0 1 2 3 4 5 6 a b a c a b a \(t\) 在 \(s\) 中出现过的位置为0.4. 2

es6之字符串添加的东西

在es6里边对字符串添加了一些东西! 字符串模板(非常友善) 相信大家之前都遇到过万恶的字符串拼接,真是噩梦,不过之后有了字符串模板之后,再也不用担心字符串拼接会乱了... 之前的字符串拼接 let name ='Strive'; let age = 18; let str = '这个人叫'+name+', 年龄是 '+age+'岁'; console.log(str); let str1=`这个人叫${name},年龄是${age}岁`//现在是这样的 //简直不要太方便有没有 其实这样还好吧

ES6 之 字符串扩展

字符串所有的方法,都 不会修改字符串本身(字符串是不可变的),操作完成会 返回一个新的字符串. 将一个值转化为字符串,.toString()方法,但是null和undefined值没有这个方法, 1.字符的Unicode("\uxxxx")表示法 xxxx -- 表示Unicode的码点,但是这种码点在\u0000~\uFFFF之间的字符.超出这个范围额字符,必须用2个双字节的形式表示. 如果直接在\u后面跟上超出范围的值,如\u20BB7,js会理解成\u20BB + 7,由于\u2

ES6 中字符串的扩展

1. 字符的Unicode表示法 JavaScript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点. "\u0061" // 表示小写字母"a" 但是这种表示法只限于码点在 \u0000-\uFFFF 之间的字符,有些字符的 Unicode 编码超出了这个范围,那么就必须使用2个双字节的形式表示. "\uD842\uDFB7" // "??" 注意不是吉祥的"吉"

ES6模板字符串

看了阮老师的ES6入门再加上自己的一些理解整理出的学习笔记 介绍: 样子: `` 反引号,tab上面的那个键,同该符号包裹的字符串能够带来的功能如下: 可以包涵换行 在反引号以内,可以有多个换行,都能够在使用的时候被识别 可以嵌入变量 使用美元符号和大括号包裹变量${对象名.属性名} 可以原生输出  原生输出包含转义字符串的内容String.raw模板字符串 例子: 传统的JavaScript语言,输出模板通常是这样写的,字符串拼接很让人头疼,也很容易出错. $('#result').appen