String

前言:javascript

  javascript沒有表示單個字符的字符型,只有字符串String類型,字符型至關於僅包含一個字符的字符串。java

  字符串String是javascript基本數據類型,同時javascript也支持String對象,它是一個原始值的包裝對象。正則表達式

  在須要時,javascript會自動在原始形式和對象形式之間轉換。數組

一、定義:瀏覽器

  字符串String類型是由引號括起來的一組由16位Unicode字符組成的字符序列函數

二、特色:編碼

  javascript中的字符串是不可變的。一旦字符串被建立,就永遠沒法改變它。url

  要改變某個變量保存的字符串,首先要銷燬原來的字符串,而後再用另外一個包含新值的字符串填充該變量spa

能夠經過+運算符鏈接其餘字符串來建立一個新字符串code

var lang = "java";
lang = lang + "script"; //'javascript'

先建立一個可以容納10個字符的新字符串,而後在這個字符串中填充'java'和'script',最後一步是銷燬原來的字符串'java'和'script',由於這兩個字符串已經沒用

三、轉字符串

四、屬性

  字符串String類型的每一個實例都有一個length屬性,表示字符串中的字符個數。因爲字符串是不可變的,因此字符串的長度也不可變

  字符串的length屬性不會在for/in循環中枚舉,也不能經過delete操做符刪除

對於字符串s來講,最後一個字符的索引是s.length - 1

var str = "test";
console.log(str.length);//4
str.length = 6;
console.log(str,str.length);//"test",4

五、方法

【1】訪問字符方法

【chartAt()】

接收一個基於0的字符位置的參數,返回指定位置的字符。當參數爲空或NaN時,默認參數爲0;當參數超出範圍時,則返回一個空字符串

var str = "hello";
console.log(str.charAt(1));//e
console.log(str.charAt(-1));//''
console.log(str.charAt(10));//''
console.log(str.charAt());//h 
console.log(str.charAt(NaN));//h

  charAt()方法涉及到Number()函數的隱式類型轉換若是轉換爲數值,則按照上述規則輸出字符串;若是轉換爲NaN,則輸出第0個字符

var str = "hello";
console.log(str.charAt(true));//'e'
console.log(str.charAt(false));//'h'
console.log(str.charAt('abc'));//'h'
console.log(str.charAt({}));//'h'
console.log(str.charAt([2]));//'l'

x.charAt(pos)與x.substring(pos, pos+1)、x.substr(pos,1)、x.slice(pos,pos+1)的結果相等  

var str = "hello";
console.log(str.charAt(1));//'e'
console.log(str.substring(1,2));//'e'
console.log(str.slice(1,2));//'e'
console.log(str.substr(1,1));//'e'

【charCodeAt()】

  接收一個基於0的字符位置的參數,但返回的是指定位置的字符16位Unicode編碼

  返回值是一個16位的整數,在0-65535之間,即0x0000-0xffff之間。參數爲空或NaN時,默認參數爲0;當參數超出範圍時,則返回NaN

var str = "hello";
console.log(str.charCodeAt());//104
console.log(str.charCodeAt(0));//104
console.log(str.charCodeAt(1));//101
console.log(str.charCodeAt(-1));//NaN
console.log(str.charCodeAt(10));//NaN
console.log(str.charCodeAt(NaN));//104

一樣地,charCodeAt()方法涉及到Number()函數的隱式類型轉換,若是轉換爲數值,則按照上述規則輸出相應值;若是轉換爲NaN,則輸出第0個字符的字符編碼

var str = "hello";
console.log(str.charCodeAt(true));//101
console.log(str.charCodeAt(false));//104
console.log(str.charCodeAt('abc'));//104
console.log(str.charCodeAt({}));//104
console.log(str.charCodeAt([2]));//l08

