海拔5.6 基本包装档次

为了好操作基本项目值,ECMAScript还提供了3单例外的援类型:Boolean,Number,String.

事实上,每当读取一个基本类型值的时刻,后台应付创建一个相应的中坚包装档次的目标,从而为咱们会调用一些主意来操作这些数据.

var s1="some text";
    var s2=s1.substring(2);
    console.log(s2);//me text

以此事例中s1富含了一个字符串,字符串是中心类型值.第二尽调用了s1的subsstring()方法,并拿回到的结果保存在了s2中.

当第二执行代码访问s1时时,,访问过程处于相同种植读取模式,也尽管是一旦自外存中读取这个字符串的值.而当读取模式遭遇做客字符串时,后台会自动就下列处理.

(1)创建String类型的一个实例;

(2)在实例上调用指定的方法;

(3)销毁之实例.

好以以上三只步骤想象变为是实施了下列代码:

var s1=new String("some text");
    var s2=s1.substring(2);
    s1=null;
    console.log(s2);//me text

通过此番拍卖,基本的字符串值就更换得与对象同了.而且上面三只步骤为各自适用于Boolean和Number类型对应之布尔值和数字值.

引用类型及中心包装档次的要分就是目标的活着期.

用new操作符创建的援类型的实例,在履行流离开当前作用域之前还一起保存在内存中.而活动创建的主干包装档次的对象,则只在叫一行代码的实行瞬间,然后随即让销毁.这表示我们无能够以运转时为主干项目上加属性和方法.

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

题材的原委就是次实践创建的String对象在实施第三履代码时已于销毁了.老三执代码又创造好的String对象,而拖欠目标没color属性.

针对核心包装档次的实例调用typeof会返回”object”,而且装有骨干包装档次的对象还见面吃移为布尔值true.

Object构造函数也会见如工厂方法同样,根据传入值的类型返回相应基本包装档次的实例.

var obj=new Object("some text");
    console.log(obj instanceof String);//true

将字符串传于Object构造函数,就会见创造String的实例,而盛传数值参数会取得Number的实例,传入布尔值参数就会见得到Boolean的实例.

要小心的是,使用new调用为重包装档次的构造函数,与一直调用同名的转型函数是免雷同的.

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

    var obj=new Number(value);//构造函数
    console.log(typeof obj);//object

每当是例子中,变量number中保存的凡核心型的价值25,而变量obj中保留的凡Number的实例.

5.6.1 Boolean类型

Boolean类型是跟布尔值对应的援类型.要开创Boolean对象,可以像下这样调用Boolean构造函数并传到true或false值.

var booleanObject=new Boolean(true);

Boolean类型的实例更写了valueOf()方法,返回基本类型值true或false;重写了toString()方法,返回字符串”true”和”false”.可是,Boolean对象在ECMAScript中的用不老,因为她时时会造成人们的误解.

内部最为广泛的问题是在布尔表达式中动用Boolean对象.

var falseObject=new Boolean(false);
    var result=falseObject&&true;
    console.log(result);//true

    var falseValue=false;
    result=falseValue&&true;
    console.log(result);//false

每当是事例中,使用false值创建了一个Boolean对象.然后用以此目标同主导类型值true构造了逻辑和表达式.示例中这行代码是对准falseObject而未是它们的值(false)进行呼吁值.布尔表达式中有目标都见面于撤换成为true,因此falseObject对象在布尔表达式中象征的是true.

骨干型以及援类型的布尔值还有零星个区别:首先,typeof操作对中心项目返回”boolean”,而针对性援类型返回”object”.其次,由于
Boolean对象是Boolean类型的实例,所以使用instanceof操作符测试Boolean对象会返回true,而测试中心型的布尔值则赶回false.

console.log(typeof falseObject);//object
    console.log(typeof falseValue);//boolean
    console.log(falseObject instanceof Boolean);//true
    console.log(falseValue instanceof Boolean);//false

5.6.2 Number类型

Number是跟数字值对应的援类型.要创Number对象,可以以调用Number构造函数时向其中传递相应的数值.

var numberObject=new Number(10);
    console.log(typeof numberObject);//object

与Boolean类型一样,Number类型也再度写了valueOf(),toLocaleString()和toString()方法.

重写后底valueOf()方法返回对象表壳的中心类型的数值,另外两个措施则回字符串形式的数值.

足为toString()方法传递一个意味基数的参数,告诉她回到几迈入制数值的字符串形式.

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

除了继续的不二法门之外,Number类型还提供了部分用以将数值格式化为字符串的方法.

内部,toFixed()方法会按照指定的有点数位返回数值的字符串表示.

var num=10;
    console.log(num.toFixed(2));//10.00

这里被toFixed()方法传入了数值2,意思是显示几乎各项有点数.以0填补了必需之小数位.

