生活随笔
收集整理的這篇文章主要介紹了
Javascript 你不知道的事
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
NaN表示一個不能產(chǎn)生正常結(jié)果的運算結(jié)果。它不等于任何值,包括它自己。可以用isNaN(number)來檢測。 同Java中的字符串一樣,JS中的字符串是不可變的。也就是說一旦字符串被創(chuàng)建,就無法改變。下標表達式(如s[3],代替s.charAt(3))可以讀取字符,但是不能用于改變字符。 null,undefined,空字符串'',0,NaN被當做false,其余的值(包括"false")或?qū)ο蠖急划斪鰐rue。所謂的“被當做”并不是說這些值就是布爾值true,例如true=="false"并不成立,而是在條件判斷語句如if("false")alert('"false" judge as true');中被當做是true。之所以出現(xiàn)這樣的情況,是因為非空的字符串或者非null的對象相當于!undefined或!null,其值被當做true也就是很自然的了。我們可以用兩個取非的符號“!”將一個值強制轉(zhuǎn)換為布爾類型,對其真假進行直觀的查看,例如alert(!!"false");輸出true。 不同于C/C++、Java等語言,JavaScript的switch語句不光可以使用數(shù)字、字符做條件表達式,還可以使用字符串!其實JavaScript中沒有字符這個基本類型,單個的字符也是一個字符串。更強大的是,case語句的表達式可以是變量!下面是示例: [javascript] ?view plaincopyprint? function?t(p,v){?? ????switch?(p){?? ????????case?'c':?? ????????????alert('char');break;?? ????????case?'string':?? ????????????alert('string');break;?? ????????case?v:alert('variable:'?+?p);break;?? ????????default:alert(p);?? ????}?? }?? ?? t('c'); t('string'); t(123); t(123,123); 程序隨時可以throw出一個異常,throw出來的可以是任意表達式、對象或常量;當然,良好的異常處理系統(tǒng)是需要精心設計一下的。 switch、while、do、for語句允許有一個前置的標簽,配合break或continue語句使用來完成一些跳轉(zhuǎn)。 JavaScript對象是可變的鍵控集合(keyed collections),是屬性的容器,屬性名甚至可以是空字符串"",屬性值可以是除undefined之外的任意值。簡單類型(number,string,boolean,null,undefined)貌似是對象,因為它們有方法;但它們是不可變的。 delete用來刪除對象的屬性,不會觸及原型鏈中的對象;刪除失敗的時候,該操作返回false。全局的函數(shù)和變量定義也是全局對象的屬性,因而可以用delete操作刪除,而函數(shù)內(nèi)部的變量聲明和函數(shù)定義則無法刪除,例如下列函數(shù)執(zhí)行的結(jié)果是彈出“false”。 [javascript] ?view plaincopyprint? function?f(){?? ????var?a?=?3;?? ????alert(delete?a);?? }?? string的fromCharCode方法從一串代表ASCII碼的數(shù)字中,返回一個字符串,在某些情況下,這個方法可能會很有用。 var a = String.fromCharCode(67,97,116); // a是'Cat'
string的replace()?方法的第一個參數(shù)是字符串或者正則表達式。第二個參數(shù)如果是字符串,可以指定正則表達式的匹配分組等信息,如$3代表第三個捕獲分組。第二個參數(shù)可以是函數(shù)而不是字符串。在這種情況下,每個匹配都調(diào)用該函數(shù),它返回的字符串將作為替換文本使用。 該函數(shù)的參數(shù)與正則表達式exec方法返回的數(shù)組類似:第一個參數(shù)是匹配模式的字符串,接下來的參數(shù)是與模式中的子表達式匹配的字符串,可以有?0?個或多個這樣的參數(shù),再后面的參數(shù)是一個整數(shù),聲明了匹配在原字符串中出現(xiàn)的位置,最后一個參數(shù)是整個字符串。示例是最有力的說明手段:
[javascript] ?view plaincopyprint? var?s?=?'fon230nva09dnfadsf';?? var?r?=?/(\d{2})([a-zA-z])/g;?? var?t?=?s.replace(r,function(){?? ???? });?? 相應的第一次替換中,arguments的內(nèi)容為:
Arguments[5]
0:?"30n" 1:?"30" 2:?"n" 3:?4 4:?"fon230nva09dnfadsf" exec方法的返回結(jié)果是一個JS數(shù)組,并附帶兩個額外的屬性index和input。與上面replace對應的exec方法第一次執(zhí)行的返回結(jié)果對照如下:
[javascript] ?view plaincopyprint?
r.exec(s);?? Array[3]
0:?"30n" 1:?"30" 2:?"n" index:?4 input:?"fon230nva09dnfadsf" length:?3 string的match方法根據(jù)g標識來決定如何進行匹配。如果沒有g標識,那么調(diào)用string.match(regexp)的結(jié)果與第一次調(diào)用regexp.exec(string)的結(jié)果相同。如果regexp帶有g標識,那么它返回一個包含所有匹配的字符串的數(shù)組。 [javascript] ?view plaincopyprint? var?s?=?'fon230nva09dnfadsf';?? var?r?=?/(\d{2})([a-zA-z])/;?? s.match(r);?? 輸出結(jié)果:Array[3]
0:?"30n" 1:?"30" 2:?"n" index:?4 input:?"fon230nva09dnfadsf" length:?3 [javascript] ?view plaincopyprint?
var?r?=?/(\d{2})([a-zA-z])/g;?? s.match(r);?? 輸出結(jié)果:Array[2]
0:?"30n" 1:?"09d" length:?2 string的split(separator,limit)方法把string分割成片段,來創(chuàng)建一個字符串數(shù)組。可選參數(shù)limit可以限制被分割的片段數(shù)量。separator參數(shù)可以是一個字符串或一個正則表達式,并且來自分組捕獲的文本將會被包含在被分割后的數(shù)組中。下面給出一個綜合的例子: [javascript] ?view plaincopyprint? var?s?=?'str1?,?str2?,?str3';s.split(/\s(,)\s/,4);?? string的substring函數(shù)的用法和slice一樣,但是它不能處理負數(shù)參數(shù)。ECMAscript中也沒有對substr方法進行標準化,所以如果要取一個字符串的子串,就用slice方法吧! 如果一個正則表達式對象reg帶有g標識,則exec方法的查找不是從字符串的起始位置開始,而是從reg.lastIndex開始;遇到不成功的匹配時,才會將其重置為0。^因子也只匹配lastIndex為0的情形,所以某些情況下,可能會需要手動把lastIndex重置到0! 不要對正則表達式的test方法使用g標識,由于它在底層可能調(diào)用exec進行判斷,test方法將與正則表達式的lastIndex屬性產(chǎn)生不必要的依賴。 一個未被轉(zhuǎn)義的點號“."將匹配除行結(jié)束符以外的任何字符。 正則表達式中,(?:exp)表示一個非捕獲組,它不會干擾捕獲型分組的編號。用非捕獲組替代不優(yōu)美的捕獲型分組是很好的方法,它減少了性能損失。而(?:exp)?表示一個可選的非捕獲分組,因為括號后面的“?”表示重復0或1次,所以該非捕獲組是可選的。 應避免使用/* */注釋,因為它可能與正則表達式字面量相沖突。 JS的數(shù)組可以用字符串形式的數(shù)字下標來訪問,因為數(shù)組的元素其實是數(shù)組對象的屬性。delete可以用來從數(shù)組中移除元素,但由于一個元素就是一個屬性,delete會在數(shù)組中遺留一個“空洞”;使用splice方法可能是一個更好的辦法。例如要刪除arr數(shù)組的第3個元素,可以使用這樣的語句:arr.splice(2,1);不過對于大型數(shù)組來說,這個函數(shù)的效率可能不高。 數(shù)組的length屬性不可枚舉。 關于括號對作用域的影響,看下面的例子:? [javascript] ?view plaincopyprint? var?x=10;?? var?foo?=?{?? ????x:20,?? ????bar:function(){?? ????????var?x?=?30;?? ????????return?this.x;?? ????}?? }?? var?a?=?(foo.bar)(); var?b?=?(foo.bar=foo.bar)(); var?c?=?(foo.bar,foo.bar)(); 因此a、b、c的值分別為20,10,10。
轉(zhuǎn)載于:https://www.cnblogs.com/xiaochao12345/p/3944129.html
總結(jié)
以上是生活随笔 為你收集整理的Javascript 你不知道的事 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。