String對象

概述

String對象是JavaScript原生提供的三個包裝對象之一,用來生成字符串的包裝對象榜配。

var s1 = 'abc';
var s2 = new String('abc');

typeof s1 // "string"
typeof s2 // "object"

s2.valueOf() // "abc"

上面代碼中否纬,變量s1是字符串,s2是對象蛋褥。由于s2是對象临燃,所以有自己的方法,valueOf方法返回的就是它所包裝的那個字符串烙心。

實際上膜廊,字符串的包裝對象是一個類似數(shù)組的對象(即很像數(shù)組,但是實質(zhì)上不是數(shù)組)淫茵。

new String("abc")
// String {0: "a", 1: "b", 2: "c", length: 3}

除了用作構(gòu)造函數(shù)爪瓜,String對象還可以當作工具方法使用,將任意類型的值轉(zhuǎn)為字符串匙瘪。

String(true) // "true"
String(5) // "5"

上面代碼將布爾值ture和數(shù)值5铆铆,分別轉(zhuǎn)換為字符串。

String.fromCharCode()

String對象提供的靜態(tài)方法(即定義在對象本身丹喻,而不是定義在對象實例的方法)薄货,主要是fromCharCode()。該方法的參數(shù)是一系列Unicode碼點驻啤,返回對應的字符串菲驴。

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

上面代碼中,fromCharCode方法接受5個Unicode碼點作為參數(shù)骑冗,返回它們組成的字符串赊瞬。

注意先煎,該方法不支持Unicode碼點大于0xFFFF的字符,即傳入的參數(shù)不能大于0xFFFF巧涧。

String.fromCharCode(0x20BB7)
// "?"

上面代碼返回字符的編號是0x0BB7薯蝎,而不是0x20BB7。它的根本原因在于谤绳,碼點大于0xFFFF的字符占用四個字節(jié)占锯,而JavaScript只支持兩個字節(jié)的字符。這種情況下缩筛,必須把0x20BB7拆成兩個字符表示消略。

String.fromCharCode(0xD842, 0xDFB7)
// "??"

上面代碼中,0x20BB7拆成兩個字符0xD8420xDFB7(即兩個兩字節(jié)字符瞎抛,合成一個四字節(jié)字符)艺演,就能得到正確的結(jié)果。碼點大于0xFFFF的字符的四字節(jié)表示法桐臊,由UTF-16編碼方法決定胎撤。

實例對象的屬性和方法

length屬性

length屬性返回字符串的長度。

'abc'.length // 3

charAt()

charAt方法返回指定位置的字符断凶,參數(shù)是從0開始編號的位置伤提。

var s = new String('abc');

s.charAt(1) // "b"
s.charAt(s.length - 1) // "c"

這個方法完全可以用數(shù)組下標替代。

'abc'.charAt(1) // "b"
'abc'[1] // "b"

如果參數(shù)為負數(shù)认烁,或大于等于字符串的長度肿男,charAt返回空字符串。

'abc'.charAt(-1) // ""
'abc'.charAt(3) // ""

charCodeAt()

charCodeAt方法返回給定位置字符的Unicode碼點(十進制表示)砚著,相當于String.fromCharCode()的逆操作次伶。

'abc'.charCodeAt(1) // 98

上面代碼中痴昧,abc1號位置的字符是b稽穆,它的Unicode碼點是98

如果沒有任何參數(shù)赶撰,charCodeAt返回首字符的Unicode碼點舌镶。

'abc'.charCodeAt() // 97

上面代碼中,首字符a的Unicode編號是97豪娜。

需要注意的是餐胀,charCodeAt方法返回的Unicode碼點不大于65536(0xFFFF),也就是說瘤载,只返回兩個字節(jié)的字符的碼點否灾。如果遇到Unicode碼點大于65536的字符,必需連續(xù)使用兩次charCodeAt鸣奔,不僅讀入charCodeAt(i)墨技,還要讀入charCodeAt(i+1)惩阶,將兩個16字節(jié)放在一起,才能得到準確的字符扣汪。

如果參數(shù)為負數(shù)断楷,或大于等于字符串的長度,charCodeAt返回NaN崭别。

