成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JSON.parse()與JSON.stringify()的用法,以及eval()和new Func

printempw / 721人閱讀

摘要:實(shí)例用解析函數(shù)字符串排名除了,以下二種方法也可以將字符串轉(zhuǎn)化為對(duì)象。實(shí)例解析函數(shù)不允許包含函數(shù),會(huì)刪除對(duì)象的函數(shù),包括和。

JSON.parse()

1、我們可以使用 JSON.parse() 方法將數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對(duì)象。

語(yǔ)法

JSON.parse(text[, reviver])

參數(shù)說明:

?text:必需, 一個(gè)有效的 JSON 字符串。
?reviver:?可選,一個(gè)轉(zhuǎn)換結(jié)果的函數(shù), 將為對(duì)象的每個(gè)成員調(diào)用此函數(shù)。

2、JSON 解析實(shí)例

使用 JSON.parse 的 reviver 函數(shù)時(shí)一定要注意遍歷到最后的頂層對(duì)象 key 為 "",需要返回 value。不然報(bào)錯(cuò)

var json = "{"name":"Harvy", "age":36, "gender":"male"}";
var person = JSON.parse(json, function (key, value) {
    if(key != "")
        return ""+value+"";
    else
        return value;
});

JSON 不能存儲(chǔ) Date 對(duì)象。// Sat Dec 14 2013 08:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
如果你需要存儲(chǔ) Date 對(duì)象,需要將其轉(zhuǎn)換為字符串。// 2013-12-14
之后再將字符串轉(zhuǎn)換為 Date 對(duì)象。// new Date(“2013-12-14”);

我們可以啟用 JSON.parse 的第二個(gè)參數(shù) reviver,一個(gè)轉(zhuǎn)換結(jié)果的函數(shù),對(duì)象的每個(gè)成員調(diào)用此函數(shù)。

實(shí)例

var text = "{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}"; 
var obj = JSON.parse(text, function (key, value) { 
if (key == "initDate") {
      return new Date(value);//將日期字符串轉(zhuǎn)換為 Date 對(duì)象
 } else { 
return value; 
}
}); 
//Sat Dec 14 2013 08:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
document.getElementById("demo").innerHTML = obj.name + "創(chuàng)建日期:" + obj.initDate;

3、解析函數(shù)

JSON 不允許包含函數(shù),但你可以將函數(shù)作為字符串存儲(chǔ),之后再將函數(shù)字符串用eval解析。

實(shí)例

var text = "{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}"; 
var obj = JSON.parse(text); 
obj.alexa = eval("(" + obj.alexa + ")"); //用eval解析函數(shù)字符串
document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

4、eval()

除了JSON.parse(),以下二種方法也可以將json字符串轉(zhuǎn)化為json 對(duì)象。

var str1 = "{ "name": "deyuyi", "sex": "man" }";
console.log(eval("("+str1+")"));
console.log((new Function("","return "+str1))());
//str1 = { "name": "deyuyi", "sex": "man" }

Eval

由于json是以”{}”的方式來開始以及結(jié)束的,在JS中,{}會(huì)被當(dāng)成一個(gè)語(yǔ)句塊來處理,加上圓括號(hào)的目的是迫使eval函數(shù)在處理JavaScript代碼的時(shí)候強(qiáng)制將括號(hào)內(nèi)的表達(dá)式(expression)轉(zhuǎn)化為對(duì)象,而不是作為語(yǔ)句(statement)來執(zhí)行。

console.log(eval("{}"));// return undefined
console.log(eval("({})"));// return object[Object]

將age的值換成了Javascript代碼,eval依然可以解析,假如有人惡意修改這個(gè)代碼,那么就會(huì)造成嚴(yán)重后果。
//例如:

var jsonData = "{"student" : [{"name":"鳴人","age":17}, {"name":"小櫻","age":alert("hehe")},{"name":"佐助","age":17}]}";

//先彈出一個(gè)提示框輸出hehe的字符串~

console.log(eval("("+jsonData+")"));

但JSON.parse會(huì)報(bào)錯(cuò)。顯示錯(cuò)誤信息為當(dāng)前字符串不符合json格式~即JSON.parse()方法會(huì)檢查需要轉(zhuǎn)換的字符串是否符合json格式~

