基本包装类型
为了便于操作基本类型值,js还提供了3个特殊的引用类型:Boolean、Number、String。每当读取一个基本类型的值时,后台就会创建一个对应的基本包装类型的对象 ,从而让我们能够调用一些方法来操作这些数据。
var s1 = "some string" ;
var s2 = s1.substring(2 );
在这里,s1是基本类型不是对象,从逻辑上来说它不应该有substring方法,但后台已经自动完成了一系列的处理。当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问这个字符串,后台会自动进行下列处理 。
创建String类型的一个实例。 在实例上调用指定的方法。 销毁这个实例。
var s1 = "some string" ;
var temp = new String (s1);
var s2 = temp.substring(2 );
temp = null ;
引用类型与基本包装类的主要区别在于对象的生存期。使用new操作符创建的引用的实例在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间。
var s1 = "some string" ;
s1.color = "red" ;
alert(s1.color);
var s2 = new String (s1);
s2.color = "blue" ;
alert(s2.color);
Object构造函数也会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。
var obj1 = new Object ("some string" );
alert(obj1 instanceof String );
var obj2 = new Object (1 );
alert(obj2 instanceof Number );
var obj3 = new Object (true );
alert(obj3 instanceof Boolean );
要注意的是,使用new 调用基本包装类型的构造函数,和直接调用同名的转型函数是不一样的。
var value = "25" ;
var number = Number (value);
alert(typeof number);
var obj2 = {
toString: function () {
return 2 ;
}
}
var obj = new Number (obj2);
alert(typeof obj);
alert(obj.valueOf());
Boolean类型
Boolean类型的实例重写了valueOf方法,返回基本类型true或者false。重写了toString方法,返回字符串 “true”和”false”。没事别使用这个类型,因为它很容易造成误解(故建议永远不要使用这个基本包装类型):
alert(Boolean(new Boolean(false )));// true 非空对象的转型为true !
// 所以,就会得到一个false && true 为true 的结论
var falseobj = new Boolean(false );
alert(falseobj && true );// false && true == true !!!
Number类型
var numberobj = new Number (10 );
常用的valueOf()、toLacaleString()和toString()都没什么特别的。另外toString()还有一种特别的用法:
var numberValue = 10 ;
//to String() using a radix 转成x进制(2 ~36 )
alert(numberValue.toString()); // "10"
alert(numberValue.toString(2 )); // "1010"
alert(numberValue.toString(8 )); // "12"
alert(numberValue.toString(10 )); // "10"
alert(numberValue.toString(16 )); // "a"
toFixed(): 按照指定的小数位返回数值的字符串表示(四舍五入)。 toExponential(): 按照指定的小数位返回数值的科学计数法表示(四舍五入)。 toPrecision():可能返回toFixed,也可能返回toExponential,传入的数值代表所有数字的位数。
var numberObject = new Number (10 );
alert(numberObject.toFixed(2 )); //outputs "10.00"
alert(numberObject.toExponential(2 )); //outputs "1.00e+1"
numberObject = new Number (99 );
alert(numberObject.toPrecision(1 )); // "1e+2"
alert(numberObject.toPrecision(2 )); // "99"
alert(numberObject.toPrecision(3 )); // "99.0"
String 类型
length
length属性大家都知道,返回字符串的长度。要注意的是即使字符串中包含双字节字符,每个字符长度也只为1.String有很多方法和Array的方法类似。
charAt()和charCodeAt()
charAt()和charCodeAt():接收一个index,前者输出相应下标的字符,后者则输出相应的字符编码。
var string = "hello world" ;
alert(string .charAt(1 ));
alert(string .charCodeAt(1 ));
alert(string [1 ]);
concat()
concat(): 将一个或多个字符串拼接起来(比用加号麻烦多了)。
var string = "hello world" ;
var newstring1 = string .concat("!" );
var newstring2 = string .concat("!" , " my boy" );
var newstring3 = string .concat(["!" ," my boy" ]);
alert(newstring1);
alert(newstring2);
alert(newstring3);
slice()、substr()、substring()
slice()、substr()、substring()。这三个方法都会返回被操作字符串的一个子字符串,都接收一或两个参数。这三个方法的第一个参数代表从字符串的哪个下标开始截取 。slice()和substring()的第二个参数代表在哪个下标结束 (不包含该下标的字符)。而substr()的第二个参数代表返回多长 的子字符串。他们都不会修改字符串本身,只是返回一个子字符串。
var stringValue = "hello world" ;
alert(stringValue.slice(3 ));
alert(stringValue.substring (3 ));
alert(stringValue.substr(3 ));
alert(stringValue.slice(3 , 7 ));
alert(stringValue.substring (3 ,7 ));
alert(stringValue.substr(3 , 7 ));
alert(stringValue.slice(-3 ));
alert(stringValue.substring (-3 ));
alert(stringValue.substr(-3 ));
alert(stringValue.slice(3 , -4 ));
alert(stringValue.substring (3 , -4 ));
alert(stringValue.substr(3 , -4 ));
indexOf()和lastIndexOf()
indexOf()和lastIndexOf():最普通的用法就是传入一个字符串,获取相应的下标值(不存在返回-1)。还有一种用法是传入一个字符串和一个起始下标。
var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit" ;
var positions = new Array();
var pos = stringValue.indexOf("e" );
while (pos > -1 ){
positions.push (pos );
pos = stringValue.indexOf("e" , pos + 1 );
}
alert(positions); // "3,24,32,35,52"
trim()、toLowerCase()、toUpperCase()
trim(): 去除前后空格。 toLowerCase(),toLocaleLowerCase():转换小写 toUpperCase(),toLocaleUpperCase():转换大写
match()
match(),在字符串上调用这个方法,本质上与调用RegExp的exec()一样。match()方法接收一个参数,要么是正则表达式,要么是一个RegExp对象。以下是例子(更多关于返回值的用法请看另外一篇文章):
var text = "cat,bat,sat,fat" ;
var pattern = /.at/ ;
var matches = text.match(pattern);
alert(matches.index);
alert(matches[0 ]);
alert(pattern.lastIndex);
search() replace()
search(),传入一个正则表达式,返回第一个匹配下标。 replace(),传入两个参数,第一个正则表达式或者字符串(不会被转成正则表达式),第二个可以是字符串或者函数。
var text = "cat,bat,sat,fat" ;
var post = text.search(/at/ );
alert(post);
var result = text.replace(/at/ , "xx" );
alert(result);
var result1 = text.replace("at" , "xx" );
alert(result1);
var result2 = text.replace(/at/g , "xx" );
alert(result2);
当第二个参数是字符串时,那么还可以用一些特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中。
字符序列 替换文本 $$ $ $& 匹配整个模式的字符串,与RegExp.lastMathc相同 $’ 匹配的字符串之前的子字符串,与RegExp.leftContext的值相同 $` 匹配的字符串之后的子字符串,与RegExp.rightContext的值相同 $n $nn 匹配第n或者nn捕获组的子字符串。其中n为1~9、nn为01~99,如果相应的捕获组不存在,则用空字符串代替
var text = "cat,bat,sat,fat" ;
var result = text .replace(/(.)at /g, "word$1" );
alert(result );"wordc,wordb,words,wordf" ;
replace()方法第二个参数也可以是一个函数。在只有一个匹配项(即与模式匹配的字符串)的情况下,会向该函数传递三个参数:模式的匹配项 ,模式匹配项在字符串中的位置 和原始字符串 。在正则表达式中定义了多个捕获组的情况下,传递给函数的参数依次是模式的匹配项 、第一个模式的匹配项、第二个模式的匹配项…….,但最后两个参数依旧是模式的匹配项在字符串中的位置和原始字符串。
var text = "cat,bat,sat,fat" ;
var result = text .replace(/(.)at/g, function(match , $1 , post, originalText) {
alert(match );
alert($1 );
alert(post);
alert(originalText);
switch ($1 ) {
case 'c' :
return '1' ;
case 'b' :
return '2' ;
case 's' :
return '3' ;
case 'f' :
return '4' ;
}
});
alert(result);
split()
split(),这个方法可以基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中。分隔符可以是字符串,也可以是一个RegExp对象(这个方法不会将字符串看成正则表达式)。split()方法可以接受第二个参数,用于控制返回的数组长度。
var color = "red,blue,green,yellow" ;
alert(color.split("," ));//red ,blue,green,yellow
alert(color.split(/\,/ ));//red ,blue,green,yellow
alert(color.split(/\,/g , 2 ));//red ,blue
alert(color.split(/[^\,]+/ ).length);// 5 不是3 因为包含了起始空字符串和末尾空字符串
console.log(color.split(/[^\,]+/ ));// ["" , "," , "," , "," , "" ]
localeCompare() fromChatCode()
localeCompare() 方法,比较两个字符串。字符串靠前则小(一般返回值有三种情况。1大于0等于-1小雨)。 fromChatCode(), 接收一个或多个字符编码,组成一个字符串返回。这个方法与实例方法charCodeAt执行的是相反操作。
html方法。(不建议使用,语意不清楚)