Pourquoi}}! {Résulte-t-il False dans une console JavaScript?

Si vous placez }!{ Dans votre console JavaScript dans Chrome, vous obtiendrez des informations false .

Pourquoi ne pas avoir une erreur?

La raison de ce comportement est que Chrome enveloppe tout ce que vous entrez dans la console avec un autre code.

Le code avec lequel il se cache (au moment de l'écriture) est le suivant:

 with ((window && window.console && window.console._commandLineAPI) || {}) { // Your code here. } 

Entrer }!{ Ferme l'accolade du bloc de code et crée un nouvel objet (négatif) à la fin.

Comme vous pouvez le voir dans la console !{} Renvoie false .


J'ai traversé un long processus d'enquête pour trouver la réponse à cela, mes commentaires originaux sont conservés ci-dessous

Réponse initiale:

Juste une théorie; J'imagine que le code entré dans la console est appelé dans une fonction

function execUserCode() { code }

Ce que vous faites, c'est créer

function execUserCode() { }!{ }

La console renvoie le dernier résultat, qui est en réalité !{ } = false


Modifier:

Beaucoup de commentaires sur la façon dont cela est probablement faux. Je suis d'accord. C'est juste une théorie.

J'aime ces types de casse-tête, alors j'ai fait une fouille à travers la source de Chromium, c'est un peu pour moi, mais je vais laisser des indications au cas où quelqu'un d'autre aurait un coup de couteau.

La console JS s'appelle "inspecteur" et peut être trouvée ici:

chromium/src/third_party/WebKit/Source/WebCore/inspector/

J'ai regardé l' inspector/front-end/ConsoleView.js et je pense que j'ai trouvé un peu où le code utilisateur est exécuté.

 evaluateUsingTextPrompt: function(expression, showResultOnly) { this._appendCommand(expression, this.prompt.text, false, showResultOnly); }, 

La raison!

Petite oreille cérébrale. Je l'ai fait dans la console

 > myEval = eval > eval = function(str) { console.log(str); myEval(str) } > }!{ 

Résultat:

 with ((window && window.console && window.console._commandLineAPI) || {}) { }!{ } 

J'étais proche, mais maintenant nous avons la réponse 🙂

Le code est généré dans chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js actuellement autour de la ligne 440.

Juste une supposition. Si le script est inclus dans {} et exécuté à l'aide d' eval , cela se produira.

Script utilisateur: "}!{"

Joint dans {} : "{}!{}"

Alors eval("{}!{}") Donne false

Je suppose donc que c'est ce qui se passe dans la console du navigateur.