基本包装类型
ECMAScript5还提供了三个特殊的引用类型:Boolean Number String
这些类型与其他的引用类型相似,但是也具有各自的基本类型的特殊行为。每当读取一个基本类型值的时候,
后台就会创建一个对应的基本包装类型的对象
1 var s1 = "some text"; 2 var s2 = s1.substring(2);
s1包含一个字符串是一个基本类型值,所以不可能有方法,但是在后台经历了这样三个过程:
(1)创建String类型的一个实例
(2)在实例上调用指定的方法
(3)销毁这个实例
三个步骤执行了下列ECMAScript实例
1 var s1 = new String("some text"); 2 var s2 = s1.substring(2); 3 s1 = null;
上面三个实例也同样适用于Boolean和String类型对应的布尔值和数字值
引用类型与基本包装类型的主要区别是对象的生存期。使用new操作符创建的引用类型实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间
1 var s1 = "some text"; 2 s1.color = "red"; 3 alert(s1.color); //undefined
还可以显示的调用Boolean、Number、String来创建基本包装类型的对象(不推荐这样做,因为容易分不清是引用类型还是基本包装类型)对基本包装类型的实例调用typeof会返回"object",而且所有的基本包装类型的对象都会被转换成布尔值true
1 var obj = new Object("some text"); 2 alert(obj instanceof String); //true
传入数值参数则会得到Number实例,Boolean同样
注意:使用new调用基本包装类型的构造函数,与直接调用同民的转型函数是不一样的
1 var result = "25"; 2 var number = Number(result); 3 alert(typeof number);//"number" 4 5 var obj = new Number(result); 6 alert(typeof number);//"object"
Boolean类型
Boolean类型是与布尔值对应的引用类型。
1 var booleanObject = new Boolean(true);
Boolean对象在ECMAScript中的用处不大,因为常会造成人们的误解
1 var falseObject = new Boolean(false); 2 var result = falseObject && true;//所有的基本包装类型的对象都会被转换成布尔值true 3 4 alert(result); //true 5 6 var falseValue = false; 7 var result = falseValue && true; 8 alert(result);//false
Number类型
1 var numberObject = new Number(10);
与Boolean类型一样,Number类型也重写了valueOf()、toLocaleString()、toString()方法。重写后的valueOf方法返回对象表示的基本类型的数值,另外两个方法返回字符串形式的数值。可以为toString()方法传递一个表示基数的参数,告诉它返回几进制数值的字符串形式
1 var num = 10; 2 alert(num.toString()); //"10" 3 alert(num.toString(2)); //"1010"
toFixed()方法会按照指定的小数位返回数值的字符串表示
1 var num = 10; 2 alert(num.toFixed(2)); //"10.00" 3 4 var num = 10.005; 5 alert(num.toFixed(2));//"10.01"
toExponential()方法返回以指数表示法表示的数值的字符串形式
1 var num = 10; 2 alert(num.toExponential(1));//"1.0e+1" 参数设置返回值的小数位
toPrecision()方法可能会返回固定大小格式,也可能返回指数格式,具体规则看哪种格式最合适。接受一个参数,表示数值所有数字的位数(不包括指数部分)
1 var num = 99; 2 alert(num.toPrecision(1)); //"1e+1" 3 alert(num.toPrecision(2)); //"99" 4 alert(num.toPrecision(3)); //"99.0"
不建议直接实例化Number类型,原因与显示创建Boolean类型一样,具体来讲就是typeof和instanceof操作符测试基本类型与引用类型数值时,得到的结果完全不同。
1 var numberObject = new Number(10); 2 var numberValue = 10; 3 alert(typeof numberObject); //"object" 4 alert(typeof numberValue); //"number" 5 alert(numberObject instanceof Number); //true 6 alert(numberValue instanceof Number); //false
String类型
1 var stringObject = new String("hello word");
继承的valueOf()、toLocaleString()、toString()都返回对象所表示的基本字符串值。String类型的每个实例都有一个length属性,表示字符串中包含多个字符。
1 var stringValue = "hello word"; 2 alert(stringValue.length); //"11";
String类型提供了很多方法,用于辅助完成对ECMAScript中字符串的解析和操作
1、字符方法
两个用于访问字符串中特定字符的方法:charAt()和charCodeAt()
charAt()方法以单字符的形式返回给定位置的那个字符(基于0)
charCodeAt()方法返回给定位置的那个字符的字符编码
1 var stringValue = "hello word"; 2 alert(stringValue.chartAt(1)); //"e" 3 alert(stringValue.charCodeAt(1)); //"101"
ECMAScript5还定义了另一个访问个别字符串的方法,可以用方括号加数字索引来访问字符串中特定字符
1 var stringValue = "hello word"; 2 alert(stringValue[1]); //"e"
2、字符串操作方法
concat()方法用于拼接一个或者多个字符串,返回拼接后新的字符串(在实际中用的更多的换是+操作符)
1 var stringValue = "hello"; 2 var result = stringValue.concat(" word !"); 3 alert(result); //"hello word !" 4 alert(stringValue); //"hello"
ECMAScript5还提供了三个基于子字符串创建新字符串的方法:slice()、substr()、substring()。都接受一到两个参数,第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置。具体来说,slice()、substring()第二个参数表示子字符串最后一个字符后面的位置,而substr()的第二个参数指定的则是返回的字符个数。
1 var stringValue = "hello word"; 2 alert(stringValue.slice(3));//"llo world" 3 alert(stringValue.slice(3, 7)); //"lo w" 4 alert(stringValue.substring(3, 7)); //"lo w" 5 alert(stringValue.substr(3, 7)); //"lo worl"
在传递给这些方法的参数时负值时。slice()会将负值与字符串的长度相加,substr()方法将负的第一个参数字与符串的长度相加,将负的第一个参数转换为0。substring()
方法会将所有的负值转换为0。
3、字符串位置方法
indexOf()从开头向后搜索子字符串
lastIndexOf()从末尾开始向前搜索子字符串
1 var stringValue = "hello word"; 2 alert(stringValue.indexOf("o")); //4 3 alert(stringValue.lastIndexOf("o")); //7
这两个方法都可以接受第二个参数,表示从子字符串的哪个位置开始搜索。
1 var stringValue = "hello word"; 2 alert(stringValue.indexOf("o",6)); //7 3 alert(stringValue.lastIndexOf("o",6)); //4
可以通过循环调用indexOf()和lastIndexOf()来找到所有匹配的子字符串。
1 var stringValue = "Lorem ipsum dolor sit amet,consectetur adipisicing elit" 2 var positions = new Array(); 3 var pos = stringValue.indexOf("e"); 4 while(pos >= -1){ 5 positions.push(pos); 6 pos = stringValue.indexOf("e",pos + 1); 7 } 8 alert(positions); //"3,24,32,35,52"
4.trim()方法
这个方法会创建一个字符串的副本,删除前置及后置的所有空格
1 var stringValue = " hello world "; 2 var trimmedStringValue = stringValue.trim(); 3 alert(trimmedStringValue); //"hello world"
5.字符串大小写转换方法
经典方法:toLowerCase()和toUpperCase()
toLocaleLowerCase()和toLocaleUpperCase()方法则是针对特定地区的实现
6、字符串的模式匹配方法
match(),在字符串上调用这个方法,本质上一调用RegExp的exec()方法相同。
只接受一个参数要么是一个正则表达式要么是一个RegExp对象。
1 var text = "cat,bat,sat,fat"; 2 var pattern = /.at/; 3 var matches = text.match(pattern); 4 alert(matches.index); //0 5 alert(matches[0]); //"cat"
search(),返回字符串中第一个匹配项的索引,如果没有找到匹配项,则返回-1,接受的参数与match()相同
1 var text = "cat,bat,sat,fat"; 2 var pos = text.search(/at/); 3 alert(pos);
replace()方法接受两个参数,第一个参数可以使字符串或者RegExp对象,第二个参数可以使一个字符串或者是一个函数,如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,唯一的方法就是提供一个正则表达式,而且要指定全局(g)标志
1 var text = "cat,bat,sat,fat"; 2 var result = text.replace("at","ond"); 3 alert(result); //"cond,bat,sat,fat" 4 5 var text = "cat,bat,sat,fat"; 6 result = text.replace(/at/g,"ond"); 7 alert(result);
如果第二个参数时字符串,那么还可以使用一些特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中
字符序列 | 替换文本 |
$$ | $ |
$& | 匹配整个模式的子字符串。与RegExp.lastMatch的相同 |
$' | 匹配的子字符串之前的子字符串。与RegExp.leftContext的相同 |
$` | 匹配的子字符串之后的子字符串。与RegExp.rightContext的相同 |
$n | 匹配第n个捕获组的子字符串。其中n等于0~9 |
$nn | 匹配第nn个捕获组的子字符串。其中n等于01~99 |
1 var text = "cat,bat,sat,fat"; 2 result = text.replace(/(.at)/g,"word ($1)"); 3 alert(result);
split(),这个方法可以基于指定的分隔符讲一个字符串分隔成多个子字符串,并将结果放在一个数组中。可以接受第二个参数,指定数组的大小。
1 var colorText = "red,blue,green,yellow"; 2 var colors1 = colorText.split(",",2); 3 alert(colors1);
7、localeCompare()方法
如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多是-1)
如果字符串等于字符长参数,则返回0
如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(大多是1)
1 var stringValue = "yellow"; 2 alert(stringValue.localeCompare("brick")); //1
因为localeCompare()方法返回的数值取决于实现,所以最好是像下面例子所示的这样使用这个方法
1 function determineOrder(value){ 2 var result = stringValue.localeCompare(value); 3 if(result < 0){ 4 alert("The string 'yellow' comes before the string '"+ value +"'."); 5 } 6 else if(result > 0){ 7 alert("The string 'yellow' comes after the string '"+ value +"'."); 8 } 9 else{ 10 alert("The string 'yellow' is equal to the string '"+ value +"'."); 11 } 12 } 13 14 determineOrder("brick");
8、fromCharCode()方法
接受一或多个字符编码,然后将它们转换成一个字符串。
1 alert(String.fromCharCode(104,101,108,108,111)); //"hello"