相比較而言eval方法是很危險(xiǎn)的~特別是當(dāng)涉及到第三方時(shí)我們需要確保傳給eval的參數(shù)是我們可以控制的~
不然里面插入比如window.location~指向一個(gè)惡意的連接~那就不好了
從這個(gè)層面講~還是推薦使用JSON.parse來實(shí)現(xiàn)json格式字符串的解析。

//會(huì)報(bào)錯(cuò)~顯示錯(cuò)誤信息為當(dāng)前字符串不符合json格式

console.log(JSON.parse(jsonData));

JSON.stringify()

我們可以使用 JSON.stringify() 方法將 JavaScript 對(duì)象轉(zhuǎn)換為字符串。

1、語(yǔ)法

JSON.stringify(value[, replacer[, space]])

參數(shù)說明:

value:
必需, 一個(gè)有效的 JSON 對(duì)象。
replacer:
可選。用于轉(zhuǎn)換結(jié)果的函數(shù)或數(shù)組。
如果 replacer 為函數(shù),則 JSON.stringify 將調(diào)用該函數(shù),并傳入每個(gè)成員的鍵和值。使用返回值而不是原始值。如果此函數(shù)返回 undefined,則排除成員。根對(duì)象的鍵是一個(gè)空字符串:""。
如果 replacer 是一個(gè)數(shù)組,則僅轉(zhuǎn)換該數(shù)組中具有鍵值的成員。成員的轉(zhuǎn)換順序與鍵在數(shù)組中的順序一樣。當(dāng) value 參數(shù)也為數(shù)組時(shí),將忽略 replacer 數(shù)組。
space:
可選,文本添加縮進(jìn)、空格和換行符,如果 space 是一個(gè)數(shù)字,則返回值文本在每個(gè)級(jí)別縮進(jìn)指定數(shù)目的空格,如果 space 大于 10,則文本縮進(jìn) 10 個(gè)空格。space 有可以使用非數(shù)字,如:t。

2、JavaScript 對(duì)象轉(zhuǎn)換

實(shí)例

var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"}; 
document.write(obj);//[object Object]?
var myJSON = JSON.stringify(obj);
document.write(myJSON );
//輸出字符串{"name":"runoob","alexa":10000,"site":"www.runoob.com"}

3、JavaScript 數(shù)組轉(zhuǎn)換

實(shí)例

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ]; 
document.write(arr);//Google,Runoob,Taobao,Facebook
var myJSON = JSON.stringify(arr);
document.write(myJSON );// [ "Google", "Runoob", "Taobao", "Facebook" ]

4、將Date 對(duì)象轉(zhuǎn)化為字符串

JSON 不能存儲(chǔ) Date 對(duì)象。
JSON.stringify() 會(huì)將所有日期轉(zhuǎn)換為字符串。

實(shí)例

var obj = { "name":"Runoob", "initDate":new Date(), "site":"www.runoob.com"};
var myJSON = JSON.stringify(obj.initDate); 
document.write(myJSON );//"2018-11-08T03:00:40.443Z"

5、解析函數(shù)
JSON 不允許包含函數(shù),JSON.stringify() 會(huì)刪除 JavaScript 對(duì)象的函數(shù),包括 key 和 value。

實(shí)例

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; 
var myJSON = JSON.stringify(obj);
document.write(myJSON );//{"name":"Runoob","site":"www.runoob.com"}

我們可以在執(zhí)行 JSON.stringify() 函數(shù)前將函數(shù)轉(zhuǎn)換為字符串來避免以上問題的發(fā)生:

實(shí)例

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; 
obj.alexa = obj.alexa.toString(); //將函數(shù)轉(zhuǎn)換為字符串
var myJSON = JSON.stringify(obj);
//{"name":"Runoob","alexa":"function () {return 10000;}","site":"www.runoob.com"}
 document.write(myJSON );

不建議在 JSON 中使用函數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100642.html