concat()

concat方法用于連接兩個字符串冬筒,返回一個新字符串,不改變原字符串茅主。

var s1 = 'abc';
var s2 = 'def';

s1.concat(s2) // "abcdef"
s1 // "abc"

該方法可以接受多個參數(shù)舞痰。

'a'.concat('b', 'c') // "abc"

如果參數(shù)不是字符串,concat方法會將其先轉(zhuǎn)為字符串诀姚,然后再連接匀奏。

var one = 1;
var two = 2;
var three = '3';

''.concat(one, two, three) // "123"
one + two + three // "33"

上面代碼中,concat方法將參數(shù)先轉(zhuǎn)成字符串再連接学搜,所以返回的是一個三個字符的字符串娃善。作為對比,加號運算符在兩個運算數(shù)都是數(shù)值時瑞佩,不會轉(zhuǎn)換類型聚磺,所以返回的是一個兩個字符的字符串。

slice()

slice方法用于從原字符串取出子字符串并返回炬丸,不改變原字符串瘫寝。

它的第一個參數(shù)是子字符串的開始位置,第二個參數(shù)是子字符串的結(jié)束位置(不含該位置)稠炬。

'JavaScript'.slice(0, 4) // "Java"

如果省略第二個參數(shù)焕阿,則表示子字符串一直到原字符串結(jié)束。

'JavaScript'.slice(4) // "Script"

如果參數(shù)是負值首启,表示從結(jié)尾開始倒數(shù)計算的位置暮屡,即該負值加上字符串長度。

'JavaScript'.slice(-6) // "Script"
'JavaScript'.slice(0, -6) // "Java"
'JavaScript'.slice(-2, -1) // "p"

如果第一個參數(shù)大于第二個參數(shù)毅桃,slice方法返回一個空字符串褒纲。

'JavaScript'.slice(2, 1) // ""

substring()

substring方法用于從原字符串取出子字符串并返回,不改變原字符串钥飞。它與slice作用相同莺掠,但有一些奇怪的規(guī)則,因此不建議使用這個方法读宙,優(yōu)先使用slice彻秆。

substring方法的第一個參數(shù)表示子字符串的開始位置,第二個位置表示結(jié)束位置。

'JavaScript'.substring(0, 4) // "Java"

如果省略第二個參數(shù)唇兑,則表示子字符串一直到原字符串的結(jié)束墓律。

'JavaScript'.substring(4) // "Script"

如果第二個參數(shù)大于第一個參數(shù),substring方法會自動更換兩個參數(shù)的位置幔亥。

'JavaScript'.substring(10, 4) // "Script"
// 等同于
'JavaScript'.substring(4, 10) // "Script"

上面代碼中耻讽,調(diào)換substring方法的兩個參數(shù),都得到同樣的結(jié)果帕棉。

如果參數(shù)是負數(shù)针肥,substring方法會自動將負數(shù)轉(zhuǎn)為0。

'Javascript'.substring(-3) // "JavaScript"
'JavaScript'.substring(4, -3) // "Java"

上面代碼的第二個例子香伴,參數(shù)-3會自動變成0慰枕,等同于'JavaScript'.substring(4, 0)。由于第二個參數(shù)小于第一個參數(shù)即纲,會自動互換位置具帮,所以返回Java

substr()

substr方法用于從原字符串取出子字符串并返回低斋,不改變原字符串蜂厅。

substr方法的第一個參數(shù)是子字符串的開始位置,第二個參數(shù)是子字符串的長度膊畴。

'JavaScript'.substr(4, 6) // "Script"

如果省略第二個參數(shù)掘猿,則表示子字符串一直到原字符串的結(jié)束。

'JavaScript'.substr(4) // "Script"

如果第一個參數(shù)是負數(shù)唇跨,表示倒數(shù)計算的字符位置稠通。如果第二個參數(shù)是負數(shù),將被自動轉(zhuǎn)為0买猖,因此會返回空字符串改橘。

'JavaScript'.substr(-6) // "Script"
'JavaScript'.substr(4, -1) // ""

