javascript - Använder JSON.parse() eval() internt?


Använder JSON.parse i moderna webbläsare eval() internt för att utvärdera och köra den dynamiska koden?

Eftersom jag har tittat igenom Douglas Crockfords JSON-bibliotek. Det använder också eval() när man använder parse(), men efter förbehandling innan den faktiska utvärderingen. Såsom:-

  1. En mur mot Unicode-tecken i koden.
  2. En kod visar illvillig avsikt.

Utför de moderna webbläsarna som stödjer JSON.parse nativt detta eller följer de andra protokoll?

Svar #1

Nej, JSON.parse() använder inte eval()

Detta är avsiktligt, eftersom eval() kan köra vilken valfri JavaScript-kod som helst som du matar in, det skulle kunna köra saker som du inte vill att det ska göra. Så JSON.parse() gör precis vad det står: det parser faktiskt hela strängen och återskapar ett helt objekträ.

JSON.parse delegeras vanligtvis till en intern funktion som är implementerad med "native" kod, där "native" betyder vad som än anses vara "native" i kontexten av din browsers JavaScript-motor (det kan vara kompilerad maskinkod, det kan vara bytekod för en VM, osv...). Jag tror inte att det finns något starkt krav på det.

Skillnader i implementeringarna?

JSON (notationen) själv är kodifierad av RFC4627.

När det gäller implementeringen av JSON-objektet och dess metoder bör alla moderna webbläsare som implementerar det bete sig likadant, eftersom de bör följa samma specifikationer för ECMAScript 5:s JSON-objekt. Det finns dock alltid en möjlighet för potentiella fel. Till exempel innehöll V8 ursprungligen denna irriterande bugg.

Observera också att implementeringen som anges i kommentarerna ovan är för att du ska lägga till JSON.parse()-stöd till webbläsare som inte stöder det nativt (även känd som "de där förbaskade gamla webbläsarna som du ibland måste stödja"). Men det innebär inte att det nödvändigtvis är så de har implementerat det.

Till exempel, för Googles V8-implementation som används i Chrome, se json.js som anropar inbyggd kod från json_parser.h.

Svar #2

Det skulle vara en väldigt rolig sak att göra, om du tänker efter.

För att förstå varför, se om denna liknelse hjälper: du reser med din chef till ett land där du talar språket men hon gör det inte. Eftersom du är flytande kommer du att ha två roller: som hennes assistent (göra uppgifter för henne) samt hennes översättare (berätta för henne vad saker betyder).

Så du har dessa två jobb, som kompletterar varandra. Din chef kan be dig att göra något-på vilket språk ni båda förstår (till exempel engelska)-samt be dig att berätta för henne vad något säger, som en skylt eller ett dokument. Hon kan till och med göra båda: ge dig en uppsättning instruktioner skrivna på detta andra språk och säga: 'Detta gavs till mig av någon jag litar på. Vänligen gör allt som står här.'

I denna analogi är det att läsa skyltar eller dokument för din chef som JSON.parse. Din chef som ger dig instruktioner och säger åt dig att göra allt de säger är som eval.

Om JavaScript-motorer använde eval internt för JSON.parse, skulle det vara analogt med att din chef frågar dig vad ett dokument säger, och du väljer att agera ut allt som står i dokumentet för att förklara det för henne. Istället för att bara läsa det.