海拔5.陆 基本包装档次

为了便于操作基本类型值,ECMAScript还提供了3个奇特的引用类型:Boolean,Number,String.

事实上,每当读取一个基本类型值的时候,后台应付创立1个相应的主干包装档次的靶子,从而让我们能够调用壹些方法来操作那个数据.

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

以此事例中s一暗含了三个字符串,字符串是着力项目值.第3行调用了s一的subsstring()方法,并将重返的结果保存在了s2中.

当第三行代码访问s壹时,,访问进程处于一种读取格局,也正是要从内部存款和储蓄器中读取那个字符串的值.而在读取格局中走访字符串时,后台会自行实现下列处理.

(一)创立String类型的三个实例;

(2)在实例上调用钦点的措施;

(三)销毁那几个实例.

能够将以上四个步骤想象成是奉行了下列代码:

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()方法传递1个表示基数的参数,告诉它回到几进制数值的字符串方式.

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的状态下,IE捌及从前的本子不可能科学舍入范围在{(-0.94,-0.伍],[0.5,0.9四)}之间的值.对于这些限制内的值,IE会重返0,而不是-一或一;其余浏览器都能回来正确的值.IE九修复了那几个难题.

其它可用于格式
化数值的办法是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

第三行是用一个人数来表示9玖,第一行是用两位数来代表,第四行是用2人数来表示.

实则,toPrecision()会根据要拍卖的数值决定到底是调用toFixed()照旧调用toExponential(),而那多少个方式都足以通过升高或向下舍入,做到以最规范的样式来代表带有正确小数位的值.

toPrecision()方法能够表现一到二一位小数.

依然不提出直接实例化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().那八个艺术都收下3个参数,即基于0的字符地点.

charAt()方法以单字符字符串的花样重返给定地方的老大字符.

只要想获取的不是字符而是字符编码,就要求选用charCodeAt()了.

ECMAScript还定义了另二个走访个别字符的方法.在支撑此格局的浏览器中,可以运用方括号加数字索引来访问字符串中的特定字符.

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

使用方括号表示法访问个别字符的语法获得了IE8及FF,Safari,Chrome和Opera全数版本的协助.若是在IE7及更早版本中利用那种语法,会再次来到undefined值.

二.字符串操作方法

concat(),用于将1或多少个字符串拼接起来,返回拼接得到的新字符串.

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().

那八个主意都会回到被操作字符串的贰个子字符串,而且也都承受1或多少个参数.第2个参数内定子字符串的初步地方,第二个参数(在钦点的意况下)表示子字符串到哪儿结束.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()方法传递负值的情事时存在难题,它会重临原始的字符串.IE玖修复了这几个难题.

当第三个参数是负值时,两个艺术的一言一动各分裂.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()传递上三遍的地点加一.那样,就保险了每一遍搜寻都从上二回找到的子字符串的背后开头.每一回搜寻重临的职责依次被保存在数组positions中,以便现在使用.

4.trim()方法

ECMAScript
五为具备字符串定义了trim()方法.那几个方法会成立2个字符串的别本,删除前置及后缀的具有空格,然后回来结果.

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

是因为trim()重回的是字符串的别本,所以原始字符串中的后置及后缀空格会保持不改变.帮助那几个法子的浏览器有IE九+,FF三.五+,Safari5+,Opera
10.5+和Chrome.此外,FF叁.五+,Safari 伍+和Chrome
八+还援助非标准化准的trimLeft()和trimRight()方法,分别用于删除字符串开端和末段的空格.

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

ECMAScript,ECMAScript中提到字符串大小写调换的点子有四个: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

相似的话,在不通晓自个儿的代码将要哪类语言环境中运转的意况下,依然选用针对地方的方式更安妥1些.

六.字符串的格局相称方法

String类型定义了多少个用于在字符串中1二分方式的方法.第叁个章程就是match(),在字符串上调用这些点子,本质上与调用RegExp的exec()方法一样.match()方法只接受一个参数,要么是3个正则表明式,要么是三个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()方法再次回到了2个数组;倘使是调用RegExp对象的exec()方法并传递本例中的字符串作为参数,那么也会获取与此一样的数组:数组的率先项是与整个形式相称的字符串,之后的每一项(假设有)保存着与正则表达式中的捕获组匹配的字符串.

另3个用以查找方式的主意是search().那几个艺术的唯1参数与match()方法的参数同样:由字符串或RegExp对象内定的3个正则表达式.search()方法重返字符串中首先个相称项的目录;尽管未有找到匹配项,则赶回-一.而且,search()方法始终是从字符串初始向后寻找方式.

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

为了简化替换子字符串的操作,ECMAScript提供了replace()方法.这几个法子接受多少个参数:第贰个参数能够是三个RegExp对象或许三个字符串(那么些字符串不会被调换到正则表达式),第3个参数能够是一个字符串恐怕2个函数.若是第三个参数是字符串,那么只会交替第叁个子字符串.要想替换全体子字符串,唯1的格局正是提供贰个正则表达式,而且要钦定全局(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

末尾是通过将第3个参数修改为涵盖全局标记的正则表明式,就将全部”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”后跟一对圆括号,而圆括号中是被字符连串$一所替换的单词.

replace()方法的第二个参数也能够是三个函数.在唯有二个相配项(即与形式相配的字符串)的情状下,会向那几个函数传递二个函数:形式的相配项,形式相称项在字符串的任务和原始字符串.在正则表明式中定义了八个捕获组的情事下,传递给函数的参数
依次是情势的相配项,第一个捕获组的相称项,第三个捕获组的非凡项….,但最后四个参数照旧分别是方式的同盟项在字符串中的地点和原始字符串.这么些函数应该回到二个字符串,表示应该被调换的卓殊项应用函数作为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(),这些函数能够转义四个字符:小于号,大于号,和号以及双引号.实现那种转义的最简单易行方法,正是选择正则表明式查找那多少个字符,然后定义3个可见针对每种相配的字符重临特定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()中正则表明式的支持因浏览器而异.就算对于简易的形式尚未怎么异样,但对此未察觉相配项以及包蕴捕获组的方式,相称的一坐一起就不大一样了.以下是二种觉的差异.

IE捌及在此之前的版本会忽略捕获组.IE9能科学地在结果中带有捕获组.

FF三.陆及前边版本在破获组未找到匹配项时,会在结果数组中富含空字符串;ECMA-26二分明并未有相配项的捕获组在结果数组中应该用undefined表示.

在正则表达式中利用捕获组时还有任何微妙的差距.

7.localeCompare()方法

其1措施比较八个字符串,并赶回下列值中的1个:

要是字符串在字母表中应当排在字符串参数在此以前,则赶回叁个负数(大大多场所下是-壹,具体的值要视落到实处而定)

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

只要字符串在字母表中应该排在字符串参数之后,则赶回3个正数(大很多情景下是一,具体的值同样要视落到实处而定)

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构造函数还有2个静态方法:fromCharCode().那么些措施的职分是接受一或多个字符编码,然后将它们调换到多少个字符串.从精神上来看,那个方式与实例方法charCodeAt()试行的是倒转的操作.