做項目的時候發(fā)現(xiàn)一個問題,我們項目里頭對js的String的原型對象進(jìn)行了擴(kuò)展
比如
String.prototype.formatStringRN = function ()
{
var cd = this;
if (cd != "")
{
cd = cd.replaceAll('\r\n', '<br//>').replaceAll('\n', '<br//>').replaceAll('\r', '<br//>');
}
return cd;
};
這是原來項目里的代碼,作用是將字符串中的 "\r\n" 全部替換成 "<br//>"
這里有一個平時都沒仔細(xì)想過的問題
就是方法內(nèi)部對this進(jìn)行了判斷,如果這玩意兒等于空串的時候直接返回 this
但是js內(nèi)部的處理比較困擾,這里的this,其實已經(jīng)不是一個簡單的 "str" 了
看看我剛在谷歌的控制臺里做寫的一段代碼就明白了
這里的this,其實已經(jīng)變成了一個類似new String 得到的對象,至于這個對象是怎么得到的,我就不瞎說了(應(yīng)該說這個東西比較復(fù)雜,如果真展開了,又是另外一篇文了),反正需要明白的是,這個對象其實跟普通的直接寫的字面量是不一樣的,了解javascript中 == 與 === 區(qū)別的應(yīng)該明白

圖片,實驗結(jié)果
然后,這樣有什么問題呢?
其實如果你拿它當(dāng)字符串用,也沒什么大問題,當(dāng)然區(qū)別在于
"aa" === "aa" => true
new String("aa") === "aa" => false
但是
如果你這樣做
if(""){
//do
}
do是不會被執(zhí)行到的
if(new String("")){
//do
}
這個do是會被執(zhí)行到的
如下

new String("")
所以, 不要 直接返回this
最后說一下怎么解決這個問題
其實我本來想的是返回一個類似 this.value 這樣的東西,但是貌似沒有這個屬性或者類似的方法
所以這個方法就變成了
String.prototype.formatStringRN = function ()
{
var cd = this;
if (cd != "")
{
cd = cd.replaceAll('\r\n', '<br//>').replaceAll('\n', '<br//>').replaceAll('\r', '<br//>');
}
return String(cd);
};
注意返回值,用"String"處理了一下,這樣得到的就是一個普通的字面量值了
當(dāng)然,其實也可以在一進(jìn)來的時候直接處理 this
變成這個樣子
String.prototype.formatStringRN = function ()
{
var cd = String( this);
if (cd != "")
{
cd = cd.replaceAll('\r\n', '<br//>').replaceAll('\n', '<br//>').replaceAll('\r', '<br//>');
}
return (cd);
};
最后說點(diǎn)題外話
寫js程序的時候
- 無論什么情況,不要使用 new String 這樣的代碼(跟我一樣無聊測試特性的除外)
- 無論什么情況,判斷是否相等請使用 === 而不要使用 ==
以上