JS基本包装类型

前端开发
2018年12月07日
384

为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:BooleanNumberString

Boolean类型

Boolean类型是与布尔值对应的引用类型。

js
var booleanObj = new Boolean(true);

Boolean类型的实例重写了valueOf()方法,返回基本类型值truefalse;重写了toString()方法,返回字符串"true""false"。可是,Boolean对象在ECMAScript中的用处不大,因为它经常会造成人们的误解。其中最常见的问题就是在布尔表达式中使用Boolean对象:

js
var falseObj = new Boolean(false); var result = falseObj && true; console.log(result); // true // 原因是这里是对falseObj求值而不是对它的值求值。 var falseVal = false; var result2 = falseVal && true; console.log(result2); // false

基本类型与引用类型的布尔值还有两个区别。首先,typeof命令对基本类型返回boolean,而对引用类型返回object;其次,由于Boolean对象是Boolean类型的实例,所以使用instanceof命令测试Boolean对象会返回true,而测试基本类型的布尔值则返回false:

js
console.log(typeof falseObj); // object console.log(typeof falseVal); // boolean console.log(falseObj instanceof Boolean); // true console.log(falseVal instanceof Boolean); // false

建议永远不要使用Boolean对象

Number类型

Number是与数字值对应的引用类型。与Boolean类型一样,Number类型也重写了valueOf()toLocalString()toString()方法。

js
var numberObj = new Number(10); // or // var numberObj = 10; // valueOf() 返回对象表示的基本类型的数值 console.log(numberObj.valueOf()); // 10 // 返回字符串,指定参数表示返回几进制数值的字符串形式 console.log(numberObj.toString()); // '10' console.log(numberObj.toString(2)); // '1010' // 返回字符串 console.log(numberObj.toLocaleString(2)); // '10' console.log(numberObj.toLocaleString(16)); // '10'

除了继承的方法之外,Number类型还提供了一些用于数值格式化为字符串的方法。

其中,toFixed()方法会按照参数指定的小数位返回字符串表示:

js
var num = 10; console.log(num.toFixed()); // '10' console.log(num.toFixed(2)); // '10.00' var num2 = 10.005; console.log(num2.toFixed()); // '10' console.log(num2.toFixed(2)); // '10.01' var num3 = 10.004; console.log(num3.toFixed(2)); // '10.00'

如果数值本身包含的小数位比指定的还多,那么就会“四舍五入”。但需要注意的是,不同浏览器给这个方法设定的舍入规则可能会有所不同。

另外,可用于格式化数值的方法是toExponential(),该方法返回以**指数表示法(也称e表示法)**表示的数值的字符串形式。与toFixed()一样,接收一个指定小数位数的参数。

如果你想得到表示某个数值的最合适的格式,就应该使用toPrecision()方法。对于一个数值来说,这个方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适。

toPrecision()接收一个参数,即表示数值的所有数字的位数(不包括指数部分)。

js
var num = 99; console.log(num.toPrecision(1)); // '1e+2' console.log(num.toPrecision(2)); // '99' console.log(num.toPrecision(3)); // '99.0'

与Boolean对象类似,不建议直接实例化Number类型,原因与实例化Boolean对象一样。

String类型

String类型是字符串对象的包装类型。

js
var str = new String('hello world');

String类型的每个实例都有一个length属性,表示字符串中包含多少个字符。

js
var str = 'hello world!'; console.log(str.length) // 12

字符方法

两个用于访问字符串特定字符的方法是:charAt()charCodeAt()。这两个方法都接收一个参数,即字符位置。

js
var str = 'hello world'; // 返回字符串在参数位置的字符 console.log(str.charAt(1)); // 'e' // 返回字符串在参数位置的字符编码 console.log(str.charCodeAt(1)); // 101

另外,ES5还定义了另一个访问个别字符的方法,在支持此方法的浏览器中,可以使用方括号加数字索引来访问字符串中的特定字符。如果浏览器不支持,则会返回undefined值。

