1.??? JS中substring與substr的區(qū)別
之前在項目中用到substring方法廊镜,因為C#中也有字符串的截取方法Substring方法隙券,當(dāng)時也沒有多想就誤以為這兩種方法的使用時一樣的男应。這樣就直接按照在C#中使用Substring的方式,直接在js中用了substring娱仔,在實際的項目中沐飘,有時候能得到正確的結(jié)果,但是有時候得到的結(jié)果卻讓人匪夷所思牲迫,后來仔細(xì)的調(diào)試跟蹤之后才發(fā)現(xiàn)耐朴,原來是Js中substring的方法跟C#中的Substring方法不一樣。關(guān)于C# 中的字符串截取方法已經(jīng)很簡單了盹憎,這里就不再敘述了筛峭。主要講一個js中的substring方法,順便再講一下substr方法陪每。
Substring:
該方法可以有一個參數(shù)也可以有兩個參數(shù)影晓。
l? 一個參數(shù):
示例: var str=“Olive”;
?????????? ????str.substring(3);
??????? 結(jié)果:“ve”
??????? 說明:當(dāng)substring只有一個參數(shù)時檩禾,參數(shù)表示從字符串的第幾位開始截取挂签,
直截取到字符串結(jié)尾。
l? 兩個參數(shù):
??????? 示例:var str=“Olive”锌订;
1)?????? Str.substring(3,4);
2)?????? Str.substring(3,2);
?????????? 結(jié)果:1) “v”? 2) 0
?????????? 說明:當(dāng)substring有兩個參數(shù)時竹握,第一個參數(shù)表示從字符串的第幾位開始截取画株,第二個參數(shù)表示截取到字符串的第幾位辆飘。這點(diǎn)是個C#中字符截取不同的一點(diǎn),所以才會導(dǎo)致不同的結(jié)果谓传。
Substr:
該方法也可以有一個或兩個參數(shù)蜈项。
l? 一個參數(shù):
??? 說明:substr一個參數(shù)時,作用跟substring方法一個參數(shù)時一樣续挟。
l? 兩個參數(shù):
??? 示例:var str=“Olive”紧卒;
1)?????? Str.substr(3,2);
2)?????? Str.substr(3,4);
??????? 結(jié)果:1) “ve” 2) “ve”
??????? 說明:substr有兩個參數(shù)時,第一個參數(shù)表示從字符串的第幾位開始截取诗祸,第二個參數(shù)表示截取多少位字符串跑芳。這點(diǎn)跟C#中字符截取相同的轴总,所以在以后的使用中,如果想要避免出現(xiàn)截取的問題最好還是使用substr博个。
因為項目中有些地方看到有用到這個方法怀樟,當(dāng)時也不知道是什么意思,見的多了就想了
解一下盆佣。原來這個方法還是挺有用的往堡,多用在編寫插件,當(dāng)然共耍,它本身也有一些重載原型虑灰。也可是實現(xiàn)靜態(tài)方法:
$.extend({
sayHello: function (name) {
console.log('Hello,' + (name ? name : 'Dude') + '!');
}
})
$.sayHello(); //調(diào)用
$.sayHello('Wayou'); //帶參調(diào)用
2.1 extend(result,item1,item2…..)
這里這個方法主要用來合并穆咐,將所有的參數(shù)項都合并result中庸娱,并返回result谐算,但是這
樣就會破壞result的結(jié)構(gòu)。
用這個方法斤儿,可以將所得的結(jié)果全部合并在{}中恐锦,并返回一铅,而且還不會破壞原有的項的結(jié)構(gòu)。
示例:
Var item={name:”olive”,age:23};
Var item1={name:”Momo”,sex:”gril”};
Var result=$.extend({},item,item1);
結(jié)果:
Result={name:”Momo”,age:23,sex:”gril”};
說明:
以上的結(jié)果表明extend方法將所有的項都合并到了{(lán)}中肮之,但是戈擒,細(xì)心一點(diǎn)就會發(fā)現(xiàn)艰毒,其中item1中的name:“Momo” 將item中的name:“olive”給覆蓋了,這是怎么回事柑土?請接著往下看。
2.3 extend(bool,{},item1,item2….)
Extend方法還有帶bool型參數(shù)的重載幌缝。
bool型參數(shù)為true表示深拷貝涵卵,為false時表示淺拷貝荒叼。具體可以通過一下示例來說明:
示例:
var item={name:“olive”,age:23,address{provice:”河南”,city:”鄭州”}};
var item1={sex:”girl”,address{city:”北京”}};
var result=$.extend(true,item,item1);
var result1=$.extend(false,item,item1);
結(jié)果:
Result={name:“olive”,age:23,sex:”gril”,address:{provice:”河南”,city:”北京”}};
Result1={name:“olive”,age:23,sex:”gril”,address:{ city:”北京”}};
說明:
以上結(jié)果說明被廓,當(dāng)參數(shù)為ture時,即為深拷貝昆婿,當(dāng)子項item1中的子項有與item中的子項相同屬性的值不一樣時仓蛆,item1中子項的值會將item子項中的值給覆蓋挎春,當(dāng)子項item1的屬性跟item中的屬性不同時,會與item進(jìn)行合并能庆。
當(dāng)參數(shù)為false時脚线,子項item1中的子項中與item中的子項屬性相同時邮绿,item1中子項的屬性值會將item中的值給完全覆蓋。
該方法是將item合并到Jquery的全局對象中去一死,相當(dāng)于為Jquery全局對象添加了一個
靜態(tài)方法(對應(yīng)這里的靜態(tài)方法傻唾,當(dāng)然還有實例方法冠骄,在后邊有介紹)凛辣。
???? 示例:
?????????? $.extend({SayHello:function(value){alert(“hello “+value);}});
?????????? 這樣寫過之后,就可以直接調(diào)用SayHello方法:
?????????? $.SayHello(“Olive”);
???? 說明:該方法相當(dāng)于為Jquery類添加了新的方法防泵。
上邊提到的$.extend(item)說是為Jquery類添加了靜態(tài)方法捷泞,那么這里的$.fn.extend(item
)就是為每一個實例添加一個實例方法了寿谴。
???? 示例:
? ???????$.fn.extend({hello:function(value){alert(“hello “+value);}});
???????? 這樣寫過之后,在獲取每一個示例之后咏瑟,都可以調(diào)用該方法:
???????? $(“#id”).hello(“Olive”);
初次看到這種寫法時码泞,一頭霧水狼犯,不知所云。在網(wǎng)上查找了一些資料之后才有點(diǎn)明白劈狐。
我們先看第一個括號里邊的內(nèi)容:function($){….}呐馆,這不就是一個匿名的函數(shù)嗎汹来?但是它的形參比較奇怪,是$,這里主要是為了不與其它的庫沖突坟岔。
這樣我們就比較容易理解第一個括號內(nèi)的內(nèi)容就是定義了一個匿名函數(shù)摔桦,我們在調(diào)用函數(shù)的時候承疲,都是函數(shù)名后邊加上括號以及實參燕鸽,但是由于操作符的優(yōu)先級我們定義的匿名函數(shù)也需要用()括起來啊研。
現(xiàn)在我想大家已經(jīng)很清楚這句話是什么意思了吧鸥拧。第一個括號表示定義了一個匿名函數(shù),然后第二個函數(shù)表示為該函數(shù)傳遞的參數(shù)沟娱,整個結(jié)合起來意思就是舆声,定義了一個匿名函數(shù),然后又調(diào)用該函數(shù)碱屁,該函數(shù)的實參為jQuery蛾找。
相當(dāng)于:function fun($){…};fun(jQuery);
這種方法多用于存放開發(fā)的插件,執(zhí)行其中的代碼時柿赊,Dom對象并不一定加載完畢幻枉。于此相反的是$(function(){}),這種方法在使用時頁面的Dom對象已經(jīng)加載完畢了胰挑。事實上該方法的全寫是:$(document).ready(function(){});