【fromCharCode()】

  String構造函數自己有一個靜態方法:fromCharCode()。這個方法的任務是接收一個或多個字符編碼,而後把它們轉換成一個字符串

  從本質上看,這個方法與實例方法charCodeAt()執行的是相反的操做。若參數爲空或NaN時,則返回空字符串;若參數超出0-65535的範圍,則輸出字符不可控

console.log(String.fromCharCode(104,101,108,108,111));//'hello'
console.log(String.fromCharCode(0x6211,0x662f,0x5c0f,0x706b,0x67f4));//'我是小火柴'
console.log(String.fromCharCode());//''
console.log(String.fromCharCode(NaN));//''
console.log(String.fromCharCode(-1));
console.log(String.fromCharCode(65560));

//若是一個字符佔用四字節,則須要拆成兩個字符表示
console.log(String.fromCharCode(0xD842, 0xDFB7)); // "𠮷"

【[]】

  ECMAScript5定義了另外一個訪問字符的方法,使用方括號加數字索引來訪問字符串中的特定字符。

  若是參數超出範圍或是NaN時,則輸出undefined;沒有參數時,會報錯;

  該方法沒有Number()轉型函數的隱式類型轉換,但參數爲單數值數組時可轉換爲數值【IE7-瀏覽器不支持】

var str = "hello";
console.log(str[0]);//h
console.log(str[[1]]);//e
console.log(str[false]);//undefined
console.log(str[-1]);//undefined
console.log(str[NaN]);//undefined
console.log(str[]);//報錯

【2】字符拼接

【concat()】

  將一個或多個字符串拼接起來,返回拼接獲得的新字符串,而原字符串不發生改變

  若參數(第一個參數除外)不是字符串,則經過String()方法隱式轉換爲字符串,再進行字符串拼接

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

第一個參數只能是字符串,若是是其餘類型(數組除外)則報錯

(1).concat('2');//報錯
(true).concat('false');//報錯
({}).concat('abc');//報錯

因爲數組也存在concat()方法,參數會按照首先出現的參數是數組仍是字符串來決定如何轉換

'1,2,3,'.concat([4,5]);//'1,2,3,4,5'
[1,2,3].concat(',4,5');//[1, 2, 3, ",4,5"]

【+】

var stringValue = 'hello ';
console.log(stringValue.concat('world','!'));//'hello world!'
console.log(stringValue + 'world' + '!');//'hello world!' 

當操做數其中一個是字符串,或者對象轉換爲字符串時,才進行字符串拼接

1 + 2;//3
'1' + 2;//'12'
var o = {valueOf:function(){return '1';}};
o + 2;//'12'
var o = {valueOf:function(){return 1;}};
o + 2;//3  

【3】建立子字符串

【slice()】

  slice(start,end)方法須要兩個參數start和end,返回這個字符串中從start位置的字符到(但不包含)end位置的字符的一個子字符串。【對原字符串沒有影響

若是end爲undefined或不存在,則返回從start位置到字符串結尾的全部字符

若是start是負數,則start = max(length + start,0)

若是end是負數,則end = max(length + end,0)

var stringValue = 'hello world';
console.log(stringValue.slice());//'hello world'
console.log(stringValue.slice(2));//'llo world'
console.log(stringValue.slice(2,undefined));//'llo world'
console.log(stringValue.slice(2,-5));//'llo '
console.log(stringValue.slice(2,-20));//''
console.log(stringValue.slice(20));//''
console.log(stringValue.slice(-2,2));//''
console.log(stringValue.slice(-2,-20));//''  -----start和end沒法交換位置          
console.log(stringValue.slice(-2,20));//'ld'
console.log(stringValue.slice(-20,2));//'he'
console.log(stringValue.slice(-20,-2));//'hello wor'

slice()方法涉及到Number()轉型函數的隱式類型轉換

當start被轉換爲NaN時,至關於start = 0;當end被轉換爲NaN時(end爲undefined除外,至關於end=length),則輸出空字符串

