{"id":18,"date":"2008-03-07T19:43:56","date_gmt":"2008-03-07T18:43:56","guid":{"rendered":"http:\/\/www.hinnerup.net\/2008\/03\/07\/javascript_json_selfref_bug_or_not\/"},"modified":"2009-09-30T21:55:29","modified_gmt":"2009-09-30T20:55:29","slug":"javascript_json_selfref_bug_or_not","status":"publish","type":"post","link":"https:\/\/www.hinnerup.net\/en\/permanent\/2008\/03\/07\/javascript_json_selfref_bug_or_not\/","title":{"rendered":"Bug i JavaScript eller er weekenden bare for n\u00e6r?"},"content":{"rendered":"<p>Jeg er st\u00f8dt p\u00e5 noget rimelig besynderligt i dag &#8211; JavaScript fortolkeren i IE6, IE7 og FF2 opf\u00f8rer sig nemlig tilsyneladende s\u00e6rt n\u00e5r man opretter selvrefererende <a href=\"http:\/\/www.json.org\">JavaScript Object Notation (JSON)<\/a> objekter.<\/p>\n<p><img src='\/wp-content\/uploads\/2008\/03\/json_selfref.jpg' alt='JSON screenshot fra Firebug' style=\"border:1px solid #aaa;padding:0.5em;\" \/><\/p>\n<p>Betragt den f\u00f8rste variabeltilskrivning jeg udf\u00f8rer i <a href=\"http:\/\/www.getfirebug.com\/\">Firebug<\/a> konsollen i <a href=\"http:\/\/www.mozilla.com\/en-US\/firefox\/\">Firefox<\/a>:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"foo\": 42 };<\/pre>\n<p>Den evaluerer til et objekt der indeholder:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object foo<\/b><i>=42<\/i><\/span><\/pre>\n<p>Hvis vi gerne vil have oprettet et JSON objekt der refererer til sig selv, kan man angive f.eks.:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"foo\": 42, \"selfRef\": json.foo };<\/pre>\n<p>Hvilket evaluerer til et objekt der indeholder:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object selfRef<\/b><i>=42<\/i> <b style=\"color:#17571b\">foo<\/b><i>=42<\/i><\/span><\/pre>\n<p>Omskriver man det en smule, s\u00e5 property&#8217;en <tt>foo<\/tt> tilg\u00e5s p\u00e5 array form bliver v\u00e6rditilskrivningen til:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"foo\": 42, \"selfRef\": json[\"foo\"] };<\/pre>\n<p>Og det g\u00e5r det lige s\u00e5 fint med, da det ogs\u00e5 evaluerer til:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object selfRef<\/b><i>=42<\/i> <b style=\"color:#17571b\">foo<\/b><i>=42<\/i><\/span><\/pre>\n<p>Filmen lader dog til at kn\u00e6kke helt hvis den n\u00f8gle man anvender er et tal, hvilket er fint gyldigt i\u00f8vrigt:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"2\": 42, \"selfRef\": json[\"2\"] };<\/pre>\n<p>Nu har vi nemlig kun objektet:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object 2<\/b><i>=42<\/i><\/span><\/pre>\n<p>S\u00e5 jeg t\u00e6nkte at jeg enten havde fundet en generel implementationsfejl i JavaScript fortolkerne i IE og FF (hvilket m\u00e5 siges at v\u00e6re overvejende usandsynligt), eller ogs\u00e5 er mine fors\u00f8g herover fejlbeh\u00e6ftede. Sidste mulighed viste sig at v\u00e6re \u00e5rsagen.<\/p>\n<p>Det g\u00e5r nemlig fint at erkl\u00e6re cykliske JSON strukturer hvis de basis data der skal indg\u00e5 i selvreferencerne allerede er erkl\u00e6rede p\u00e5 forh\u00e5nd. Og det er de netop hvis man afpr\u00f8ver dette forl\u00f8b:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"foo\": 42 };\r\n>>> var json = { \"foo\": 42, \"selfRef\": json.foo };\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object selfRef<\/b><i>=42<\/i> <b style=\"color:#17571b\">foo<\/b><i>=42<\/i><\/span><\/pre>\n<p>Hvis <tt>json.foo<\/tt> ikke indledningsvist havde v\u00e6ret erkl\u00e6ret fejler den selvreferende erkl\u00e6ring:<\/p>\n<pre style=\"color:#1d1376\">\r\n>>> var json = { \"foo\": 42 };\r\n>>> var json = \"\";\r\n>>> var json = { \"foo\": 42, \"selfRef\": json.foo };\r\n>>> json\r\n<span style=\"color:#777781\"><b style=\"color:#17571b\">Object foo<\/b><i>=42<\/i><\/span><\/pre>\n<p>S\u00e5 det var udelukkende p\u00e5 grund af weekenden der var lige om hj\u00f8rnet, og fordi fors\u00f8get p\u00e5 at inds\u00e6tte en hidtil utilskrevet taln\u00f8gle i JSON strukturen gjorde at &#8220;fejlen&#8221; fremstod. Man kan dog fortsat v\u00e6re lidt tvivlende overfor hvordan en tilskreven property bare kan forsvinde ud i den bl\u00e5 luft. Man kunne forvente at <tt>selfRef<\/tt> som minimum var tilstede og blot indeholdt v\u00e6rdien <tt>\"undefined\"<\/tt> eller endnu bedre <tt>null<\/tt>. Alternativt havde en kastet <tt>exception<\/tt> ogs\u00e5 v\u00e6ret ok.<\/p>","protected":false},"excerpt":{"rendered":"<p>Jeg er st\u00f8dt p\u00e5 noget rimelig besynderligt i dag &#8211; JavaScript fortolkeren i IE6, IE7 og FF2 opf\u00f8rer sig nemlig tilsyneladende s\u00e6rt n\u00e5r man opretter selvrefererende JavaScript Object Notation (JSON) objekter. Betragt den f\u00f8rste variabeltilskrivning jeg udf\u00f8rer i Firebug konsollen i Firefox: >>> var json = { \"foo\": 42 }; Den evaluerer til et objekt [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,4],"tags":[42,119,121],"class_list":["post-18","post","type-post","status-publish","format-standard","hentry","category-json","category-programming","tag-bugs","tag-javascript","tag-json"],"_links":{"self":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":1,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/18\/revisions"}],"predecessor-version":[{"id":565,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/18\/revisions\/565"}],"wp:attachment":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/media?parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/categories?post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/tags?post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}