js
var str = 'hello world'; console.log(str[2]); // 'l'

字符串操作方法

concat()

用于拼接字符串,返回拼接得到的新字符串。实践中使用加号操作符(+)来拼接更为方便。

js
var str = 'hello'; var result = str.concat(' ', 'world', '!'); console.log(result); // 'hello world!'

slice()、substr()和substring().

这三个方法都可以对字符串进行截取,并返回截取得到的新字符串。而且都接收两个参数

  • slice():第一个参数是截取开始的位置,第二个参数(可选,不传表示截取到字符串结尾)是结束的位置,这两个参数都是基于原字符串所在的位置。参数为负数时,会将传入的负值与字符串长度相加。
  • substr():第一个参数是截取开始的位置,第二个参数(可选,不传表示截取到字符串结尾)需要截取的长度。参数为负数时,会将第一个参数与字符串长度相加,第二个参数转为0。
  • substring():第一个参数是截取开始的位置,第二个参数(可选,不传表示截取到字符串结尾)是结束的位置。参数为负数时,会将负值转为0。
js
var str = 'hello world'; console.log(str.slice()); // 'hello world' console.log(str.slice(2)); // 'llo world' console.log(str.slice(2, 4)); // 'll' console.log(str.slice(-2, 4)); // '' console.log(str.slice(2, -4)); // 'llo w' console.log(str.slice(-2, -4)); // '' console.log(str.substr()); // 'hello world' console.log(str.substr(2)); // 'llo world' console.log(str.substr(2, 4)); // 'llo' console.log(str.substr(-2, 4)); // 'ld' console.log(str.substr(2, -4)); // '' console.log(str.substr(-2, -4)); // '' console.log(str.substring()); // 'hello world' console.log(str.substring(2)); // 'llo world' console.log(str.substring(2, 4)); // 'll' console.log(str.substring(-2, 4)); // 'hell' console.log(str.substring(2, -4)); // 'he' console.log(str.substring(-2, -4)); // ''

字符串位置的方法

indexOf()lastIndexOf(),返回字符在被查询的字符串中第一次出现的位置,如果没找到则返回-1。这两个方法的区别在于,一个是从前面开始查询,一个是从后面开始查询。

这两个方法都接收两个参数:第一个参数是被查询的字符;第二个参数(可选,如无从0开始)指定从哪个位置开始查询。

js
var str = 'hello world'; console.log(str.indexOf('o')); // 4 console.log(str.lastIndexOf('o')); // 7 console.log(str.indexOf('o', 6)); // 7 console.log(str.lastIndexOf('o', 6)); // 4 console.log(str.indexOf('e', 6)) // -1 console.log(str.lastIndexOf('e', 6)) // 1

trim()

ES5为字符串定义了trim()方法,这个方法可以去除字符串首尾的所有空格,并返回结果。

js
var str = ' hello world! '; var result = str.trim(); console.log(str); // ' hello world! ' console.log(result); // 'hello world'

字符串大小写转换方法

ECMAScript中涉及字符串大小写转换的方法有:toLowerCase()toUpperCase()toLocaleLowerCasetoLocaleUpperCase()

其中,toLocaleLowerCasetoLocaleUpperCase()是针对特定地区的实现,对有些地区来说,这两个方法会与toLowerCase()toUpperCase()得到相同的结果,但少数语言(如土耳其语)会为Unicode大小写转换应用特殊的规则,这时就必须使用针对地区的方法来保证实现正确的转换。

js
var str = 'Hi, JavaScript'; console.log(str.toLowerCase()); // 'hi, javascript' console.log(str.toUpperCase()); // 'HI, JAVASCRIPT' console.log(str.toLocaleLowerCase()); // 'hi, javascript' console.log(str.toLocaleUpperCase()); // // 'HI, JAVASCRIPT'

字符串的模式匹配方法

match()

这个方法本质上与调用RegExp的exec()方法相同。match()方法只接受一个参数,要么是正则表达式,要么是RegExp对象