var stringValue = 'hello world';
console.log(stringValue.slice(NaN));//'hello world'
console.log(stringValue.slice(0,NaN));//''
console.log(stringValue.slice(true,[3]));//'el'
console.log(stringValue.slice(null,undefined));//'hello world'
console.log(stringValue.slice({}));//'hello world'
console.log(stringValue.slice('2',[5]));//'llo'

【substring()】

  substring(start,end)方法須要兩個參數start和end,返回這個字符串中從start位置的字符到(但不包含)end位置的字符的一個子字符串。【對原字符串沒有影響

若是end爲undefined或不存在,則返回從start位置到字符串結尾的全部字符

若是任一參數是NaN或負數,則被0取代

若是任一參數大於字符串長度,則被字符串長度取代

若是start 大於 end,則交換它們的值

var stringValue = 'hello world';
console.log(stringValue.substring());//'hello world'
console.log(stringValue.substring(2));//'llo world'
console.log(stringValue.substring(2,undefined));//'llo world'
console.log(stringValue.substring(20));//''
console.log(stringValue.substring(-2,2));//'he'
console.log(stringValue.substring(NaN,2));//'he'
console.log(stringValue.substring(-2,20));//'hello world'
console.log(stringValue.substring(3,2));//'l'
console.log(stringValue.substring(3,NaN));//'hel'
console.log(stringValue.substring(-20,2));//'he'
console.log(stringValue.substring(-20,-2));//'' 

substring()方法也涉及到Number()轉型函數的隱式類型轉換

var stringValue = 'hello world';
console.log(stringValue.substring(true,[3]));//'el'
console.log(stringValue.substring(null,undefined));//'hello world'
console.log(stringValue.substring({}));//'hello world'
console.log(stringValue.substring('2',[5]));//'llo'

【substr()】-----【對原字符串沒有影響】 

  substr(start,end)方法須要兩個參數start和end,end表明返回的子字符串的字符個數;該方法返回這個字符串中從start位置的字符開始到end個字符的一個子字符串;

若是end爲undefined或不存在,則返回從start位置到字符串結尾的全部字符

若是start是負數,則start = max(length + start,0)

若是start是NaN,則至關於start = 0

若是end是負數或NaN,則end = 0,所以會返回空字符串

start和end沒法交換位置

  [注意]該方法不是ECMAScript標準,已經被棄用

  [注意]IE8-瀏覽器在處理向substr()傳遞負值的狀況時存在問題,它會返回原始的字符串

var stringValue = 'hello world';
console.log(stringValue.substr());//'hello world'
console.log(stringValue.substr(2));//'llo world'
console.log(stringValue.substr(2,undefined));//'llo world'
console.log(stringValue.substr(2,NaN));//''
console.log(stringValue.substr(NaN,2));//'he'
console.log(stringValue.substr(20));//''
console.log(stringValue.substr(-2,3));//'ld'
console.log(stringValue.substr(-2,20));//'ld'
console.log(stringValue.substr(-20,2));//'he'
console.log(stringValue.substr(-20,-2));//''    
console.log(stringValue.substr(2,5));//llo w

  一樣地,substr()方法也涉及到Number()轉型函數的隱式類型轉換

var stringValue = 'hello world';
console.log(stringValue.substr(true,[3]));//'el'
console.log(stringValue.substr(null,undefined));//'hello world'
console.log(stringValue.substr({}));//'hello world'
console.log(stringValue.substr('2',[5]));//'llo w'

 

對於以上三個建立子串的方法來講,若是是空字符串,則不管參數是什麼,仍然返回空字符串

var str = '';
console.log(str.slice(1));//''
console.log(str.substring(1));//''
console.log(str.substr(1));//''

【4】查找子字符串位置--------經過字符串查找位置

【indexOf()】

  indexOf(searchString,start)方法接收searchString和start兩個參數,返回searchString首次出現的位置,若是沒有找到則返回-1。

  searchString表示要搜索的子字符串;start表示該搜索的開始位置,若忽略該參數或該參數爲undefined、NaN或負數時,start = 0

  該方法會隱式調用String()轉型函數,將searchString非字符串值轉換爲字符串隱式調用Number()轉型函數,將start非數字值(undefined除外)轉換爲數值