上面代碼的第二個例子,由于參數(shù)-1自動轉(zhuǎn)為0玉控,表示子字符串長度為0飞主,所以返回空字符串。

indexOf()奸远,lastIndexOf()

這兩個方法用于確定一個字符串在另一個字符串中的位置既棺,都返回一個整數(shù),表示匹配開始的位置懒叛。如果返回-1,就表示不匹配耽梅。兩者的區(qū)別在于薛窥,indexOf從字符串頭部開始匹配,lastIndexOf從尾部開始匹配。

'hello world'.indexOf('o') // 4
'JavaScript'.indexOf('script') // -1

'hello world'.lastIndexOf('o') // 7

它們還可以接受第二個參數(shù)诅迷,對于indexOf方法佩番,第二個參數(shù)表示從該位置開始向后匹配;對于lastIndexOf罢杉,第二個參數(shù)表示從該位置起向前匹配趟畏。

'hello world'.indexOf('o', 6) // 7
'hello world'.lastIndexOf('o', 6) // 4

trim()

trim方法用于去除字符串兩端的空格,返回一個新字符串滩租,不改變原字符串赋秀。

'  hello world  '.trim()
// "hello world"

該方法去除的不僅是空格,還包括制表符(\t律想、\v)猎莲、換行符(\n)和回車符(\r)。

'\r\nabc \t'.trim() // 'abc'

toLowerCase()技即,toUpperCase()

toLowerCase方法用于將一個字符串全部轉(zhuǎn)為小寫著洼,toUpperCase則是全部轉(zhuǎn)為大寫。它們都返回一個新字符串而叼,不改變原字符串身笤。

'Hello World'.toLowerCase()
// "hello world"

'Hello World'.toUpperCase()
// "HELLO WORLD"

這個方法也可以將布爾值或數(shù)組轉(zhuǎn)為大寫字符串,但是需要通過call方法使用葵陵。

String.prototype.toUpperCase.call(true)
// 'TRUE'
String.prototype.toUpperCase.call(['a', 'b', 'c'])
// 'A,B,C'

localeCompare()

localeCompare方法用于比較兩個字符串展鸡。它返回一個整數(shù),如果小于0埃难,表示第一個字符串小于第二個字符串莹弊;如果等于0,表示兩者相等涡尘;如果大于0忍弛,表示第一個字符串大于第二個字符串。

'apple'.localeCompare('banana')
// -1

'apple'.localeCompare('apple')
// 0

該方法的最大特點考抄,就是會考慮自然語言的順序细疚。舉例來說,正常情況下川梅,大寫的英文字母小于小寫字母疯兼。

'B' > 'a' // false

上面代碼中,字母B小于字母a贫途。這是因為JavaScript采用的是Unicode碼點比較吧彪,B的碼點是66,而a的碼點是97丢早。

但是姨裸,localeCompare方法會考慮自然語言的排序情況秧倾,將B排在a的前面。

'B'.localeCompare('a') // 1

上面代碼中傀缩,localeCompare方法返回整數(shù)1(也有可能返回其他正整數(shù))那先,表示B較大。

match()

match方法用于確定原字符串是否匹配某個子字符串赡艰,返回一個數(shù)組售淡,成員為匹配的第一個字符串。如果沒有找到匹配慷垮,則返回null揖闸。

'cat, bat, sat, fat'.match('at') // ["at"]
'cat, bat, sat, fat'.match('xt') // null

返回數(shù)組還有index屬性和input屬性,分別表示匹配字符串開始的位置和原始字符串换帜。

var matches = 'cat, bat, sat, fat'.match('at');
matches.index // 1
matches.input // "cat, bat, sat, fat"

match方法還可以使用正則表達式作為參數(shù)楔壤,詳見《正則表達式》一節(jié)。

search()

search方法的用法等同于match惯驼,但是返回值為匹配的第一個位置蹲嚣。如果沒有找到匹配,則返回-1祟牲。

'cat, bat, sat, fat'.search('at') // 1

search方法還可以使用正則表達式作為參數(shù)隙畜,詳見《正則表達式》一節(jié)。

replace()

replace方法用于替換匹配的子字符串说贝,一般情況下只替換第一個匹配(除非使用帶有g修飾符的正則表達式)议惰。

