本篇文章給大家?guī)砹薐avaScript中關(guān)于全局函數(shù)的相關(guān)知識(shí),JavaScript中的全局函數(shù)有很多,下面我們一起來看一下應(yīng)該怎樣使用,希望對(duì)大家有幫助。
一、JavaScript全局函數(shù)有哪些?
函數(shù) | 描述 |
---|---|
decodeURI() | 解碼某個(gè)編碼的 URI。 |
decodeURIComponent() | 解碼一個(gè)編碼的 URI 組件。 |
encodeURI() | 把字符串編碼為 URI。 |
encodeURIComponent() | 把字符串編碼為 URI 組件。 |
escape() | 對(duì)字符串進(jìn)行編碼。 |
eval() | 計(jì)算 JavaScript 字符串,并把它作為腳本代碼來執(zhí)行。 |
isFinite() | 檢查某個(gè)值是否為有窮大的數(shù)。 |
isNaN() | 檢查某個(gè)值是否是數(shù)字。 |
Number() | 把對(duì)象的值轉(zhuǎn)換為數(shù)字。 |
parseFloat() | 解析一個(gè)字符串并返回一個(gè)浮點(diǎn)數(shù)。 |
parseInt() | 解析一個(gè)字符串并返回一個(gè)整數(shù)。 |
String() | 把對(duì)象的值轉(zhuǎn)換為字符串。 |
unescape() | 對(duì)由 escape() 編碼的字符串進(jìn)行解碼。 |
二、JavaScript全局函數(shù)詳解?
2.1.Eval()
2.1.1.例子一
首先看示例:
eval("x=10;y=20;document.write(x*y)");document.write("<br>" + eval("2+2"));document.write("<br>" + eval(x+17));
結(jié)果:
200
4
27
特殊用法{}:
document.write("<br>" + eval{3+3}));
這時(shí)返回結(jié)果為:6 我們發(fā)現(xiàn){}這樣使用和()其實(shí)是一樣的 不同在于:
//{}/2 這種寫法是不支持的document.write("<br>" + eval{3+3}/2));//()是可以的document.write("<br>" + eval(3+3)/2));//若是{}也想進(jìn)行此類計(jì)算也可以 如下:document.write("<br>" + eval{(3+3)/2}));
2.1.2.例子二
看一下在其他情況中,eval() 返回的結(jié)果:
eval("2+3") // 返回 5var myeval = eval; // 可能會(huì)拋出 EvalError 異常myeval("2+3"); // 可能會(huì)拋出 EvalError 異常
可以使用下面這段代碼來檢測(cè) eval() 的參數(shù)是否合法:
try { alert("Result:" + eval(prompt("Enter an expression:","")));}catch(exception) { alert(exception);}
2.1.3.例子三(解析JSON字符串)
2.1.3.1.eval解析函數(shù):
JSON 不允許包含函數(shù),但你可以將函數(shù)作為字符串存儲(chǔ),之后再將字符串轉(zhuǎn)換為函數(shù)。
var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}';var obj = JSON.parse(text);obj.alexa = eval("(" + obj.alexa + ")"); document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();
2.1.3.2.JSON字符串轉(zhuǎn)換為對(duì)象的兩種方法
//將JSON字符串轉(zhuǎn)為JS對(duì)象的方法一 var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }'); document.write(obj.name + "<br/>"); //將JSON字符串轉(zhuǎn)為JS對(duì)象的方法二 //JSON格式的字符串 var test1 = '{"name":"qlq","age":25}'; var obj2 = eval("(" + test1 + ")"); //必須帶圓括號(hào) document.write(obj2.name + "<br/>" + obj2.age);
結(jié)果:
runoob
qlq
25
為什么要 eval這里要添加 eval("(" + test1 + “)”)//”呢?
原因在于:eval本身的問題。 由于json是以”{}”的方式來開始以及結(jié)束的,在JS中,它會(huì)被當(dāng)成一個(gè)語句塊來處理,所以必須強(qiáng)制性的將它轉(zhuǎn)換成一種表達(dá)式。
加上圓括號(hào)的目的是迫使eval函數(shù)在處理JavaScript代碼的時(shí)候強(qiáng)制將 括號(hào)內(nèi)的表達(dá)式(expression)轉(zhuǎn)化為對(duì)象,而不是作為語 句(statement)來執(zhí)行。舉一個(gè)例子,例如對(duì)象字面量{},如若不加外層的括號(hào),那么eval會(huì)將大括號(hào)識(shí)別為JavaScript代碼塊的開始 和結(jié)束標(biāo)記,那么{}將會(huì)被認(rèn)為是執(zhí)行了一句空語句。所以下面兩個(gè)執(zhí)行結(jié)果是不同的:
alert(eval("{}"); // return undefinedalert(eval("({})");// return object[Object]
對(duì)于這種寫法,在JS中,可以到處看到。
如: (function()) {}();
做閉包操作時(shí)等。
alert(dataObj.root.length);//輸出root的子對(duì)象數(shù)量$.each(dataObj.root,fucntion(idx,item){if(idx==0){return true;}//輸出每個(gè)root子對(duì)象的名稱和值alert("name:"+item.name+",value:"+item.value);})
注:對(duì)于一般的js生成json對(duì)象,只需要將$.each()方法替換為for語句即可,其他不變。
2.1.3.3.對(duì)于服務(wù)器返回的JSON字符串,如果jquery異步請(qǐng)求將 type(一般為這個(gè)配置屬性)設(shè)為"json",或者利 用$.getJSON()
方法獲得服務(wù)器返回,那么就不需要eval()
方法了,因?yàn)檫@時(shí)候得到的結(jié)果已經(jīng)是json對(duì)象了,只需直接調(diào)用該對(duì)象即可,這里以$.getJSON
方法為例說明數(shù)據(jù)處理方法:
$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){//此處返回的data已經(jīng)是json對(duì)象//以下其他操作同第一種情況$.each(data.root,function(idx,item){if(idx==0){return true;//同countinue,返回false同break}alert("name:"+item.name+",value:"+item.value);});});
這里特別需要注意的是方式1中的eval()方法是動(dòng)態(tài)執(zhí)行其中字符串(可能是js腳本)的,這樣很容易會(huì)造成系統(tǒng)的安全問題。所以可以采用一些規(guī)避了eval()的第三方客戶端腳本庫,比如JSON in JavaScript就提供了一個(gè)不超過3k的腳本庫。
2.1.3.4.補(bǔ)充:eval()解析的JSON的key可以不帶""
一般的JSON的key必須帶雙引號(hào),也就是類似于{"key":"vslue"}
的形式,但是如果用eval("("+json+")")
的形式解析字符串為JSON的時(shí)候,json可以寫為{key:"value"}
2.2.decodeURI()與 decodeURIComponent() – 解碼函數(shù)
decodeURI()
可對(duì) encodeURI()
函數(shù)編碼過的 URI 進(jìn)行解碼
如:
const aaa = '#$ ¥%23ccc/' console.log(encodeURI(aaa)); // #$%20%EF%BF%A5%2523ccc/ console.log(decodeURI(aaa)); // #$ ¥%23ccc/ console.log(encodeURIComponent(aaa)); // %23%24%20%EF%BF%A5%2523ccc%2F console.log(decodeURIComponent(aaa)); // #$ ¥#ccc/
我們?cè)讷@取地址欄參數(shù)是通常封裝成如下函數(shù):
export function getQueryObject(url) { url = url || window.location.href const search = url.substring(url.lastIndexOf('?') + 1) const obj = {} const reg = /([^?&=]+)=([^?&=]*)/g search.replace(reg, (rs, $1, $2) => { const name = decodeURIComponent($1) let val = decodeURIComponent($2) val = String(val) obj[name] = val return rs }) return obj}
2.3.encodeURI()與encodeURIComponent() — 編碼函數(shù)
encodeURI():
語法
encodeURI(URIstring)
參數(shù) 描述
URIstring 必需。一個(gè)字符串,含有 URI 或其他要編碼的文本。
返回值
URIstring 的副本,其中的某些字符將被十六進(jìn)制的轉(zhuǎn)義序列進(jìn)行替換。
說明
該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: – _ . ! ~ * ’ ( ) 。
該方法的目的是對(duì) URI 進(jìn)行完整的編碼,因此對(duì)以下在 URI 中具有特殊含義的 ASCII 標(biāo)點(diǎn)符號(hào),encodeURI() 函數(shù)是不會(huì)進(jìn)行轉(zhuǎn)義的:;/?: @&=+$,#
encodeURIComponent() :
語法
encodeURIComponent(URIstring)
參數(shù) 描述
URIstring 必需。一個(gè)字符串,含有 URI 組件或其他要編碼的文本。
返回值
URIstring 的副本,其中的某些字符將被十六進(jìn)制的轉(zhuǎn)義序列進(jìn)行替換。
說明
該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: – _ . ! ~ * ’ ( ) 。
其他字符(比如 :;/?