相關(guān)文章

  • 「中高級(jí)前端面試」JavaScript手寫代碼無敵秘籍

    摘要:第一種直接調(diào)用避免在不必要的情況下使用,是一個(gè)危險(xiǎn)的函數(shù),他執(zhí)行的代碼擁有著執(zhí)行者的權(quán)利。來自于此外,實(shí)現(xiàn)需要考慮實(shí)例化后對(duì)原型鏈的影響。函數(shù)柯里化的主要作用和特點(diǎn)就是參數(shù)復(fù)用提前返回和延遲執(zhí)行。手寫路徑導(dǎo)航 實(shí)現(xiàn)一個(gè)new操作符 實(shí)現(xiàn)一個(gè)JSON.stringify 實(shí)現(xiàn)一個(gè)JSON.parse 實(shí)現(xiàn)一個(gè)call或 apply 實(shí)現(xiàn)一個(gè)Function.bind 實(shí)現(xiàn)一個(gè)繼承 實(shí)現(xiàn)一個(gè)J...

    Zhuxy 評(píng)論0 收藏0
  • JSON.stringify() 深入理解

    摘要:深入理解規(guī)則字符串化并非嚴(yán)格意義上的強(qiáng)制類型轉(zhuǎn)換,但其中涉及的相關(guān)規(guī)則基本類型值的字符串化規(guī)則為轉(zhuǎn)換為,轉(zhuǎn)換為,轉(zhuǎn)換為。如果對(duì)象有自己的方法,字符串化時(shí)就會(huì)調(diào)用該方法并使用其返回值。將對(duì)象強(qiáng)制類型轉(zhuǎn)換為是通過抽象操作來完成的。 [TOC] 序言 最近在看《你所不知道的javascript》[中卷]一書,第一部分是類型和語(yǔ)法。本文是基于這部分的產(chǎn)物。在強(qiáng)制類型轉(zhuǎn)換->抽象值操作-> to...

    eechen 評(píng)論0 收藏0
  • JavaScript中那些坑

    摘要:序列化為字符串之后它的各個(gè)屬性已經(jīng)被解除了引用,重新相當(dāng)于創(chuàng)建了一個(gè)新的對(duì)象。類似于的,的命令行終端?;舅悸泛瘮?shù)的使用以及協(xié)議。 多行注釋的陷阱 由于正則表達(dá)式字面量的存在,多行注釋可能會(huì)產(chǎn)生陷阱,例如以下程序?qū)伋鲥e(cuò)誤: /* var a = /h*/.test(hello); */ 正則結(jié)束前的那個(gè)星號(hào)將被解析為注釋結(jié)束符,從而.被認(rèn)為是不合法的.所以盡量避免使用多行注釋 整型 ...

    ivyzhang 評(píng)論0 收藏0
  • 前端面試之手寫代碼

    摘要:雖然構(gòu)造函數(shù)或者對(duì)象字面量的方法都可以用來創(chuàng)建對(duì)象,但是這些方法使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。參考資料冴羽的專題系列中高級(jí)前端面試手寫代碼無敵秘籍前端筆試之手寫代碼一本系列會(huì)從面試的角度出發(fā)圍繞JavaScript,Node.js(npm包)以及框架三個(gè)方面來對(duì)常見的模擬實(shí)現(xiàn)進(jìn)行總結(jié),具體源代碼放在github項(xiàng)目上,長(zhǎng)期更新和維護(hù) showImg(https://use...

    niceforbear 評(píng)論0 收藏0
  • Javascript JSON

    摘要:只是一種字符串?dāng)?shù)據(jù)格式,使用它的不僅僅是。對(duì)象在中,定義了全局對(duì)象。用于把對(duì)象序列化為字符串。這個(gè)方法可以使我們不必在乎語(yǔ)法與語(yǔ)法的差異,盡管創(chuàng)建合法的對(duì)象。用于把字符串序列化為值。 JSON只是一種字符串?dāng)?shù)據(jù)格式,使用它的不僅僅是Javascript。 語(yǔ)法 JSON可以表示三種類型的值:簡(jiǎn)單值、對(duì)象、數(shù)組 簡(jiǎn)單值 以下是JSON可以辨識(shí)的簡(jiǎn)單值例子: 5 Hello World! ...

    Miyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<