JavaScript高级程序设计第5章读书笔记(15)

Number类型

要创建Number类型,可以在调用Number构造函数的时候向其中传递相应的数值。比如:

Number类型也重写了valueOf()、toLocaleString()和toString()方法。重写后的valueOf()方法返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值。为toString()方法传递一个表示基数的参数,可以指定它返回几进制数值的字符串形式,比如:

除了继承的方法之外,Number类型还提供了一些用于将数值格式化为字符串的方法。其中toFixed()方法会按照指定的小数位返回数值的字符串表示,比如:

这里给toFixed()方法传入了数值2,表示显示几位小数。于是,这个方法返回了”10.00″,即以0填补了必要的小数位。如果数值本身包含的小数位比指定的多,那么接近指定的最大小数位的值就会舍入,比如:

自动舍入的特性,使得toFixed()方法很适合处理货币值。但是,不同的浏览器给这个方法设定的舍入规则可能有所不同。在给toFixed()传入0的情况下,IE8及之前的版本不能正确舍入范围在{(-0.94,-0.5], [0.5, 0.94)}之间的值。对于这个范围内的值,IE会返回0,而不是-1或1。其他浏览器都能正常返回正确的值。IE9修复了这个问题。

toFixed()方法可以表示带有0到20个小数位的数值。但这只是标准实现的范围,有些浏览器也可能支持更多位数。

另外,可以用于格式化数值的方法是toExponential(),该方法返回以指数表示法(也称e表示法)表示的数值的字符串形式。它也接收一个参数,指定输出结果中的小数位数。比如:

以上代码,输出了”1.0e+1″,不过,这种小的数值一般不必使用e表示法。如果想要得到表示某个数值的最合适的格式,应该使用toPrecision()方法。

对于一个数值来说,toPrecision()方法可能返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适。这个方法接收一个参数,即表示数值的所有数字的位数(不包括指数部分)。比如:

以上代码首先完成的任务是以一位数来表示99,结果是”1e+2″,即100。因为一位数无法准确表示99,因此toPrecision()就将它向上舍入为100,这样就可以使用一位数来表示它了。而接下来的用两位数表示99,当然还是”99″。最后,以三位数表示99时,toPrecision()方法返回了”99.0″。实际上,toPrecision()会根据要处理的数值决定到底是调用toFixed()还是toExponential()。而这3个方法都可以通过向上或向下舍入,做到以最准确的形式来表示带有正确小数位的值。

toPrecision()方法可以表现1到21位小数。某些浏览器支持的范围更大。

Number对象也以后台方式为数值提供了重要的功能。但与此同时,我们也不建议直接实例化Number类型,而原因与显示创建Boolean对象一样。具体来说,就是在使用typeof和instanceof操作符测试基本类型数值与引用类型数值时,得到的结果完全不同,比如:

在使用typeof操作符测试基本类型数值的时候,始终会返回”number”,而在测试Number对象时,则会返回”object”。

String类型

String类型是字符串的对象包装类型,构建方式如下:

String对象的方法也可以在所有基本的字符串值中访问到。其中,继承的valueOf()、toLocaleString()和toString()方法,都返回对象所表示的基本字符串值。

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

需要注意的是,即使字符串中包含双字节字符(不是占一个字节的ASCII字符,比如中文),每个字符也仍然算一个字符。

字符方法

两个用于访问字符串中特定字符的方法是: charAt()charCodeAt()。这两个方法都接收一个参数,即基于0的字符位置。其中,charAt()方法以单字符字符串的形式返回给定位置的那个字符。比如:

字符串”hello world”位置1处的字符是”e”,因此调用charAt(1)就返回了”e”。如果想要得到的是字符编码,那么就要使用charCodeAt()了。

ECMAScript 5还定义了另一个访问个别字符的方法。在支持浏览器中,可以使用方括号加数字索引来访问字符串中的特定字符,比如:

使用方括号表示法访问个别字符的语法得到了IE8以及Firefox、Safari、Chrome和Opera所有版本的支持。如果在IE7以及更早版本中使用这种语法,会返回undefined值。

字符串操作方法

concat()方法,用于将一个或多个字符串拼接起来,返回拼接得到的新字符串。比如:

以上例子中,stringValue调用concat()方法后,它自身的值并没有改变。另外,concat()方法可以接受任意多个参数,也就是说可以通过它拼接任意多个字符串。比如:

虽然concat()方法是专门用来拼接字符串的,但实践中我们使用更多的还是加号操作符(+)。

ECMAScript还提供了三个基于字符串创建新字符串的方法:slice()substr()substring()。这3个方法都会返回被操作字符串的一个子字符串,而且也都接受一个或两个参数。第一个参数指定子字符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。具体来说,slice()和substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而substr()的第二个参数指定的则是返回的字符个数。如果没有给这些方法传递第二个参数,则将字符串的长度作为结束位置。与concat()方法一样,slice()、substr()和substring()也不会修改字符串本身的值,它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响。

在传递给这些方法的参数是负值的情况下,它们的行为就不尽相同。其中,slice()方法会将传入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为0。另外,substring()方法会把所有负值参数都转换为0。比如:

在给 slice() 和 substr()传递一个负值参数的时候,它们的行为相同。参数-3都会被转换成8(字符长度加参数11+(-3)=8),实际上相当于调用了slice(8)和substr(8)。但substring()方法则返回了全部字符串,因为它将-3转换成了0。

IE的JavaScript实现在处理向substr()方法传递负值的情况时村长问题,它会返回原始的字符串。IE9修复了这个问题。

当第二个参数是负值的时候,这3个方法哥不相同。slice()方法会把第二个参数转换为7,相当于调用了slice(3, 7),因此返回”lo w”。substring()方法把第二个参数转换为0,使调用变成了 substring(3, 0),而由于这个方法会将较小的数作为开始位置,将较大的数作为结束位置,因此最终相当于调用了substring(0, 3)。substr()也会将第二个参数转换为0,这意味着返回包含0个字符的字符串,也就是一个空字符串。