Это скорее комментарий, чем ответ, но по какой-то причине я не могу прокомментировать ваш вопрос. Я хотел исправить код JSFiddle. Тем не менее, я опубликовал это в Hacker News, и кто-то предложил мне его перепечатать.
Проблема в коде JSFiddle заключается в том, что ({})
(открытие скобок внутри круглых скобок) не совпадает с {}
(открытие скобок как начало строки кода). Поэтому, когда вы вводите out({} + [])
, вы вынуждаете {}
быть тем, чего нет, когда вы набираете {} + []
. Это часть общей «ваттности» Javascript.
Основная идея заключалась в простом JavaScript, который хотел бы разрешить обе эти формы:
if (u)
v;
if (x) {
y;
z;
}
Чтобы сделать это, два были сделаны интерпретации открывающей скобки: 1. не требуется и 2. он может появиться где угодно .
Это был неправильный ход. Реальный код не имеет открывающей скобки, появляющейся в середине нигде, и реальный код также имеет тенденцию быть более хрупким, когда он использует первую форму, а не вторую. (Примерно раз в другой месяц на моей последней работе меня вызывали на стол коллеги, когда их изменения в моем коде не работали, и проблема заключалась в том, что они добавили строку в «if» без добавления фигурных скобки. В конце концов я просто принял привычку, что фигурные скобки всегда требуются, даже когда вы пишете только одну строку.)
К счастью, во многих случаях eval () будет воспроизводить полную ваттность JavaScript , Код JSFiddle должен читать:
function out(code) {
function format(x) {
return typeof x === "string" ?
JSON.stringify(x) : x;
}
document.writeln('>>> ' + code);
document.writeln(format(eval(code)));
}
document.writeln("<pre>");
out('[] + []');
out('[] + {}');
out('{} + []');
out('{} + {}');
out('Array(16).join("wat" + 1)');
out('Array(16).join("wat - 1")');
out('Array(16).join("wat" - 1) + " Batman!"');
document.writeln("</pre>");
[Также это первый раз, когда я написал document.writeln за многие много лет, и я чувствую себя немного грязным, пишу что-нибудь, связанное с document.writeln () и eval ().]