var string = 'hello world world';
console.log(string.indexOf('ld'));//9
console.log(string.indexOf('ld',undefined));//9
console.log(string.indexOf('ld',NaN));//9
console.log(string.indexOf('ld',-1));//9
console.log(string.indexOf('ld',10));//15
console.log(string.indexOf('ld',[10]));//15
console.log(string.indexOf('true',[10]));//-1
console.log(string.indexOf(false,[10]));//-1

【lastIndexOf()】

  與indexOf()不一樣,lastIndexOf()從右向左查找。

  lastIndexOf(searchString,start)方法接收searchString和start兩個參數,返回searchString第一次出現的位置,若是沒有找到則返回-1

  searchString表示要搜索的子字符串;start表示該搜索的開始位置,若忽略該參數或該參數爲undefined、NaN時,start = length - 1;若start爲負數,start = 0

  一樣地,該方法會隱式調用String()轉型函數,將searchString非字符串值轉換爲字符串;隱式調用Number()轉型函數,將start非數字值(undefined除外)轉換爲數值

var string = 'hello world world';
console.log(string.lastIndexOf('ld'));//15
console.log(string.lastIndexOf('ld',undefined));//15
console.log(string.lastIndexOf('ld',NaN));//15
console.log(string.lastIndexOf('ld',-1));//-1
console.log(string.lastIndexOf('h',-1));//0
console.log(string.lastIndexOf('w',undefined));//12

console.log(string.lastIndexOf('ld',10));//9
console.log(string.lastIndexOf('ld',[10]));//9
console.log(string.lastIndexOf('true',[10]));//-1
console.log(string.lastIndexOf(false,[10]));//-1

查找出字符串全部符合條件的子字符串

function allIndexOf(str,value){
    var result = [];
    var pos = str.indexOf(value);
    while(pos > -1){
        result.push(pos);
        pos = str.indexOf(value,pos+value.length);
    }
    return result;
}
console.log(allIndexOf('helllhelllhelll','ll'));//[2,7,12]

lastIndexOf()方法經常使用於獲取URL地址中的擴展名

var url = "http://cnblogs.com/xiaohuochai.txt";
function getFileFormat(url){
    var pos = url.lastIndexOf('.');
    return url.slice(pos+1);
}
console.log(getFileFormat(url));//'txt'

【5】轉化爲數組

【split()】

  split()方法基於指定的分隔符將一個字符串分割成多個字符串,並將結果放在一個數組中,分隔符能夠是字符串,也能夠是一個RegExp

  該方法能夠接受第二個參數(可選)用於指定數組的大小,若是第二個參數爲0-array.length範圍內的值時按照指定參數輸出,其餘狀況將全部結果都輸出

  若指定分隔符沒有出如今字符串中,則以數組的形式返回原字符串的值

  [注意]參數中的正則表達式是否使用全局標誌g對結果沒有影響

var colorText = 'red,blue,green,yellow';
console.log(colorText.split(''));//["r", "e", "d", ",", "b", "l", "u", "e", ",", "g", "r", "e", "e", "n", ",", "y", "e", "l", "l", "o", "w"]
console.log(colorText.split(','));//["red", "blue", "green", "yellow"]
console.log(colorText.split(',',2));//["red", "blue"]
console.log(colorText.split(',',6));//["red", "blue", "green", "yellow"]
console.log(colorText.split('-'));//["red,blue,green,yellow"]
console.log(colorText.split(/\,/));//["red", "blue", "green", "yellow"]
console.log(colorText.split(/e/));//["r", "d,blu", ",gr", "", "n,y", "llow"]
console.log(colorText.split(/[^\,]+/));//將除去逗號之外的字符串變爲分隔符["", ",", ",", ",", ""],IE8-會識別爲[",",",",","]
相關文章
相關標籤/搜索