'aaa'.replace('a', 'b') // "baa"

replace方法還可以使用正則表達式作為參數(shù),詳見《正則表達式》一節(jié)乡恕。

split()

split方法按照給定規(guī)則分割字符串言询,返回一個由分割出來的子字符串組成的數(shù)組。

'a|b|c'.split('|') // ["a", "b", "c"]

如果分割規(guī)則為空字符串傲宜,則返回數(shù)組的成員是原字符串的每一個字符运杭。

'a|b|c'.split('') // ["a", "|", "b", "|", "c"]

如果省略參數(shù),則返回數(shù)組的唯一成員就是原字符串函卒。

'a|b|c'.split() // ["a|b|c"]

如果滿足分割規(guī)則的兩個部分緊鄰著(即中間沒有其他字符)辆憔,則返回數(shù)組之中會有一個空字符串。

'a||c'.split('|') // ['a', '', 'c']

如果滿足分割規(guī)則的部分處于字符串的開頭或結(jié)尾(即它的前面或后面沒有其他字符)报嵌,則返回數(shù)組的第一個或最后一個成員是一個空字符串虱咧。

'|b|c'.split('|') // ["", "b", "c"]
'a|b|'.split('|') // ["a", "b", ""]

split方法還可以接受第二個參數(shù),限定返回數(shù)組的最大成員數(shù)锚国。

'a|b|c'.split('|', 0) // []
'a|b|c'.split('|', 1) // ["a"]
'a|b|c'.split('|', 2) // ["a", "b"]
'a|b|c'.split('|', 3) // ["a", "b", "c"]
'a|b|c'.split('|', 4) // ["a", "b", "c"]

上面代碼中腕巡,split方法的第二個參數(shù),決定了返回數(shù)組的成員數(shù)跷叉。

split方法還可以使用正則表達式作為參數(shù)逸雹,詳見《正則表達式》一節(jié)营搅。

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末云挟,一起剝皮案震驚了整個濱河市梆砸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌园欣,老刑警劉巖帖世,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沸枯,居然都是意外死亡日矫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門绑榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哪轿,“玉大人,你說我怎么就攤上這事翔怎∏运撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵赤套,是天一觀的道長飘痛。 經(jīng)常有香客問我,道長容握,這世上最難降的妖魔是什么宣脉? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剔氏,結(jié)果婚禮上塑猖,老公的妹妹穿的比我還像新娘。我一直安慰自己谈跛,他們只是感情好羊苟,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著币旧,像睡著了一般践险。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹菱,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天巍虫,我揣著相機與錄音,去河邊找鬼鳍刷。 笑死占遥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的输瓜。 我是一名探鬼主播瓦胎,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼芬萍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搔啊?” 一聲冷哼從身側(cè)響起柬祠,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎负芋,沒想到半個月后漫蛔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旧蛾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年莽龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨天。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毯盈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出病袄,到底是詐尸還是另有隱情搂赋,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布陪拘,位于F島的核電站厂镇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏左刽。R本人自食惡果不足惜捺信,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欠痴。 院中可真熱鬧迄靠,春花似錦、人聲如沸喇辽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菩咨。三九已至吠式,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抽米,已是汗流浹背特占。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留云茸,地道東北人是目。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像标捺,于是被迫代替她去往敵國和親懊纳。 傳聞我的和親對象是個殘疾皇子揉抵,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • String對象是JavaScript原生提供的三個包裝對象之一,用來生成字符串的包裝對象嗤疯。 上面代碼中冤今,變量s1...
    zjh111閱讀 568評論 0 0
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,212評論 0 4
  • String對象的屬性和方法 length屬性 length屬性返回字符串的長度 charAt() charAt方...
    coolheadedY閱讀 410評論 0 0
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,118評論 0 13
  • 那年藥師抱著幼小的黃蓉在雪地里舞劍的情景時常出現(xiàn)在他腦海中身弊。 當時黃蓉三歲辟汰,衛(wèi)蘅死去三年整列敲,藥師仍沉浸在喪妻的傷痛...
    驛馬動閱讀 186評論 0 0