js
var text = 'cat, bat, sat, fat'; var pattern = /.at/; var matches = text.match(pattern); console.log(matches); // // [ 'cat', // index: 0, // input: 'cat, bat, sat, fat', // groups: undefined ] //

match()方法返回一个数组,数组的第一项是与整个模式匹配的字符串,之后的每一项(如果有)保存着与正则表达式中的捕获组匹配的字符串。

search()方法返回字符串中第一个匹配项的位置,如果没有找到匹配项则返回-1。参数与match()方法一样。

js
var text = 'cat, bat, sat, fat'; console.log(text.search(/at/)); // 1 console.log(text.search(new RegExp('bat'))); // 5

replace()

将字符串中指定的字符替换成另外一个字符。这个方法接收两个参数:第一个参数可以是一个字符串或一个RegExp对象;第二个参数可以是一个字符串或者一个函数。

如果第一个参数是字符串,那么只会替换第一个子字符串,要想替换所有匹配的子字符串,则需要提供一个正则表达式或者一个RegExp对象,并指定全局标记(g)。

js
var text = 'cat, bat, sat, fat'; var result = text.replace('at', 'ond'); var result2 = text.replace(/at/g, 'ond'); var result3 = text.replace(new RegExp('at', 'g'), function () { return 666; }); console.log(result); // 'cond, bat, sat, fat' console.log(result2); // 'cond, bond, sond, fond' console.log(result3); // 'c666, b666, s666, f666'

如果第二个参数是字符串,那么还可以使用一些特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中。

js
var text = 'cat, bat, sat, fat'; var result = text.replace(/(.at)/g, 'word($1)'); console.log(result); // 'word(cat), word(bat), word(sat), word(fat)'

split()

基于指定的分隔符将一个字符串分隔成多个子字符串,并将结果放在一个数组中。split()方法接收两个参数:第一个是分隔符(字符串或RegExp对象);第二个参数(可选)是返回的结果数组的长度。

js
var colors = 'red,green,blue,yellow'; console.log(colors.split(',')); // [ 'red', 'green', 'blue', 'yellow' ] console.log(colors.split(',', 2)); // [ 'red', 'green' ] console.log(colors.split('|')); // [ 'red,green,blue,yellow' ] console.log(colors.split(/[^,]+/)); // [ '', ',', ',', ',', '' ]

localeCompare()

localeCompare()用于比较两个字符串,返回结果如下:

  • 如果字符串在字母表中应该排在参数字符串之前,则返回一个负数。
  • 如果相同,返回0
  • 如果字符串在字母表中应该排在参数字符串之后,则返回一个正数。
js
var str = 'hello'; console.log(str.localeCompare('world')); // -1 console.log(str.localeCompare('ECMAScript')); // 1 console.log(str.localeCompare('hi')); // -1 console.log(str.localeCompare('hello')); // 0

fromCharCode()

String构造函数本身有一个静态方法:fromCharCode()。这个方法的任务是接收一个或多个字符编码,然后将它们转换成一个字符串。从本质上看,这个方法与charCodeAt()执行的是相反的操作。

js
console.log(String.fromCharCode(104, 101, 108, 108, 111)); // 'hello'

HTML方法

早期的Web浏览器开发商觉察到了使用JavaScript动态格式化HTML的需求。于是,这些开发商就扩展了标准,实现了一些专门用于简化常见HTML格式化任务的方法。

注意,尽量不要使用这些方法,因为它们创建的标记通常无法表达语义。

方法 输出结果
anchor(name) <a name="name">String</a>
big() <big>String</big>
bold() <b>String</b>
fixed() <tt>String</tt>
fontcolor(color) <font color="color">String</font>
fontsize(size) <font size="size">String</font>
italics() <i>String</i>
link(url) <a href="url">String</a>
small <small>String</small>
strike() <strike>String</strike>
sub() <sub>String</sub>
sup() <sup>String</sup>