// js中關(guān)于字符串的一些細(xì)節(jié)知識(shí)
// 在js中所用單引號(hào)或者雙引號(hào)包起來(lái)的都是字符串巷送,每一個(gè)字符串是由零到多個(gè)字符組成。
var str = 'hahahahaha';
// str.length -> 字符串長(zhǎng)度
str[0] //-> 'h'
str[str.length-1] //=> 'n'
str[100] //=>undefined
// 字符常中的每一個(gè)字符串都有一個(gè)自己對(duì)應(yīng)位置的索引,也有類(lèi)似于數(shù)組一樣的length代表自己的長(zhǎng)度
// 循環(huán)遍歷輸出每一項(xiàng)
for(var i = 0,i<str.length;i++){
????console.log(str[i])
}
// 關(guān)于字符串中常用的方法
字符串是基本數(shù)據(jù)類(lèi)型沈自,字符串的每一次操作都是值類(lèi)型直接進(jìn)行操作毡代,不像數(shù)組一樣是基于空間地址來(lái)操作的,所以不存在原有字符串是否改變這一說(shuō)间校,肯定是不變的矾克。
### "charAt/charCodeAt"
作用:charAt根據(jù)索引獲取指定位置的字符,charCodeAt不僅僅獲取字符憔足,他獲取的是字符對(duì)應(yīng)的Unicode編碼值(ASC LL碼值)
參數(shù): 索引
返回:字符或者對(duì)應(yīng)的編碼
```
var str = 'qwertyuiopasdfghjklzxcvbnm';
str.charAt(100)? // => ''(空字符串)
str[100]? ? ? ? // => undefined
str.charCodeAt(0)// => 113
String.fromCharCode(122)? // 'z'
charCodeAt返回的字符串對(duì)應(yīng)的編碼
String.fromCharCode返回的是編碼對(duì)應(yīng)的字符
```
### indexOf/lastIndexOf
和數(shù)組的indexOf/lastIndexOf一樣
基于這兩個(gè)方法胁附,可以獲取字符串在字符串中第一次或者最后一個(gè)出現(xiàn)的位置的索引,有這個(gè)字符滓彰,返回大于等于0的索引控妻,不包含這個(gè)字符,返回的結(jié)果是-1揭绑」颍可以驗(yàn)證當(dāng)前字符串是否包含某個(gè)字符。
```
var str = 'qwertyuiopasdfghjklzxcvbnm';
if(str.indexOf('@')>-1){
//=》條件成立他匪,說(shuō)明包含字符串@符號(hào)
}
```
### slice
作用:str.slice(n,m) 從索引n開(kāi)始找到索引m出(不包含m)菇存, 把找到的字符串當(dāng)作新字符串返回
```
var str = 'qwertyuiopasdfghjklzxcvbnm';
str.slice(1,3)? //=>we
```
### substring (字符串截取)
和slice語(yǔ)法一模一樣邦蜜,唯一的區(qū)別在于依鸥,slice支持負(fù)數(shù)索引肋杖。而substring不支持負(fù)數(shù)索引
```
var str = 'qwertyuiopasdfghjklzxcvbnm';
str.substring(1,3)? //=>we
```
### substr
也是字符串截取的方法蝶俱,用法是:str.substr(n,m) 從索引n開(kāi)始截取m個(gè)字符
```
var str = 'qwertyuiopasdfghjklzxcvbnm';
str.substr(1,5)? //=>werty
str.substr(-6,3) //=>xcv
```
### toUpperCase/toLowerCase
實(shí)現(xiàn)字母大小寫(xiě)轉(zhuǎn)換
toUpperCase =》 小寫(xiě)轉(zhuǎn)大寫(xiě)
toLowerCase =》 大寫(xiě)轉(zhuǎn)小寫(xiě)
```
var str = 'QwertyuiopAsdfghjklZxcvbnm';
str.toUpperCase() //"QWERTYUIOPASDFGHJKLZXCVBNM"
str.toLowerCase()? //"qwertyuiopasdfghjklzxcvbnm"
```
### "split"
和數(shù)組中的join相對(duì)應(yīng)青柄,數(shù)組中的join是把數(shù)組每一項(xiàng)按照指定的連續(xù)符變?yōu)樽址运保鴖plit是把字符串按照指定的分隔符宝恶,拆分成數(shù)組中的每一項(xiàng)
```
var ary = [12,23,34];
var str = ary.join("+")? // 12+23+34
str.split("+")? ? // ["12","23","34"];
```
### "replace"
作用:替換字符串中的原有字符
參數(shù):原有字符负乡,要替換的新字符
返回:替換后的字符
```
把skl替換成”哈哈“
var str = 'skl2018skl';
str = str.replace("skl","哈哈");? //在使用正則的情況下政己,每執(zhí)行一次啊replace只能替換一個(gè)
```
看str原型方法(String.prototype)
### 真實(shí)項(xiàng)目中的需求
```
1.時(shí)間字符串格式化
》有一個(gè)時(shí)間字符串 "2019-1-10 11:46:8",我們項(xiàng)基于這個(gè)字符串獲取到”04月04日 16日26分“
```
/*
1.基于SPLIT按照空格把字符串拆成兩部分(數(shù)組的兩項(xiàng))
2.左邊這一部分繼續(xù)以SPLIT按照杠來(lái)拆
3.右邊這一部分繼續(xù)以SPLIT按照冒號(hào)來(lái)拆
4.把需要的信息拼接在一起即可
*/
var str = '2019-1-10 11:46:8';
function addZero(val){
return val < 10? '0'+val: val
}
var ary = str.split(' '),
aryLeft = ary[0].split('-'), //=> ['2019','1','10']
aryRight = ary[1].split(':'); //=> [11,46,8]
var month = addZero(aryLeft[1]);
var day = addZero(aryLeft[1]);
var hours = addZero(aryRight[1]);
var minutes = addZero(aryRight[1]);
console.log(month+"月"+day+"日"+hours+"時(shí)"+minutes+"分")
逼格高一點(diǎn)得
~function (pro){
????pro.formatTime = function (template){
????????template = template || '{0}年{1}月{2}日 {3}時(shí){4}分{5}秒';
????????var ary = this.match(/\d+/g);
????????template = template.replace(/\{(\d+)\}/g,function(){
????????var n = arguments[1],
????????val = ary[n] || '0';
????????val < 10 ? val ='0'+val:null;
????????????return val
????????})
????}
}(String.prototype)
### URL地址問(wèn)好傳參解析
> 有一個(gè)url地址"http://www.baidu.con/?lx=1&anme=AA&sex=man";地址問(wèn)好后面的內(nèi)容是我們需要解析出來(lái)的參數(shù)信息
{
????lx:1,
????name: 'AA',
????sex: 'man'
}
/*
* 1.先找到問(wèn)號(hào)
* 2.首先我們需要驗(yàn)證是否存在#哈希值驶睦,存在我們從問(wèn)號(hào)開(kāi)始截取到#杯缺,不存在我們直接截取到字符串末尾
* 3.以&符進(jìn)行拆分(數(shù)組)
* 4.遍歷數(shù)組中的每一項(xiàng)蒸播,把每一下再按照=進(jìn)行拆分,把拆分后的第一項(xiàng)作為對(duì)象的屬性名萍肆。第二項(xiàng)作為屬性值進(jìn)行存儲(chǔ)
*/
var str = 'http://www.baidu.con/?lx=1&anme=AA&sex=man#teacher'
//=》#后面的稱(chēng)為哈希(HASH)值袍榆,這個(gè)值可能有可能沒(méi)有,有的話(huà)我們截取的時(shí)候需要過(guò)濾掉
function strXI(str){
????// 獲取
????var indexASK = str.indexOf("?");
????var indexWELL = str.indexOf('#');
????var indexStr = '';
????if(indexWELL>-1){
????????//=>存在#
????????indexStr = str.substring(indexASK+1,indexWELL)
????}else{
????????indexStr = str.substr(indexASK+1)
????}
????var ary = indexStr.split('&')
????var obj = {}
????for(var i=0;i<ary.length;i++){
????????var item = ary[i];
????????var itemAry = item.split('=');
????????obj[itemAry[0]] = itemAry[1]
????}
????return obj
}
console.log(strXI(str))