JavaScript引用类型——基本包装档次

基本包装档次

为了便于操作基本类型值,ECMAScript还提供了3个奇特的引用类型:BooleanNumberString。那一个项目与其余引用类型一般,但还要也具有与各自的主旨项目相应的新鲜表现。
实在,
每当读取一个中坚项目值得时候,后台就会创立一个相应的骨干包装档次的靶子,从而可以调用一些措施来操作那个多少。

var s1 = "some text";
var s2 = s1.substring(2);

s1珍贵一个字符串,字符串是骨干项目值,基本项目值不是目的,从逻辑上讲不应当有主意,当访问s1时,访问过程处于一种读取情势,也就是要从内存中读取那些字符串的值。在独缺形式中走访字符串时,后台都会自行完成下列处理。

(1) 成立String类型的一个实例;
(2) 在实例上调用指定的情势;
ECMAScript,(3) 销毁这一个实例。

var s1 =new String(some text);
var s2 = s1.substring(2);
s1 = null;

上边三个步骤也适用于Bollean和Number类型对应的布尔值和数字值。
引用类型与基本包装档次的基本点区别就是目的的生存期。使用new操作符创制的引用类型的实例,在举办流离开当前功效域以前都从来保存在内存中。而机关创设的为主包装档次的靶子,则只设有于一行代码执行的弹指间,然后立刻被灭绝。这意味我们不可以再运行时为主导项目值添加属性和格局。

var s1 = "some text";
s1.color = "red";
alert(s1.color); //undefined

自然可以显得的调用Boolean、Number和String来创设基本包装档次的目的。可是,应该在相对少不了的情景下在那样做,因为这种做法很容易令人分不清自己是在处理为主项目或者引用类型的值。
对主题包装档次的实例调用typeof会再次回到”object”,所有中央包装档次的对象在更换为布尔类型时值都是true。
Object构造函数会依据传入值得类型再次回到相应基本包装档次的实例。

var obj = new Object("some text");
alert(obj instanceof String); //true

把字符串传给Object构造函数,就会创设String的实例,而传出数字就会拿到Number的实例,传入布尔值就会博得Boolean的实例。
需要留意的是,使用new调用基本包装档次的构造函数,与一贯调用同名的转型函数是不均等的。

var value = "25";
var number = Number(value); //转型函数
alert(typeof number); //"number"

var obj = new Number(value); //构造函数
alert(typeof obj); //"object"

变量number中保存的是着力项目标值25,变量obj中保留的是Number的实例。每个主题包装档次提供了操作相应值得便捷情势。

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

var booleanObject = new  Boolean(true);

Boolean的实例重写了valueOf()方法,重临基本类型值true或false;重写了toString()方法,重临字符串”true”或”false”。
Boolean对象通常会促成人们的误会,在ECMAScript中的用处不大。

var falseObject = new Boolean(false);
var result = falseObject && true;
alert(result); //true

var falseValue = false;
result = falseValue && true;
alert(result); //false

布尔表明式中具有目标都会被转换为true。

alert(typeof falseObject); //object
alert(typeof falseValue); //boolean
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false
  • Number类型

Number是与数字值对应的引用类型。成立Number对象,如:

var numberObject = new Number(10);

与Boolean类型一样,Number类型也重写了valueOf()、toLocalString()和toString()方法。重写后的valueOf()方法再次回到对象表示的主导项目标数值,另外二种模式则赶回字符串格局的数值,可以为toString()方法传递一个象征基数的参数,告诉它回到几进制数值的字符串形式,如:

var num = 10;
alert(num.toString()); //"10"
alert(num.toString(2)); //1010
alert(num.toString(8)); //12
alert(num.toString(10)); //10
alert(num.toString(16)); //a

而外延续的不二法门之外,Number类型还提供了有的用于将数值格式转化为字符串的情势。
toFixed()方法会依照指定的小数重回数值的字符串表示,如:

