做項目的時候發(fā)現(xiàn)一個問題届垫,我們項目里頭對js的String的原型對象進行了擴展
比如
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//>"
這里有一個平時都沒仔細想過的問題
就是方法內(nèi)部對this進行了判斷熏矿,如果這玩意兒等于空串的時候直接返回 this
但是js內(nèi)部的處理比較困擾,這里的this离钝,其實已經(jīng)不是一個簡單的 "str" 了
看看我剛在谷歌的控制臺里做寫的一段代碼就明白了
這里的this票编,其實已經(jīng)變成了一個類似new String 得到的對象,至于這個對象是怎么得到的卵渴,我就不瞎說了(應該說這個東西比較復雜慧域,如果真展開了,又是另外一篇文了)浪读,反正需要明白的是昔榴,這個對象其實跟普通的直接寫的字面量是不一樣的,了解javascript中 == 與 === 區(qū)別的應該明白
然后论泛,這樣有什么問題呢?
其實如果你拿它當字符串用蛹屿,也沒什么大問題屁奏,當然區(qū)別在于
"aa" === "aa" => true
new String("aa") === "aa" => false
但是
如果你這樣做
if(""){
//do
}
do是不會被執(zhí)行到的
if(new String("")){
//do
}
這個do是會被執(zhí)行到的
如下
所以, 不要 直接返回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"處理了一下,這樣得到的就是一個普通的字面量值了
當然犹撒,其實也可以在一進來的時候直接處理 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);
};
最后說點題外話
寫js程序的時候
- 無論什么情況折联,不要使用 new String 這樣的代碼(跟我一樣無聊測試特性的除外)
- 無論什么情況,判斷是否相等請使用 === 而不要使用 ==
以上