假设数值本身富含的小数员比指定的还多,那么看似指定的最好老小数位的值就是会舍入.

var num=10.007;
    console.log(num.toFixed(2));//10.01

可知自行舍入的特点,使得toFixed()方法很符合处理货币值.但需专注的是,不同浏览器被此方式设定的舍入规则可能会见有所不同.在给toFixed()传入0的图景下,IE8及前的版不可知科学舍入范围以{(-0.94,-0.5],[0.5,0.94)}之间的值.对于此界定外之价值,IE会返回0,而休是-1要1;其他浏览器还能够回正确的值.IE9修复了这问题.

除此以外可用以格式
化数值的方法是toExponential(),该办法返回以指数表示法(也称e表示拟)表示数值的字符串形式.与toFixed()方法同样,toExponential()也接受一个参数,而且该参数同样为是点名输出结果遭到之略微数员数.

var num=10;
    console.log(num.toExponential(1));//1.0e+1

于一个数值来说,toPrecision()方法恐怕会见返回固定大小(fixed)格式,也或回指定(exponential)格式;具体规则是圈啦种格式最合适.这个艺术接收一个参数,即意味着数值的所有数字之位数(不包括指数部分).

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

仲执行是为此同一各数来表示99,第三实施是因此简单员数来代表,第四履是用三位数来表示.

实则,toPrecision()会根据要拍卖的数值决定到底是调用toFixed()还是调用toExponential(),而立即三单点子都得以透过发展或朝向下舍入,做到为无限纯正的样式来代表带有正确小数各类的值.

toPrecision()方法可展现1到21各有点数.

依然未建议直接实例化Number类型.具体来讲,就是在采取typeof和instanceof操作符测试中心类型数值与援类型数值时,得到的结果完全不同.

var numberObject=new Number(10);
    var numberValue=10;
    console.log(typeof numberObject);//object
    console.log(typeof numberValue);//number
    console.log(numberObject instanceof Number);//true
    console.log(numberValue instanceof Number);//false

于行使typeof操作符测试中心类型数值时,始终会回”number”,而在测试Number对象时,则会回到”object”.类似地,Number对象是Number类型的实例,而基本项目的数值则非是.

5.6.3 String类型

String类型是字符串的对象包装档次,可以像下这样以String构造函数来创建.

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

String对象的方吧得以于享有中心的字符串值中做客到.其中,继承的valueOf(),toLoaleString()和toString()方法,都回来对象所代表的基本字符串值.

String类型的每个实例都出一个length属性,表示字符串包含多单字符.

var stringValue="hello world";
    console.log(stringValue.length);

应该注意的凡,即使字符串中蕴含对配节约字符(不是占用一个字节的ASCII字符),每个字符也仍算一个字符.

1.字符办法

零星个用于访问字符串中一定字符的方是:charAt()和charCodeAt().这简单只点子都收到一个参数,即基于0的许符位置.

charAt()方法为单字符字符串的形式返回给定位置的好字符.

若果想博得的不是字符而是字符编码,就需要动用charCodeAt()了.

ECMAScript还定义了任何一个看个别字符的方法.在支撑是措施的浏览器被,可以运用方括号加数字索引来访问字符串中之一定字符.

var stringValue="hello world";
    console.log(stringValue[1]);//e

应用方括号表示法访问个别字符的语法得到了IE8及FF,Safari,Chrome和Opera所有版本的支持.如果当IE7及重新早版本中应用这种语法,会返回undefined值.

2.字符串操作方法

concat(),用于将同一要多独字符串拼接起来,返回拼接得到的初字符串.

var stringValue="hello";
    var result=stringValue.concat("world");
    console.log(result);//helloworld
    console.log(stringValue);//hello

concat()返回一个拼接的字符串,不转原数组的值.它好承受任意多个参数,也就是说可以通过它拼接任意多只字符串.

var stringValue="hello";
    var result=stringValue.concat("world","!")
    console.log(result);//hellowworld!
    console.log(stringValue);//hello

尽管如此concat()是专程用来并接字符串的计,但执行备受行使重复多的尚是加号操作符(+).而且,使用加号操作符在大部情景下都于下concat()方法要方便易行(特别是在拼接多只字符串的景下).

ECMAScript还提供了三单依据子字符串创建新字符串的办法:slice(),substr()和substring().

即时三只方式都见面返回给操作字符串的一个子字符串,而且也都领受平等还是零星单参数.第一单参数指定子字符串的启幕位置,第二独参数(在指定的景下)表示子字符串到乌结束.slice()和substring()的第二单参数指定的是子字符串最后一个字符后面的位置.而substr()的亚独参数指定的尽管是返的字符个数.如果没有吃这些措施传递第二单参数,则用字符串的长作为完结位置.与concat()方法一致,slice(),substr()和substring()也不见面修改字符串本身的值–它们只是返回一个主干型的字符串值,对原始字符串没有另外影响.

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