var num = 10;
alert(num.toFixed(2)); //"10.00"

var num = 10.005;
alert(num.toFixed(2)); //"10.01" 能够自动舍入

toFixed()方法适合处理货币值。

toExponential()用于格式化的章程,该办法重返以指数表示法(也称e表示法)表示数值的字符串形式。

var num = 10;
alert(num.toExponential(1)); //"1.0e+1"

toPrecision()模式或者会回来固定大写(fixed)格式,也可能回到指数(exponential)格式,具体规则看哪一种格式最合适。那多少个方法接收一个参数,即意味着数值的有着数字的位数(不包括指数部分)。

var num = 99;
alert(num.toPrecision(1)); //"1e+2"
alert(num.toPrecision(2)); //"99"
alert(num.toPrecision(3)); //"99.0"

var numberObject = new Number(10);
var numberValue = 10;
alert(typeof numberObject); //"object"
alert(typeof numberValue); //"number"
alert(numberObject instanceof Number); //true
alert(numberValue instanceof Number); //false
  • String类型
    String类型是字符串的对象包装档次。

var stringObject = new String("hello world");

String对象的不二法门也得以在富有要旨字符串值中走访到。继承的valueOf()方法,toLocaleString()和toString()方法,都回来对象所代表的着力字符串值。
String类型的每个实例都有一个length属性

var stringObject = new String("hello world");
alert(stringObject.length); //"11"

String类型提供了过多形式,由于扶助完成对ECMAScript中字符串的分析和操作。

  • 1. 字符方法

几个由于访问字符串中一定字符的方法:charAt()charCodeAt()。这六个法子都吸纳一个参数,即基于0的字符地点。其中,charAt()方法以单字符字符串的形式重返给定地方的非凡字符:

var stringValue = "hello world";
alert(stringValue.charAt(1)); //"e"

假如想赢得字符编码,就是用charCodeAt():

var stringValue = "hello world";
alert(stringValue.charCodeAt(1)); //输出"101"

另一个拜访个别字符的模式,使用方括号加数字索引来访问字符串中一定字符:

var stringValue = "hello world";
alert(stringValu[1]); //"e"
  • 2. 字符串操作方法
    上边介绍与操作字符串有关的多少个点子。
    concat()主意,由于将一个或六个字符串拼接起来,返货拼接得到的新字符串。

var stringValue = "hello ";
var result = stringValue.concat("world");
alert(result); //"hello world"
alert(stringValue); //"hello"

var stringValue = "hello ";
var result = stringValue.concat("world", "!");
alert(result); //"hello world!"
alert(stringValue); //"hello"

在实践中更多的是用加号操作符(+)拼接字符串。

ECMAScript还提供了六个按照子字符串创立新字符串的法子:slice()substr()substring()。这四个艺术都会回到被操作字符串的一个子字符串,而且也都承受一个或五个参数。第一个参数指定子字符串的上马地方,第二个参数(在指定状况下)表示字符串到什么地方停止。具体来说,slice()和substring()的第二个参数指定的是子字符串最终一个字符前面的位置。而substr()的第二个参数指定的则是回来的字符个数。如果没有给这多少个点子传递第二个参数,则将字符串的最终作为完结的地点。
与concat()方法同样,slice()、substr()和substring()也不会修改字符串本身的值——它们只是再次回到一个为主类型的字符串值,对原始字符串没有其它影响。

var stringValue = "hello world";
alert(stringValue.slice(3)); //"lo world"
alert(stringValue.substring(3)); //"lo world"
alert(stringValue.substr(3)); //"lo world"
alert(stringValue.slice(3,7)); //"lo w"
alert(stringValue.substring(3,7)); //"lo w"
alert(stringValue.substr(3,7)); //"lo worl"

在传递给那多少个方法的参数是负值的情景下,slice()方法会给传入的负值与字符串的长度相加,substr()方法将负的率先个参数加上字符串的长短,而将负的第二个参数转换为0,substring()方法会把持有负值参数都转移为-。

