ECMAScript6(4):字符串类型扩展,附赠课程+题库

本文介绍了ES6中关于字符串处理的新特性,如CodePointAt()和fromCodePoint()的使用,以及如何解决编码问题。还讨论了动态方法的增加,如includes(),startsWith(),endsWith()等,以及模板字符串的改进。文章还提到了字符串长度计算、数组拆分和自定义函数的相关内容。
摘要由CSDN通过智能技术生成

//ES6

“\u{20BB7}” //“?”

“\uD842\uDFB7” === “\u{20BB7}”; //true

“\u01d1” === “\u004f\u030C”; //理论上是一致的, 但 js 返回了 false

//使用 normalize 统一编码来解决这个问题

“\u01d1”.normalize() === “\u004f\u030C”.normalize(); //true

遗憾的是, normalize() 方法只能表示2个 utf-16 字符的合成, 要是3个或以上就只能自己用正则表达式解决了。

至此, 一个字符有了6中表示方法:

//以下结果都是 true

“\x7A” === “z”;

“\u{7A}” === “z”;

“\u007A” === “z”;

“\172” === “z”;

“\z” === “z”;

javascript内部用 utf-16 格式存储字符, 这样仓促的引入 utf-32 的码点会引起许多错误, 所以 ES6 在 String.prototype 上添加了 CodePointAt() 方法替换 charCodeAt(), 用静态方法 String.fromCodePoint() 替换了 String.fromCharCode(), 以解决因编码差异导致的计算错误。

但是, 我们依然要注意到一下错误:

var a=“?a”;

console.log(a.length); //3

console.log(a.charAt(0)); //“\uD842”

console.log(a.split(‘’)); //[“\uD842”, “\uDFB7”, a]

//这些显然不是我们想要的, 我们需要替换使用

console.log(a.codePointLength()); //下面我们可以自己简单写一个 codePointLength() 方法

console.log(a.at(0)); //“?”, ES7 方法, babel中有

console.log(a.toArray()); //下面我们可以自己简单写一个 toArray() 方法

为此, 遍历字符串中的每个字符, 请使用 for…of

var a=“?a”;

for(let alpha of a){

console.log(alpha); //依次输出: ?, a

}

除此之外, ES6 还提供了一些其他的简单方法, 这里简单带过:

//动态方法

s.includes(str, n); //s从下标 n 的字符起是否包含 str 字符串, 返回 Boolean, n 默认为 0

s.startsWith(str, n); //s从下标 n 的字符起是否以 str 开头, 返回 Boolean, n 默认为 0

s.endWith(str, n); //s的前 n 个字符是否以 str 结尾, 返回 Boolean, n 默认为字符串长度

s.repeat(n); //返回将 s 重复 n 次的新字符串, 如果 n 是小数, 会向下取整;如果 n 是 infinity 或小于等于-1 会报错;如果 n 大于-1且小于等于零, 返回空字符串;如果 n 为 NaN, 返回空字符串;其余传输参数遵循隐式类型转换。

s.padStart(minLen, str); //对于小于 minLen 长度的字符串, 在 s 前用 str 重复补充为 len 长度, 返回该新字符串, 否则返回原字符串。str默认为空格

s.padEnd(minLen, str); //对于小于 minLen 长度的字符串, 在 s 后用 str 重复补充为 len 长度, 返回该新字符串, 否则返回原字符串。str默认为空格

自定义函数计算字符串长度和大小, 以及转化为数组:

//计算字符串长度, 方法1

String.prototype.codePointLength = function(){

var result = this.match(/[\s\S]/gu);

return result ? result.length : 0;

};

//计算字符串长度, 方法2

String.prototype.codePointLength2 = function(){

return […this].length;

};

//计算字符大小

String.prototype.size = function(){

var size = 0;

for(let alpha of this){

if(alpha.codePointAt(0) > 0xFFFF){

size+=4;

} else {

size+=2;

}

}

return size;

};

var a=“?a”;

console.log(a.codePointLength()); //2

console.log(a.codePointLength2()); //2

console.log(a.size()); //6

//字符串拆分为数组,方法1

String.prototype.toArray = function(nil){

if(nil === undefined){

return Array.from(this);

}

if(nil.constructor === RegExp || nil.constructor === String){

var reg = new RegExp(nil, “u”);

return this.split(reg);

}

}

//字符串拆分为数组,方法2

String.prototype.toArray2 = function(nil){

if(nil === undefined){

return […this];

}

if(nil.constructor === RegExp || nil.constructor === String){

var reg = new RegExp(nil, “u”);

return this.split(reg);

}

}

var a=“?ds?asaf?saf”;

console.log(a.toArray()); //[“?”, “d”, “s”, “?”, “a”, “s”, “a”, “f”, “?”, “s”, “a”, “f”]

console.log(a.toArray(‘a’)); //[“?ds?”, “s”, “f?s”, “f”]

console.log(a.toArray(‘?’)); //[“”, “ds”, “asaf”, “saf”]

console.log(a.toArray2()); //[“?”, “d”, “s”, “?”, “a”, “s”, “a”, “f”, “?”, “s”, “a”, “f”]

console.log(a.toArray2(‘a’)); //[“?ds?”, “s”, “f?s”, “f”]

console.log(a.toArray2(‘?’)); //[“”, “ds”, “asaf”, “saf”]

模板字符串

ES5 中, 我们写一个多行字符很不方便:

//我们这样写动态字符串

var multiStr = "I am " + name; //假定 name 已定义

//这样写多行字符串

var multiStr = “first line\nsecond line\nthird line”;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后更多分享:前端字节跳动真题解析

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-wChWYkVy-1710592881880)]

最后更多分享:前端字节跳动真题解析

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • [外链图片转存中…(img-u09YxmPh-1710592881880)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值