当前位置:[首页 > 日语资讯 > J.TEST > JavaScript字符串所有API全解密]

JavaScript字符串所有API全解密

发布: 2017-08-12 14:30 | 来源:www.jptranslate.com | 查 看:

字符串作为基本的信息交流的桥梁,几乎被所有的编程语言所实现

多数开发者几乎每天都在和字符串打交道

Java通过自动装箱字符串字面量为String对象,更加简化了字符串的使用

字符串作为基本的信息交流的桥梁,几乎被所有的编程语言所实现(然而c、c++没有提供)。

多数开发者几乎每天都在和字符串打交道,语言内置的String模块,极大地提升了开发者的效率。

Java通过自动装箱字符串字面量为String对象,自然地继承了String.prototype的所有方法,更加简化了字符串的使用。

截止ES6,字符串共包含31个标准的API方法,其中有些方法出镜率较高,需要摸透原理;有些方法之间相似度较高,需要仔细分辨;甚至有些方法执行效率较低,应当尽量少的使用。下面将从String构造器方法说起,逐步帮助你掌握字符串。

String构造器方法

fromCharCode

fromCharCode()方法返回使用指定的Unicode序列创建的字符串,也就是说传入Unicode序列,返回基于此创建的字符串。

语法:fromCharCode(num1, num2,…),传入的参数均为数字。

如下这是一个简单的例子,将返回 ABC、abc、*、+、- 和 /:

String.fromCharCode(65, 66, 67); // "ABC"String.fromCharCode(97, 98, 99); // "abc"String.fromCharCode(42); // "*"String.fromCharCode(43); // "+"String.fromCharCode(45); // "-"String.fromCharCode(47); // "http://mt.sohu.com/"

看起来fromCharCode像是满足了需求,但实际上由于js语言设计时的先天不足(只能处理UCS-2编码,即所有字符都是2个字节,无法处理4字节字符),通过该方法并不能返回一个4字节的字符,为了弥补这个缺陷,ES6新增了fromCodePoint方法,请往下看。

fromCodePoint(ES6)

fromCodePoint()方法基于ECMA 2015(ES6)规范,作用和语法同fromCharCode方法,该方法主要扩展了对4字节字符的支持。

// "��" 是一个4字节字符,我们先看下它的数字形式"��".codePointAt(); // 119558//调用fromCharCode解析之,返回乱码String.fromCharCode(119558); // "팆"//调用fromCodePoint解析之,正常解析String.fromCodePoint(119558); // "��"

除了扩展对4字节的支持外,fromCodePoint还规范了错误处理,只要是无效的Unicode编码,就会抛出错误RangeError: Invalid code point...,这就意味着,只要不是符合Unicode字符范围的正整数(Unicode最多可容纳1114112个码位),均会抛出错误。

String.fromCodePoint('abc'); // RangeError: Invalid code point NaNString.fromCodePoint(Infinity); // RangeError: Invalid code point InfinityString.fromCodePoint(-1.23); // RangeError: Invalid code point -1.23

注:进一步了解Unicode编码,推荐这篇文章:浅谈文字编码和Unicode(下):

如需在老的浏览器中使用该方法,请参考Polyfill

https://developer.mozilla.org/zh-CN/docs/Web/Java/Reference/Global_Objects/String/fromCodePoint#Polyfill-浏览器补丁。

raw(ES6)

raw() 方法基于ECMA 2015(ES6)规范,它是一个模板字符串的标签函数,作用类似于Python的r和C#的@字符串前缀,都是用来获取一个模板字符串的原始字面量。

语法:

String.raw(callSite, …substitutions),callSite即模板字符串的“调用点对象”,…substitutions表示任意个内插表达式对应的值,这里理解起来相当拗口,下面我将通俗的讲解它。

如下是python的字符串前缀r:

# 防止特殊字符串被转义print r'anbtc' # 打印出来依然是 "anbtc"# python中常用于正则表达式regExp = r'(?<=123)[a-z]+'

如下是String.raw作为前缀的用法:

// 防止特殊字符串被转义String.raw`anbtc`; // 输出为 "anbtc"// 支持内插表达式let name = "louis";String.raw`Hello n ${name}`; // "Hello n louis"// 内插表达式还可以运算String.raw`1+2=${1+2},2*3=${2*3}`; // "1+2=3,2*3=6"

String.raw作为函数来调用的场景不太多,如下是用法:

// 对象的raw属性值为字符串时,从第二个参数起,它们分别被插入到下标为0,1,2,...n的元素后面String.raw({raw: 'abcd'}, 1, 2, 3); // "a1b2c3d"// 对象的raw属性值为数组时,从第二个参数起,它们分别被插入到数组下标为0,1,2,...n的元素后面String.raw({raw: ['a', 'b', 'c', 'd']}, 1, 2, 3); // "a1b2c3d"

那么怎么解释String.raw函数按照下标挨个去插入的特性呢?MDN上有段描述如下: