Peut (a== 1 && a ==2 && a==3) jamais évaluer à vrai?
Modérateur remarque: Veuillez résister à l'envie de modifier le code ou de supprimer le présent avis. Le modèle de l'espace peut être une partie de la question et, par conséquent, ne devrait pas être altérée inutilement. Si vous êtes dans les "espaces est insignifiant" camp, vous devriez être en mesure d'accepter le code tel qu'il est.
Est-il jamais possible que (a== 1 && a ==2 && a==3)
pourrait évaluer à true
en JavaScript?
C'est une question d'entrevue demandé par une grande entreprise de technologie. Il s'est passé deux semaines en arrière, mais je suis encore à essayer de trouver la réponse. Je sais que nous n'avons jamais écrire un tel code dans notre journée de travail de jour, mais je suis curieux.
- Les commentaires ne sont pas pour de longues discussions; cette conversation a été déplacé pour chat.
- notez que, même si les espaces sont corrigées, il est encore possible de l'original ont été en utilisant les caractères invisibles et semblent avoir l'espacement correct.
(aᅠ== 1 && a == 2 &&ᅠa == 3)
(vous simplement alterner où le réel espaces) - Pour les personnes qui, apparemment, a voté pour cloae trop large: est-ce qu'une fouille à Javascript, en disant qu'il y a trop de réponses valides?
- Ce serait le travail dans de nombreuses langues en plus du JavaScript, par exemple à l'aide de la surcharge d'opérateur avec des effets secondaires en C# ou Java.
- si la sécurité est un problème dans un code - et devrait être - poser des questions sur les nuances et les bibelots (même s'ils sont obscurs) n'est pas nécessairement une mauvaise chose. Si la question est plus de l'onanisme intellectuel de la part de l'intervieweur, il se trouve à être un moyen d'ouvrir la discussion avec le candidat... donc @ghord, je ne voudrais pas jeter le bébé avec l'eau du bain, c'est parfaitement acceptable de l'outil; c'est ce que vous faites avec elle lors d'un entretien qui le rend intéressant
- plutôt raisonnable si l'intervieweur s'attend à ce que la personne interrogée a un aperçu de l'ECMAscript. Si vous savez la différence entre
==
et===
ensuite, vous pouvez répondre à cette question facilement. Bien que les caractères coréens truc, c'est un chouette un. - Certaines personnes de s'asseoir autour de philosopher sur ce qui est possible. D'autres concentrent leurs efforts sur si oui ou non ils sont de construction viables, affaires bons produits pour leurs clients. OMI, cette question n'a pas d'utilité pratique au-delà du fait que vous ne devriez jamais demander à ces types de questions dans une interview ou d'écrire ce genre de code. C'est pourquoi il doit être fermé. Je veux dire, vraiment, l'entreprise réalise qu'ils ont payé quelqu'un de l'argent réel pour s'asseoir autour et de parler de ce genre de choses?
- Quel est le modèle de thread de JavaScript? Dans de nombreuses langues (et en fonction de la définition de
a
- par exemple avecvolatile
en C), de la lecture d'une variable simple peut retourner des résultats différents à des moments différents s'il est modifié par quelque chose d'extérieur. - javascript s'exécute dans un thread unique contexte. Certaines actions ne fonctionner sur un thread séparé, mais le code s'exécute de façon synchrone et donc que ça ne peut pas arriver en javascript, du moins pas avec une expression comme dans cette question.
- Cette question ne possède certains avantages en ce qu'elle appelle une compréhension de l'horreur et le danger de la langue que vous allez travailler avec.
- parce qu'un développeur est autorisé à faire des choses stupides ne signifie pas que la langue qui est mauvais. Lire le JavaScript les bonnes pièces. C'est en quelque sorte un point de la livre.
- Après avoir lu les réponses, la morale de l'histoire: ne pas utiliser
==
quand vous voulez dire===
, ont une norme de codage qui interdit à un non-ASCII, les noms de variables, et ont un peluchage processus qui applique les deux précédents de la morale. - Je me demande si le journaliste aurait accepté de “je ne sais pas, je ne l'ai jamais utiliser
===
comme un bon développeur Javascript,” comme une réponse. (Bien que personnellement j'ai quelques arguties avec l'absolutisme, au moins sur de petits projets.) - il y a certainement parfaitement cromulent raisons pour lesquelles
==
et!=
existe pas-c'est juste une question de le développeur mettant les peluches ignorer (et espérons-le, quelques) les usages. - Modérateur remarque: Débordement de Pile a eu une histoire de gens carillon avec des réponses dans les différentes langues en question. Ces tentatives sont faites pour répondre à la question parce qu'ils sont des solutions à un problème général, mais dans une langue différente. Veuillez vous abstenir de signaler comme "pas de réponse". Cela dit, merci de ne pas poster plus de réponses dans différentes langues - il y a une raison à cette question est spécifique à JavaScript, comme indiqué par les commentaires de certains de ces autres réponses, et il ya une raison que nous aimons notre langue-des questions spécifiques à le rester.
- en vaut la vue: l'appel d'une fonction sans parenthèses
- La surcharge d'opérateur en Java?
Vous devez vous connecter pour publier un commentaire.
Si vous profitez de comment
==
fonctionne, vous pouvez simplement créer un objet avec une coutumetoString
(ouvalueOf
) fonction que les changements de quoi il en retourne chaque fois qu'il est utilisé tel qu'il remplit les trois conditions.JS:
La raison pour laquelle cela fonctionne est due à l'utilisation de la loose opérateur d'égalité. Lors de l'utilisation de lâche l'égalité, si l'un des opérandes est d'un type différent de l'autre, le moteur va tenter de convertir de l'un à l'autre. Dans le cas d'un objet sur la gauche et un certain nombre sur la droite, il tente de convertir l'objet d'un numéro en appelant d'abord
valueOf
si elle est exigible, et à défaut, il va appelertoString
. J'ai utilisétoString
dans ce cas, tout simplement parce que c'est ce qui m'est venu à l'esprit,valueOf
aurait plus de sens. Si je l'ai retourné au lieu d'une chaîne detoString
, le moteur aurait ensuite tenté de convertir la chaîne en nombre de nous donner le même résultat, mais avec un peu plus de chemin.valueOf()
opération?i
et1
,2
, et3
sont des nombres, pourquoi est-il l'appel detoString
?valueOf
est un peu mieux.i
ne dérange pas le moteur. 😉a == 1 && a == 2 && a == 3
sujet de JIT, l'optimisation?this
? c'est a dire:toString: function() { return this.i++; }
Number
s sont différents (l'un est une primitive et l'autre est un objet, de sorte qu'ils seront immédiatement échouer stricte===
comparaison). Nombre de primitives ont aucun constructeur (il n'primitive).const a = { i: 0, toString: function () { var returned = (++a.i); if(a.i >= 3) { a.i = 0; } return returned; } }
a
quand il est comparé au nombres?Je ne pouvais pas résister - autres réponses sont sans doute vrai, mais vous avez vraiment ne peut pas marcher passé le code suivant:
JS:
Remarque l'étrange espacement dans le
if
déclaration (que j'ai copié à partir de votre question). C'est la demi-largeur Hangul (c'est le coréen pour ceux qui ne connaissent pas) qui est un espace Unicode caractère qui n'est pas interprété par l'ECMA script comme un caractère d'espace, ce qui signifie que c'est un caractère valide pour un identificateur. Par conséquent, il ya trois différentes variables, l'une avec le Hangul après l'un, un avec elle avant et la dernière avec juste une. Le remplacement de l'espace avec_
pour des raisons de lisibilité, le même code devrait ressembler à ceci:JS:
Découvrez la validation sur Mathias nom de la variable du programme de validation. Si bizarre espacement a été inclus dans leur question, je suis sûr que c'est une astuce de ce genre de réponse.
Ne pas le faire. Sérieusement.
Edit: Il est venu à mon attention que (bien que n'étant pas autorisé à prendre le départ d'une variable) la Zéro-largeur menuisier et Largeur zéro non-menuisier personnages sont également autorisés dans les noms de variable - voir Abrutissant JavaScript avec zéro de caractères de largeur - les avantages et les inconvénients?.
Ce serait semblable à la suivante:
JS:
var ᅠ2 = 3
a été utilisé; il y a donc trois variablesaᅠᅠ= 1, ᅠ2 = 3, a = 3
(a␣ = 1, ␣2 = 3, a = 3
, de sorte que(a␣==1 && a==␣2 && a==3)
)...1
ou3
, mais je ne suis pas exclure qu'il y a un zéro de la largeur de caractère qui est un identificateur valide commencer... je ne sais pas, comment JavaScript gère cela, mais Java permet du plaisir à l'aide de la LTR/RTL caractères de contrôle...C'EST POSSIBLE!
JS:
Il utilise un getter à l'intérieur d'un
with
déclaration de laissera
évaluer à trois valeurs différentes.... ce n'est pas pour autant cette fonction doit être utilisée dans le code réel...
Pire encore, cette astuce fonctionnera également avec l'utilisation de
===
.JS:
with
."with
est-ce vraiment une erreur de conception.with
n'est pas autorisé.with
sorte qu'il peut arriver==
. Et===
empêche la accepté de répondre à==
mais je n'ai pas vuwith
depuis ... en fait jamais à l'extérieur de la JS documentation où il est dit "s'il vous plaît ne pas l'utiliser". De toute façon, une solution sympa.with
: stackoverflow.com/a/48288170/65387===
!with
pour attirer les==
vérifie)Exemple sans getters ou valueOf:
JS:
Cela fonctionne parce que
==
appelletoString
qui appelle.join
pour les Tableaux.Une autre solution, à l'aide de
Symbol.toPrimitive
qui est un ES6 équivalent detoString/valueOf
:JS:
without valueOf
, bien... plus indirect, mais fondamentalement la même chose.toString
ouvalueOf
mais celui-ci m'a pris complètement hors de garde. Très intelligent et je ne savais pas qu'il fait appel.join
en interne, mais il est tout à fait pertinent.a.join = a.shift
, c'est le génie. Mauvais génie, mais le génie néanmoins.Si l'on se demande si il est possible (et non DOIT), il peut demander à "un" pour retourner un nombre aléatoire. Ce serait vrai si elle génère 1, 2, et 3 de manière séquentielle.
JS:
Lorsque vous ne pouvez pas faire n'importe quoi sans expressions régulières:
JS:
Il fonctionne en raison de la coutume
valueOf
méthode qui est appelée lorsque l'Objet par rapport primitif (comme le Nombre). Astuce principale est quea.valueOf
renvoie la nouvelle valeur à chaque fois parce que c'est l'appel deexec
sur l'expression régulière avecg
drapeau, qui a causer la mise à jour delastIndex
de cette expression régulière tous les temps de correspondance est trouvée. Donc, la première foisthis.r.lastIndex == 0
, il correspond à1
et mises à jourlastIndex
:this.r.lastIndex == 1
, donc la prochaine fois regex sera match2
et ainsi de suite.exec
de nouveau sur pour commencer la recherche à partir de cet indice. SOCIÉTÉ n'est pas très claire.this.r
objet regex souvenir de l'état / de l'index. Merci!!
exec
bien, pas un nombre entier pour être stringified.Il peut être accompli en utilisant les éléments suivants dans la portée globale. Pour
nodejs
utilisationglobal
au lieu dewindow
dans le code ci-dessous.JS:
Cette réponse abus de l'implicite des variables fournies par la portée mondiale dans le contexte d'exécution par la définition d'un getter pour récupérer la variable.
a
est une propriété dethis
qui ne semble pas être. Sia
est une variable locale (ce qui lui ressemble), alors cela ne fonctionnera pas.a == 1
implique quea
est une variable quelque part, pas une propriété dethis
. Bien qu'il y est un excentrique de place comme à la globals où les deux peut-être vrai, en général, la déclaration d'une variable avecvar a
oulet a
n'y a pas dethis
qui vous permet d'accédera
comme un bien comme vous êtes de code suppose. Ainsi, votre code est apparemment en supposant que certains bizarre variable globale chose. Par exemple, votre code ne fonctionne pas dans node.js et pas en mode strict à l'intérieur d'une fonction. Vous devez spécifier les circonstances exactes où elle travaille et probablement expliquer pourquoi cela fonctionne. Sinon, c'est trompeur.a
n'est pas une variable locale et est définie sur la portée globale avec une incrémentation de lecture.val
en faisantthis.val = this.val || 0;
et à l'aide dethis.val
à la place. De cette façon, il serait autonome.Cela est possible dans le cas de la variable
a
accès par, disons 2 web les travailleurs par le biais d'un SharedArrayBuffer ainsi que certains script principal. La possibilité est faible, mais il est possible que lorsque le code est compilé en code machine, le web, les travailleurs de mettre à jour la variablea
juste à temps pour les conditionsa==1
,a==2
eta==3
sont satisfaits.Cela peut être un exemple de condition de course en environnement multi-thread fournis par web les travailleurs et SharedArrayBuffer en JavaScript.
Ici est la base de la mise en œuvre de ci-dessus:
main.js
worker.js
modifier.js
Sur mon MacBook Air, il arrive après environ 10 milliards d'itérations lors de la première tentative:
Deuxième tentative:
Comme je l'ai dit, les chances sera faible, mais étant donné assez de temps, il a frappé l'état.
Astuce: Si ça prend trop de temps sur votre système. Essayez seulement
a == 1 && a == 2
et changementMath.random()*3
àMath.random()*2
. Ajoutant de plus en plus à la liste des gouttes de la chance de frapper.a[0] == 1 && a[0] == 2 && a[0] == 3
, pasa == 1 && a == 2 && a == 3
. Ce n'est pas la question d'origine était de demander. Êtes-vous en mesure de montrer un exemple aveca
au lieu dea[0]
?a=array[0]
est la copie de la valeur actuelle dearray[0]
àa
qui est comportement involontaire. Hope qui aide @qntmtoPrimitive
/valueOf
/toString
, un getter de la propriété dans unwith
déclaration, ou d'une lecture sur l'objet global. Tout le reste sont juste des variations du thème "comment faire un retour de fonction des valeurs différentes à des moments différents".Cela est également possible à l'aide d'une série d'auto-écraser les getters:
(Ce qui est similaire à jontro de la solution, mais ne l'exige pas une variable compteur.)
JS:
===
, pas seulement==
.this
être l'objet global à l'intérieur du corps de la flèche de la fonction.(a == 3 && a == 2 && a == 1)
?Je ne vois pas cette réponse déjà posté, donc je vais jeter celui-ci dans le mélange trop. Ceci est similaire à Jeff répondre avec la moitié de la largeur Hangul de l'espace.
JS:
Vous remarquerez peut-être une légère différence avec la seconde, mais la première et la troisième sont identiques à l'œil nu. Tous les 3 sont des caractères distincts:
a
- Latin minuscule Una
- Largeur latine minuscule Unа
- Cyrillique en bas de casse d'UnLe terme générique pour ce qui est "homoglyphs": les différents caractères unicode qui ont la même apparence. Généralement difficiles à obtenir trois qui sont totalement indiscernables, mais dans certains cas, vous pouvez avoir de la chance. A, Α, А, et Ꭺ serait mieux travailler (Latin-Un, Grecque Alpha, L'Alphabet Cyrillique Une, et Cherokee-Un respectivement; malheureusement, le grec et Cherokee lettres minuscules sont trop différent du Latin
a
:α
,ꭺ
, et donc ne pas aider avec l'extrait ci-dessus).Il y a toute une classe de Homoglyph Attaques de là, le plus souvent sous de faux noms de domaine (par exemple.
wikipediа.org
(Cyrillique) vswikipedia.org
(Latin), mais il peut apparaître dans le code; généralement désigné comme étant sournois (comme mentionné dans un commentaire, [sournois] questions sont maintenant hors-sujet sur PPCG, mais il a utilisé pour être un type de défi, où ces sortes de choses se présenteraient). J'ai utilisé ce site internet pour trouver le homoglyphs utilisé pour cette réponse.a
:a︀
a︁
a︂
. Pas plus se soucier de divergences.Alternativement, vous pouvez utiliser une classe et une instance pour le vérifier.
JS:
MODIFIER
À l'aide de ES6 classes, il devrait ressembler à ce
JS:
function A() {value = 0;
au début?valueOf
est remplacée,this method is usually called automatically by JavaScript behind the scenes, and not explicitly in code
ainsi, lorsque nous comparons la valeur qu'elle fait incréments de un..Oui, c'est possible!
» JavaScript
JS:
Le code ci-dessus est une version courte (merci à @Forivin pour sa note dans les commentaires) et le code suivant est original:
JS:
» C#
Aussi, j'ai écrit une version de C# (avec augmentation de la valeur de la propriété de technic):
Démonstration En Direct
function if<200c> { }
comment il fonctionne, pourquoi ne pas travailler avecfunction if<123c>{}
\u200c
(LARGEUR NULLE de NON-MENUISIER) caractère dans ma réponse, vous voulez unif
avec\u123c
? OK écrireif
puis appuyez surAlt
, appuyez sur+
appuyez sur123c
libérationAlt
- il ce mot»ifሼ
if=()=>!0
document.write
? C'est un moyen infaillible de ne pas obtenir embauché quel que soit le reste de la réponse.console.log
mais je l'ai changé pour le document.écrire. Vraiment j'ai toujours utiliserconsole.log
dans mes codes, mais ici, je veux juste afficher un texte à des utilisateurs dans StackOverflow extrait de code de la boîte. Donc, je voulais montrer mon message plus beau que le message généré parconsole.log
. Cliquez sur leRun Code Snippet
bouton sur ma réponse et sur d'autres réponses. La SORTE de Fragment de Code permettez-moi d'utiliser le html et les CSS et JS puis j'ai voulu l'utiliser dans ma réponse et la rendre belle. Je pense qu'Il n'a aucun effet secondaire et n'a pas fait de ma réponse, grandes ou complected.a
est pris..(a== 1 && a ==2 && a==3)
n'est pas utilisé.JavaScript
a == un +1
En JavaScript, il n'y a pas entiers mais seulement
Number
s, qui sont mis en œuvre en tant que double de la précision des nombres à virgule flottante.Cela signifie que si un certain Nombre
a
est assez grand, il peut être considéré comme égal à trois nombres entiers consécutifs:JS:
Vrai, ce n'est pas exactement ce que l'intervieweur a demandé (il ne fonctionne pas avec
a=0
), mais il n'implique aucun truc avec des fonctions cachées ou la surcharge d'opérateur.D'autres langues
Pour la référence, il y a
a==1 && a==2 && a==3
solutions en Ruby et Python. Avec une légère modification, il est également possible en Java.Ruby
Avec une coutume
==
:Ou une augmentation de la
a
:Python
Java
Il est possible de modifier Java
Integer
cache:Integer a = 42
(ou le fait)? Comme je comprends l'autoboxing,Integer a = 42; a == 1 && a == 2 && a == 3
doit cocher tous les services de renseignements. Ou est-ce à unbox un pour les comparaisons?Integer#equals(int)
les forces de l'autoboxing, de sorte qu'il fonctionne. Merci pour le commentaire!Numbers
en JS, qui sont fondamentalement commedouble
s. Ils peuvent ressembler à des nombres entiers et vous pouvez les utiliser comme des entiers, mais ils ne sont pas entiers. Je ne pense pas quen == n + 1
peut jamais être vraie pour les entiers en Java/Python/C/Ruby/...1.0
peut être affichée comme1
, c'est toujours un float bien.C'est une version inversée des @Jeff répondre* où un personnage caché (U+115F, U+1160 ou U+3164) est utilisé pour créer des variables qui ressemblent à des
1
,2
et3
.JS:
* Que la réponse peut être simplifiée par l'utilisation de largeur nulle de non-menuisier (U+200C) et une largeur égale à zéro menuisier (U+200D). Deux de ces caractères sont autorisés à l'intérieur des identifiants, mais pas au début:
JS:
D'autres astuces sont possibles en utilisant la même idée par exemple en utilisant Unicode variation sélecteurs de créer des variables qui se ressemblent tous (
a︀ = 1; a︁ = 2; a︀ == 1 && a︁ == 2; //true
).La règle numéro un des entrevues; ne jamais dire impossible.
Pas besoin de personnage caché la ruse.
JS:
__defineGetter__
est en fait pas vraiment partie de la js langue, juste une version laide dedefineProperty
.typeof
n'est pas une fonction, et ce non déclaréesi
est juste horrible. Encore semble être une valeur de 40 upvotes :/__defineGetter__
est désapprouvée par developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/..., mais il est clairement exécute dans mon FireFox v 57.0.4 j'ai donc opté pour montrer cela au lieu dedefineProperty()
en raison de l'héritage de code est réel et ne peut pas être ignoré. Quelle que soit la laideur, déclaranti
dans le chemin que j'ai fait est bien connu/comportement documenté. Peut-être que j'étais juste dans un PCG humeur \_(ツ)_/Honnêtement si, si il y a un moyen pour elle de vraies (true) ou pas (et comme d'autres l'ont montré, il y a de multiples façons), la réponse que je serais à la recherche pour, parlant comme quelqu'un qui a réalisé des centaines d'entrevues, serait quelque chose le long des lignes de:
"Eh bien, peut-être que oui, dans le cadre d'étranges circonstances qui ne sont pas immédiatement évident pour moi... mais si j'ai rencontré ce dans le code réel, alors je voudrais utiliser des techniques de débogage répandues de comprendre comment et pourquoi il faisait ce qu'il faisait, et puis immédiatement à refactoriser le code pour éviter cette situation... mais le plus important: je voudrais absolument JAMAIS écrire ce code, en premier lieu, parce que c'est la définition même de l'alambiqué code, et je m'efforce de ne jamais écrire alambiqué code".
Je suppose que certains enquêteurs prendrait en déplaise à avoir ce qui est évidemment destiné à être une question très difficile appelé, mais je n'ai pas l'esprit des développeurs qui ont une opinion, surtout quand on peut le sauvegarder avec raisonnée de la pensée et peut en queue d'aronde à ma question dans une déclaration significative sur eux-mêmes.
Si jamais vous avez une question d'entrevue (ou de l'avis de certains également un comportement inattendu dans votre code) de penser à ce genre de choses pourrait éventuellement provoquer un comportement qui semble impossible à première vue:
Encodage: Dans ce cas, la variable que vous regardez n'est pas celui que vous pensez. Cela peut se produire si vous avez intentionnellement déconner avec Unicode à l'aide de homoglyphs ou les caractères d'espace de faire le nom d'une variable ressembler à une autre, mais des problèmes de codage peuvent également être introduits accidentellement, par exemple lors de la copie d' & coller du code à partir du Web qui contient inattendue des points de code Unicode (par exemple à cause d'un système de gestion de contenu fait un peu de "mise en forme automatique" comme le remplacement de
fl
avec Unicode "minuscule LATINE LIGATURE FL' (U+FB02)).Conditions de course: Un course-condition pourrait se produire, c'est à dire une situation où le code ne s'exécute pas dans l'ordre prévu par le développeur. Course à conditions se produisent souvent dans le code multithread, mais plusieurs threads ne sont pas une exigence pour les conditions de course possibles – l'asynchronicité est suffisant (et ne pas se confondre, async ne veut pas dire plusieurs threads sont utilisés sous le capot).
Remarque que, par conséquent, JavaScript n'est pas non plus exempt de conditions de course juste parce qu'il est mono-thread. Voir ici pour un simple single-threaded – mais async – exemple. Dans le cadre d'un seul état, la condition de la course mais serait plutôt difficile de frapper en JavaScript.
JavaScript avec des web workers est un peu différent, car vous pouvez avoir plusieurs threads. @mehulmpt nous a montré un grand la preuve-de-concept à l'aide des web workers.
Effets secondaires: Un des effets secondaires de l'égalité opération de comparaison (qui n'est pas aussi évidente que dans les exemples ici, souvent, les effets secondaires sont très subtile).
De ce genre de questions peut apparaître dans de nombreux langages de programmation, non seulement en JavaScript, donc nous ne sommes pas en voir un classique de la JavaScript WTFs ici1.
Bien sûr, la question de l'entrevue et les échantillons ici tous l'air très artificiel. Mais ils sont un bon rappel que:
1 Par exemple, vous pouvez trouver un exemple dans un tout autre langage de programmation (C#) présentant un effet secondaire (évidente) ici.
Voici une autre variante, l'utilisation d'un tableau pour faire apparaître quelles que soient les valeurs que vous voulez.
JS:
Bon, d'un autre hack avec des générateurs:
JS:
this
être l'objet de la fenêtre)En réalité la réponse à la première partie de la question est "Oui" dans chaque langage de programmation. Par exemple, c'est dans le cas de C/C++:
&&
pour le "et"logique.std::cout
Integer.valueOf(1)
. Il peut aussi travailler avec des primitivesint
s?a
de typeInteger
et cela devrait fonctionner)Integer.valueOf(2 + 2) == 5
mais pas2 + 2 == 5
. Si j'ai misa
à un nombre Entier, il peut encore être équivalente à unint
, non pas trois, distincts de ceux.op=
) est connecté en filaire à la moyenne de l'égalité, et vous ne pouvez pas redéfinir à dire quoi que ce soit d'autre. En outre, la langue fait une distinction entre les valeurs et les mutable cellules contenant des valeurs. Vous pouvez tester mutable cellules pour l'égalité, mais qui compare l'objet de l'identité des cellules, pas leur contenu.À l'aide de Les procurations:
Procurations fondamentalement, faire semblant d'être un objet cible (premier paramètre), mais d'intercepter les opérations sur l'objet cible (dans ce cas la propriété de l'opération"), de sorte qu'il existe une possibilité de faire autre chose que de l'objet par défaut de comportement. Dans ce cas, le "bien" de l'action est appelée sur
a
quand==
contraint son type afin de la comparer à chaque numéro. Ce qui se passe:{ i: 0 }
, où lai
propriété est notre compteura
a ==
comparaison,a
'de type s est contrainte à une valeur primitivea[Symbol.toPrimitive]()
en internea[Symbol.toPrimitive]
de la fonction en utilisant le "gestionnaire"Symbol.toPrimitive
, auquel cas il incrémente puis retourne le compteur de l'objet cible:++target.i
. Si une autre propriété est en cours de récupération, nous venons de tomber en arrière pour retourner à la valeur par défaut la valeur de la propriété,target[name]
Donc:
Comme avec la plupart des autres réponses, cela fonctionne uniquement avec un lâche contrôle d'égalité (
==
), parce que l'égalité stricte des contrôles (===
) ne font pas de contrainte de type que le Proxy peut intercepter.Symbol.toPrimitive
de la même manière sur un objet de travail tout aussi bien.Même, mais différent, mais tout de même (peut-être "testé" plusieurs fois):
JS:
Mon idée a commencé à partir de la façon dont le Numéro de type de l'objet équation fonctionne.
Un ECMAScript 6 réponse qui rend l'utilisation de Symboles:
En raison de
==
d'utilisation, JavaScript est censé contraindrea
en quelque chose de proche de la deuxième opérande (1
,2
,3
dans ce cas). Mais avant de JavaScript, essaie de comprendre le fait de contraindre sur son propre, il tente d'appelerSymbole.toPrimitive
. Si vous fournissezSymbol.toPrimitive
JavaScript serait d'utiliser la valeur de votre fonction retourne. Si non, JavaScript serait d'appelvalueOf
.Je pense que c'est le minimum de code pour la mettre en œuvre:
JS:
La création d'un objet factice avec une coutume
valueOf
qui incrémente une variable globalei
sur chaque appel. 23 caractères!Celui-ci utilise la defineProperty avec un joli effet secondaire de causer variable globale!
JS:
a
:get: (a => () => ++a)(0),
no global nécessaire.En substituant
valueOf
dans une déclaration de classe, il peut être fait:Ce qui se passe est que
valueOf
est appelée à chaque opérateur de comparaison. Sur le premier,a
sera égal à1
, sur la deuxième,a
sera égal à2
, et ainsi de suite et ainsi de suite, parce qu'à chaque foisvalueOf
est appelée, la valeur dea
est incrémenté.Donc la console.journal d'incendie et de sortie (dans mon terminal, de toute façon)
Thing: { value: 4}
, indiquant la condition est vrai.