JS基本包装类型
为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean
、Number
和String
。
Boolean类型
Boolean类型是与布尔值对应的引用类型。
js
var booleanObj = new Boolean(true);
Boolean类型的实例重写了valueOf()
方法,返回基本类型值true
或false
;重写了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()
、toLocaleLowerCase
和toLocaleUpperCase()
。
其中,toLocaleLowerCase
和toLocaleUpperCase()
是针对特定地区的实现,对有些地区来说,这两个方法会与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()
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> |