substr()返回”lo worl”,因为她的亚独参数指定的凡一旦回来的字符个数.

每当传递给这些艺术的参数是负值的情景下,slice()方法会将盛传的负值与字符串的尺寸相加,substr()方法以借助的首先个参数加上字符串的长度,而用依靠的次只参数转换为0.末段,substring()方法会管所有负值参数都变为0.

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

小心:IE的JavaScript实现以拍卖为substr()方法传递负值的情常常是问题,它见面回原的字符串.IE9修复了之问题.

当次只参数是负值时,三独主意的表现各不相同.slice()方法会拿第二个参数转换成7,substring()方法会把第二单参数转换为0,而鉴于此方法会将略的往往作为开位置,将于生之高频作为完结位置.substr()也会见以第二单参数转换成0,也不怕象征返回包含零独字符的字符串,也就是一个空字符串.

3.字符串位置方法

来一定量独可以自字符串中查找子字符串的方:indexOf()和lastIndexOf().这简单单方式都是起一个字符串中找找给定的子字符串,然后返子字符串的位置(如果无找到该字符串,则归-1).

indexOf()方法从字符串的发端为后搜索子字符串,而lastIndexOf()方法是打字符串的最后向前搜索子字符串.

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

假使”o”在斯字符串中单单出现相同糟,那么indexOf()和lastIndexOf()会返回相同之位置值.

及时点儿单章程都得以吸收可挑选的亚独参数,表示从今字符串中之谁岗位上马搜索.换句话说,indexOf()会起该参数指定的职务于后查找,忽小该岗位之前的享有字符;而lastIndexOf()则会由指定的底职上搜索,忽小该位置然后的备字符.

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

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);
    }

    console.log(positions);//[3,24,32,35,52]

这事例通过持续加码indexOf()方法开始查找的职务,遍历了一个长字符串.于循环外,首先找到了”e”在字符串中之开端位置,而上循环后,则每次都受indexOf()传递及亦然不行的职务加1.如此,就保险了历次找还打达到同样蹩脚找到的子字符串的尾开始.每次找返回的职依次给保存在屡组positions中,以便将来使用.

4.trim()方法

ECMAScript
5啊拥有字符串定义了trim()方法.这个方法会创建一个字符串的副本,删除前置及后缀的兼具空格,然后回结果.

var stringValue="   hello world   ";
    var trimmedStringValue=stringValue.trim();
    console.log(stringValue);//   hello world   
    console.log(trimmedStringValue);//hello world

由trim()返回的是字符串的副本,所以原始字符串中的放开及后缀空格会保持无变.支持这个措施的浏览器有IE9+,FF3.5+,Safari5+,Opera
10.5+和Chrome.此外,FF3.5+,Safari 5+和Chrome
8+还支持非标准的trimLeft()和trimRight()方法,分别用于去字符串开头和结尾的空格.

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

ECMAScript中涉嫌字符串大小写转换的道发生4独:toLowerCase(),toLocaleLowerCase(),toUpperCase()和toLocaleUpperCase().

var stringValue="hello world";
    console.log(stringValue.toLocaleUpperCase());//HELLO WORLD
    console.log(stringValue.toUpperCase());//HELLO  WORLD
    console.log(stringValue.toLocaleLowerCase());//hello world
    console.log(stringValue.toLowerCase());//hello world

相似的话,在无掌握自己之代码用于啊种语言环境被运作的状况下,还是用对地区的法子更稳妥一些.

6.字符串的模式匹配方法

String类型定义了几乎单用于在字符串中相当模式之方法.第一独办法就是是match(),在字符串上调用这个办法,本质上和调用RegExp的exec()方法相同.match()方法只有领一个参数,要么是一个正则表达式,要么是一个RegExp对象.

var text="cat,bat,sat,fat";
    var pattern=/.at/;

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

本例中的match()方法返回了一个数组;如果是调用RegExp对象的exec()方法并传递本例中之字符串作为参数,那么为会见取得同这如出一辙之数组:数组的第一起是跟整个模式匹配的字符串,之后的每一样桩(如果发生)保存在同正则表达式中之捕获组匹配的字符串.

外一个用于查找模式之方法是search().这个艺术的唯一参数与match()方法的参数相同:由字符串或RegExp对象指定的一个正则表达式.search()方法返回字符串中第一独相当配项的目录;如果没找到匹配项,则归-1.而且,search()方法始终是由字符串开头为后查找模式.

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

以简化替换子字符串的操作,ECMAScript提供了replace()方法.这个法子接受两个参数:第一个参数可以是一个RegExp对象或一个字符串(这个字符串不会见于换成为正则表达式),第二独参数可以是一个字符串或者一个函数.如果第一单参数是字符串,那么就会交替第一只子字符串.要想替换所有子字符串,唯一的方尽管是供一个正则表达式,而且一旦指定全局(g)标志.

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

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