var stringValue = "hello world";
alert(stringValue.slice(-3)); //"rld"
alert(stringValue.substring(-3)); //"hello world"
alert(stringValue.substr(-3)); //"rld"
alert(stringValue.slice(3,-4)); //"lo w"
alert(stringValue.substring(3,-4)); //"hel"
alert(stringValue.substr(3,-4)); //""(空字符串)

substring()方法会将较小的数作为起初地点,将较大的数作为完结地方。

  • 3. 字符串地方方法
    有几个可以从字符串中查找子字符串的不二法门:indexOf()方法和lastIndexOf()艺术。这六个办法都是从一个字符串中摸索给定的子字符串,然后再次来到子字符串的职位(假诺没有找到,则放回-1)。
    indexOf()从字符串起初向后搜索子字符串,lastIndexOf()从字符串末尾向前搜索子字符串。

var stringValue = "hello world";
alert(stringValue.indexOf("o"); //4
alert(stringValue.lastIndexOf("o")); //7

这五个法子都得以接受可选的第二个参数,表示从字符串中的哪个岗位上马找寻。

var stringValue = "hello world";
alert(stringValue.indexOf("o", 6); //7
alert(stringValue.lastIndexOf("o", 6)); //4

可以因此循环调用indexOf()或lastIndexOf()来找到所有匹配的子字符串。

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"

在循环外,首先找到”e”在字符串中的先河地方,然后进入循环。

  • 4. trim()方法
    ECMAScript5
    为所有字符串定义了trim()方法。这些方法会创设一个字符串的副本,删除前置及后缀的有所空格,然后重临结果。

var stringValue = "    hello world    ";
var trimmedStringValue = stringValue.trim();
alert(stringValue); //"    hello world    "
alert(trimmedStringValue); //"hello workd"

是因为trim()再次来到的是字符串的副本,所以原始字符串中的前置及后缀空格会保持不便。
trimLeft()和trimRight()方法,分别用于删除字符串开头和最后的空格。

  • 5. 字符串大小转换方法

ECMAScript中涉嫌字符串大小写转换的方法有多少个:toLowerCase()toLocaleLowerCase()toUpperCase()toLocaleUpperCase()

var stringValue = "hello world";
alert(stringValue.toLocaleUpperCase()); //"HELLO WORLD"
alert(stringValue.toUpperCase()); //"HELLO WORLD"
alert(stringValue.toLocaleLowerCase()); //"hello world"
alert(stringValue.toLowerCase()); //"hello world"
  • 6. 字符串形式匹配方法

String类型定义了多少个用于在字符串中至极格局的主意。
match()主意,在字符串调用这多少个艺术,本质上与调用RegExp的exec方法一致。match()方法只接受一个参数,要么是一个正则表明式,要么是一个RegExp对象。

//与pattern.exec(text)相同
var matches = text.match(pattern);
alert(matches.index); //0
alert(matches[0]); //"cat"
alert(pattern.lastIndex); //0

match()方法重返了一个数组,数组的首先项是与成套格局匹配的字符串,之后的每一项(假设有)保存着与正则表明式中的捕获组匹配的字符串。

search()办法,这多少个办法只接受一个参数,要么是一个正则表明式,要么是一个RegExp对象。search()方法再次回到字符串中率先个匹配项的索引;假诺没有找到匹配项,则赶回01。search()方法始终是从字符串起首向后搜索格局。

var text = "cat, bat, sat, fat";
var pos = text.search(/at/);
alert(pos); //1

replace()方法,这些主意接受七个参数:第一个参数可以是一个RegExp对象或这几个字符串(这些字符串不会被转换成正则表明式),第二个参数可以是一个字符串或者一个函数。假设第一个参数是字符串,那么只会交替第一个子字符串。要想替换所有子字符串,唯一的办法就是提供一个正则表明式,而且要指定全局(g)标志。

var text = "cat, bat, sat, fat";
var result = text.replace("at", "ond");
alert(result); //"cond, bat, sat, fat"

result = text.replace(/at/g, "ond");
alert(result); //"cond, bond, sond, fond"

ECMAScript提供一些特种的字符类别。

  • $$: $
  • $&:匹配真个形式的子字符串。与RegExp.lastMatch值相同
  • $’:匹配子字符串在此之前的子字符串。与RegExp.leftContext的值相同
  • $`:匹配子字符串之后的子字符串。与RegExp.rightContext的值相同
  • $n:匹配第n个捕获组字符串。n等于0~9。
  • $nn:匹配第n 个捕获组字符串。n等于0你~99。

var text = "cat, bat, sat, fat";
result = text.replace("/(.at)/g","word($1)");
alert(result); //word(cat), word(bat), word(sta), word(fat)

replace()方法的第二个参数可以是一个函数。在只有一个匹配项(即与情势匹配的字符串)的景观下,会向这么些函数传递3个参数,格局的匹配项,形式匹配项在字符串中的地点和原始字符串。在正则表明是中定义了多少个捕获组的情况下,传递给函数的参数依次是格局的匹配项、第一个捕获组的配合项
第二个可是组的配合项……,但组后六个参数依然各自是格局匹配项在字符串中的地方和原始字符串。这个函数再次回到一个字符串,表示应当被替换的匹配项。

        function htmlEscape(text) {
            return text.replace(/[<>]&/g, function(match, pos, originalText) {
                switch (match) {
                    case "<":
                        return "&lt;";
                    case ">":
                        return "&gt;";
                    case "&":
                        return "&amp;";
                    case "\"":
                    return "&quot;";
                }
            });
        }
 alert(htmlEscape("<p class=\"greeting\">Hello world!</p>")); 
//&lt;p class=&quot;"greeting&quot;"&gt;Hello world!&lt;/p&gt;

 **split()**方法,这个方法可以基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中。分隔符可以使字符串,也可以是RegExp对象(这个方法不会将字符串看成正则表达式)。split()方法可以接受第二个参数,用于指定数组的大小以便确保返回的数组不会超过既定大小。

var colorText = "red,blue,green,yellow";
var colors1 = colorText.split(","); //["red", "blue", "green", "yellow"]
var colors2 = colorText.split(",",2); //["red", "blue"]
var colors3 = colorText.split(/[^\,]+/); //["", ",", ",", ",", ""]
  • 7. localeCompare()方法

localeCompare()这多少个点子相比较两个字符串,并赶回下列值中的一个:

  • 只要字符串在字母表中排在字符串参数此前,再次来到一个负数(大多数是-1,具体视情形而定);
  • 设若字符串等于字符串参数,重返0;
  • 假设字符串在字母表中排在字符串参数之后,重临一个正数(大多数是1,具体视意况而定);

var stringValue = "yellow";
alert(stringValue.localeCompare("brick")); //1
alert(stringValue.localeCompare("yellow")); //0
alert(stringValue.localeCompare("zoo")); //-1

function determineOrder(value) {
    var result stringValue.localeCompare(value);
    if(value<0){
        alert("The string 'yellow' comes before the string '"+value+"'.");
    }else if(value>0){
        alert("The string 'yellow' comes after the string '"+value+"'.");       
    }else{
                alert("The string 'yellow' comes equal the string '"+value+"'.");

    }
}
determineOrder("brick");
determineOrder("yellow");
determineOrder("zoo");
  • 8. fromCharCode()方法
    String构造函数本身还有一个静态方法:fromCharCode()。这么些办法的职责是接到一或三个字符编码,然后将它们转换成一个字符串。这么些主意与实例方法charCodeAt()执行相反的操作。

 alert(String.fromCharCode(104, 101, 108, 108, 111));//"hello"