JavaScript String 對象

2023-03-20 15:53 更新

概述

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

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

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

s2.valueOf() // "abc"

上面代碼中,變量s1是字符串,s2是對象。由于s2是字符串對象,s2.valueOf方法返回的就是它所對應的原始字符串。

字符串對象是一個類似數(shù)組的對象(很像數(shù)組,但不是數(shù)組)。

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

(new String('abc'))[1] // "b"

上面代碼中,字符串abc對應的字符串對象,有數(shù)值鍵(0、1、2)和length屬性,所以可以像數(shù)組那樣取值。

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

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

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

靜態(tài)方法

String.fromCharCode()

String對象提供的靜態(tài)方法(即定義在對象本身,而不是定義在對象實例的方法),主要是String.fromCharCode()。該方法的參數(shù)是一個或多個數(shù)值,代表 Unicode 碼點,返回值是這些碼點組成的字符串。

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

上面代碼中,String.fromCharCode方法的參數(shù)為空,就返回空字符串;否則,返回參數(shù)對應的 Unicode 字符串。

注意,該方法不支持 Unicode 碼點大于0xFFFF的字符,即傳入的參數(shù)不能大于0xFFFF(即十進制的 65535)。

String.fromCharCode(0x20BB7)
// "?"
String.fromCharCode(0x20BB7) === String.fromCharCode(0x0BB7)
// true

上面代碼中,String.fromCharCode參數(shù)0x20BB7大于0xFFFF,導致返回結果出錯。0x20BB7對應的字符是漢字,但是返回結果卻是另一個字符(碼點0x0BB7)。這是因為String.fromCharCode發(fā)現(xiàn)參數(shù)值大于0xFFFF,就會忽略多出的位(即忽略0x20BB7里面的2)。

這種現(xiàn)象的根本原因在于,碼點大于0xFFFF的字符占用四個字節(jié),而 JavaScript 默認支持兩個字節(jié)的字符。這種情況下,必須把0x20BB7拆成兩個字符表示。

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

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

實例屬性

String.prototype.length

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

'abc'.length // 3

實例方法

String.prototype.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) // ""

String.prototype.charCodeAt()

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

'abc'.charCodeAt(1) // 98

上面代碼中,abc1號位置的字符是b,它的 Unicode 碼點是98。

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

'abc'.charCodeAt() // 97

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

'abc'.charCodeAt(-1) // NaN
'abc'.charCodeAt(4) // NaN

注意,charCodeAt方法返回的 Unicode 碼點不會大于65536(0xFFFF),也就是說,只返回兩個字節(jié)的字符的碼點。如果遇到碼點大于 65536 的字符(四個字節(jié)的字符),必須連續(xù)使用兩次charCodeAt,不僅讀入charCodeAt(i),還要讀入charCodeAt(i+1),將兩個值放在一起,才能得到準確的字符。

String.prototype.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)換類型,所以返回的是一個兩個字符的字符串。

String.prototype.slice()

slice()方法用于從原字符串取出子字符串并返回,不改變原字符串。它的第一個參數(shù)是子字符串的開始位置,第二個參數(shù)是子字符串的結束位置(不含該位置)。

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

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

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

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

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

如果第一個參數(shù)大于第二個參數(shù)(正數(shù)情況下),slice()方法返回一個空字符串。

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

String.prototype.substring()

substring方法用于從原字符串取出子字符串并返回,不改變原字符串,跟slice方法很相像。它的第一個參數(shù)表示子字符串的開始位置,第二個位置表示結束位置(返回結果不含該位置)。

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

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

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

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

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

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

如果參數(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

由于這些規(guī)則違反直覺,因此不建議使用substring方法,應該優(yōu)先使用slice。

String.prototype.substr()

substr方法用于從原字符串取出子字符串并返回,不改變原字符串,跟slicesubstring方法的作用相同。

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

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

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

'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,所以返回空字符串。

String.prototype.indexOf(),String.prototype.lastIndexOf()

indexOf方法用于確定一個字符串在另一個字符串中第一次出現(xiàn)的位置,返回結果是匹配開始的位置。如果返回-1,就表示不匹配。

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

indexOf方法還可以接受第二個參數(shù),表示從該位置開始向后匹配。

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

lastIndexOf方法的用法跟indexOf方法一致,主要的區(qū)別是lastIndexOf從尾部開始匹配,indexOf則是從頭部開始匹配。

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

另外,lastIndexOf的第二個參數(shù)表示從該位置起向前匹配。

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

String.prototype.trim()

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

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

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

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

String.prototype.toLowerCase(),String.prototype.toUpperCase()

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

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

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

String.prototype.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ù),詳見《正則表達式》一章。

String.prototype.search(),String.prototype.replace()

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

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

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

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

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

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

String.prototype.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ī)則的部分處于字符串的開頭或結尾(即它的前面或后面沒有其他字符),則返回數(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é)。

String.prototype.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,表示B較大。

localeCompare還可以有第二個參數(shù),指定所使用的語言(默認是英語),然后根據(jù)該語言的規(guī)則進行比較。

'?'.localeCompare('z', 'de') // -1
'?'.localeCompare('z', 'sv') // 1

上面代碼中,de表示德語,sv表示瑞典語。德語中,?小于z,所以返回-1;瑞典語中,?大于z,所以返回1

參考鏈接


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號