国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

【奇技淫巧】異常JSON字符串解析問(wèn)題

source / 1288人閱讀

摘要:嚴(yán)格模式下有自己的作用于,直接接受是獲取不到值的,需要掛載再全局下面方式二標(biāo)簽直接插入標(biāo)簽,同時(shí)把字符串拼接一個(gè)接受的變量進(jìn)去。方式三標(biāo)簽字符串通過(guò)可以轉(zhuǎn)二進(jìn)制,再通過(guò)轉(zhuǎn)。

經(jīng)常我們會(huì)遇到后端返回的數(shù)據(jù)JSON的格式不正常,會(huì)出現(xiàn)key沒(méi)有引號(hào)的情況,如:

var str = "{a: 1, b: 2}";

當(dāng)然,這種情況可以讓后端修改返回?cái)?shù)據(jù)格式,但是往往再面試或則其他時(shí)候有可能會(huì)問(wèn)道:如何去解析這種類(lèi)型的字符串?

畢竟分類(lèi)是在奇技淫巧中,那常規(guī)的evalnew Function這里就不多說(shuō)。

方式一:[native code].constructor

使用JS內(nèi)置對(duì)象的任意原型方法,如:Object.prototype.toString,Array.prototype.push,RegExp.prototype.test等等,其實(shí)這里的實(shí)質(zhì)原理還是new Function。

Object.prototype.toString.constructor === Function // true
Array.prototype.push.constructor === Function // true
RegExp.prototype.test.constructor === Function // true
var json = "{a: 1, b: 2}";
json = "window.result = " + json; // 嚴(yán)格模式下eval有自己的作用于,直接var接受JSON是獲取不到值的,需要掛載再window全局下面
Object.prototype.toString.constructor(json)(); // 1
console.log(result); // {a: 1, b: 2}
方式二:script標(biāo)簽 + innerHTML

直接插入script標(biāo)簽,同時(shí)把字符串拼接一個(gè)接受的變量innerHTML進(jìn)去。

var json = "{a: 1, b: 2}";
var script = document.createElement("script");
script.innerHTML = "var result = " + json;
document.body.appendChild(script);
console.log(result); // {a: 1, b: 2}
方式三:script標(biāo)簽 + src

字符串通過(guò)blob可以轉(zhuǎn)二進(jìn)制,再通過(guò)window.URL.createObjectURL轉(zhuǎn)url。

var json = "{a: 1, b: 2}";
var blob = new Blob(["var result = " + json]);
var src = window.URL.createObjectURL(blob);
var script = document.createElement("script");
script.src = src;
document.body.appendChild(script);
script.onload = function(){
  console.log(result); // {a: 1, b: 2}
}

PS:由于是src加載的,需要再onload才能獲取到數(shù)據(jù),同時(shí)有blob轉(zhuǎn)的url,需要在有服務(wù)器的條件下才能測(cè)試,直接打開(kāi)一個(gè)本地html文件無(wú)法測(cè)試,需要測(cè)試的可以直接打開(kāi)一個(gè)百度什么的網(wǎng)站,F(xiàn)12在控制臺(tái)測(cè)試。

方式四:Worker

同上一條一樣創(chuàng)建url,然后通過(guò)Worker運(yùn)行,但是這里接受數(shù)據(jù)就只能通過(guò)postMessageonmessage

var json = "{a: 1, b: 2}";
var blob = new Blob(["postMessage(" + json + ")"]);
var src = window.URL.createObjectURL(blob);
var worker = new Worker(src);
worker.onmessage = function(e){
  console.log(e.data); // {a: 1, b: 2}
}

PS:同上,需要再服務(wù)器的條件下測(cè)試。

方式五:location.href

經(jīng)常我們?cè)賹?xiě)點(diǎn)擊事件的時(shí)候會(huì)這樣寫(xiě):


同時(shí)隨便打開(kāi)一個(gè)頁(yè)面,再地址欄輸入:javascript:alert(1),可以看到,代碼執(zhí)行了,并且頁(yè)面并沒(méi)有跳轉(zhuǎn)變化,SO,我們可以利用這一點(diǎn)。

PS:復(fù)制到地址欄默認(rèn)會(huì)去掉javascript:,需要手動(dòng)補(bǔ)上。

var json = "{a: 1, b: 2}";
location.href = "javascript:var result = " + json;
setTimeout(function(){
  console.log(result); // {a: 1, b: 2}
}, 0);

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91754.html

相關(guān)文章

  • 奇技淫巧第二期

    摘要:因?yàn)楫a(chǎn)生的順序是先比較第一位,再比較第二位,并且沒(méi)有很好的解決辦法。這種語(yǔ)法的限制是,需要保證異常從屬與異常。兩個(gè)異常都將顯示。 這個(gè)系利的初衷是回顧瑣碎知識(shí)點(diǎn),但...

    Rocture 評(píng)論0 收藏0
  • [譯] TC39,ECMAScript 和 JavaScript 的未來(lái)(Part 1)

    摘要:由很多令人興奮的功能,如對(duì)象的解析與剩余,異步迭代器,方法和更好的正則表達(dá)式支持。迭代可以是任何遵循迭代器協(xié)議的對(duì)象。迭代器方法應(yīng)該返回一個(gè)具有方法的對(duì)象。 原文:TC39, ECMAScript, and the Future of JavaScript作者:Nicolás Bevacqua 譯者序 很榮幸能夠和 Nicolás Bevacqua 同臺(tái)分享。Nicolás Beva...

    ziwenxie 評(píng)論0 收藏0
  • Node.js技術(shù)總結(jié)

    摘要:使用了一個(gè)事件驅(qū)動(dòng)非阻塞式的模型,使其輕量又高效。依賴(lài)就近,延遲執(zhí)行。使用錯(cuò)誤處理中間件默認(rèn)情況下,給出的響應(yīng)是狀態(tài)碼,包含文本以及錯(cuò)誤自身詳細(xì)信息的響應(yīng)主體。 Node.js是什么 官網(wǎng)定義: Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式I/O 的模型,使其輕量又高效。 非阻塞 I/O 模型(...

    SKYZACK 評(píng)論0 收藏0
  • AJAX原理與CORS跨域

    摘要:同源策略指的是當(dāng)前頁(yè)面和目標(biāo)協(xié)議域名和端口均相同。發(fā)出請(qǐng)求的頁(yè)面所在域。響應(yīng)的頭部信息在后端處理,不在此處講解。該事件會(huì)在數(shù)據(jù)接收期間不斷觸發(fā),但間隔不確定。服務(wù)器確認(rèn)允許之后,才發(fā)起實(shí)際的請(qǐng)求。 ajax作為前端開(kāi)發(fā)必需的基礎(chǔ)能力之一,你可能會(huì)使用它,但并不一定懂得其原理,以及更深入的服務(wù)器通信相關(guān)的知識(shí)。在最近兩天的整理過(guò)程中,看了大量的文章,發(fā)現(xiàn)自己的后端能力已經(jīng)限制自己在網(wǎng)絡(luò)通...

    jeyhan 評(píng)論0 收藏0
  • JSON.stringify() 的奇技淫巧

    格式化輸出: let obj = { a: a1, b: b1 }; JSON.stringify(obj, null, 2); //{ a: a1, b: b1 } 巧用深拷貝: let obj = { a: a1, b: b1 }; let copy = JSON.stringify(obj); let copyObj = JSON.parse(cop...

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

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

0條評(píng)論

閱讀需要支付1元查看
<