后面是经过以首先单参数修改也含有全局标志的正则表达式,就拿全方位”at”都替换成了”ond”.

一旦第二只参数是字符串,那么还好动用部分非同寻常的字符序列,将正则表达式操作得到的价插入到结果字符串中.

下列有了ECMAScript提供的这些特别的字符序列.

字符序列 替换文本
$$ $
$& 匹配整个模式的子字符串.与RegExp.lastMatch的值相同
$’ 匹配的子字符串之前的子字符串.与RegExp.leftContext的值相同
$` 匹配的子字符串之后的子字符串.与RegExp.rightContext的值相同
$n 匹配第n个捕获组的子字符串,其中n等于0~9.例如,$1是匹配第一个捕获组的子字符串,$2是匹配第二个捕获组的子字符串.以此类推.如果正则表达式中没有定义捕获组,则使用空字符串
$nn 匹配第nn个捕获组的子字符串,其中nn等于01~99.例如,$01是匹配第一个捕获组的子字符串,$02是匹配第二个捕获组的子字符串,以此类推.如果正则表达式中没有定义捕获组,则使用空字符串

透过这些特殊的字符序列,可以使用以来一律次于匹配结果遭遇的内容.

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

当斯,每个以”.at”结尾的单词都于调换了,替换结果是”word”后和同针对性圆括号,而圆括号丁凡深受字符序列$1所替换的单词.

replace()方法的亚独参数为得是一个函数.在才发一个匹配配项(即同模式匹配的字符串)的状态下,会向此函数传递3独函数:模式之匹配项,模式匹配项于字符串的职务和原始字符串.在正则表达式中定义了多只捕获组的动静下,传递让函数的参数
依次是模式之匹配项,第一个捕获组的匹配项,第二单捕获组的匹配项….,但结尾两只参数还各自是模式的相当项在字符串中之位置以及原始字符串.这个函数应该归一个字符串,表示应该叫调换的相当项下函数作为replace()方法的亚独参数可以兑现更精致的更迭操作.

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;";
            }
        });
    }

    console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>*"));//&lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt;*

此处,我们也插入HTML代码定义了函数htmlEscape(),这个函数能够转义4只字符:小于号,大于号,和号及双引号.实现这种转义的无比简单易行方法,就是行使正则表达式查找这几乎单字符,然后定义一个可知对每个匹配的字符返回特定HTML实例的函数.

末一个暨模式匹配有关的措施是split(),这个点子可以根据指定的相间符将一个字符串分割成多个子字符串,并以结果在一个数组中.分隔符可以是字符串,也可是一个RegExp对象(这个方法不见面拿字符串看成正则表达式).split()方法好承受可选的第二单参数,用于指定数组的大小,以便确保归的数组不见面跳既定大小.

var colorText="red,blue,green,yellow";
    var color1=colorText.split(",");
    console.log(color1);//["red", "blue", "green", "yellow"]
    var color2=colorText.split(",",2);
    console.log(color2);//["red", "blue"]
    var color3=colorText.split(/[^\,]+/);
    console.log(color3);//["", ",", ",", ",", ""]

在末一次调动用split()返回的数组中,第一宗与最终一宗是鲜单空字符串.之所以会这么,是盖经正则表达式指定的相间符出现在了字符串的发端(即子字符串”red”)和尾声(即子字符串”yellow”).

对split()中正则表达式的支撑以浏览器而异.尽管对于简易的模式尚未啊区别,但对非发现匹配项以及含有捕获组的模式,匹配的行即便未坏相同了.以下是几乎种觉的差别.

IE8及之前的版本会忽略捕获组.IE9能科学地以结果丁含有捕获组.

FF3.6及之前版本在破获组未找到匹配项时,会以结果数组中隐含空字符串;ECMA-262规定没有匹配项的捕获组在结果数组中应当据此undefined表示.

在正则表达式中应用捕获组时尚产生外微妙之差别.

7.localeCompare()方法

以此方式较有限只字符串,并赶回下列值中的一个:

而字符串在字母表中该排除在字符串参数之前,则归一个负数(大多数气象下是-1,具体的值如果看落实而定)

一旦字符串等于字符串参数,则回0.

若果字符串在字母表中应破除在字符串参数后,则回一个正数(大多数景下是1,具体的值同样如果见到落实而定)

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

因localeCompare()返回的数值在实现,所以最是如下例子所著之这么以此方法.

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

    determineOrder("brick");
    determineOrder("yellow");
    determineOrder("zoo");

8.fromCharCode()方法

另外,String构造函数还有一个静态方法:fromCharCode().这个办法的任务是收纳一或者多个字符编码,然后以它转换成为一个字符串.从本质上来拘禁,这个法及实例方法charCodeAt()执行的是倒的操作.