Je suis tombé sur cet article expliquant JavaScript Quiz-Legend. Quoi qu'il en soit, ça va, donc je veux l'apporter ici pour que tout le monde apprenne, comprenne, récite et critique.
Question 1
(function () {return typeof arguments; // "object"}) ();Les arguments sont un objet de type tableau, correspondant à la liste des paramètres de la fonction passée. Vous pouvez utiliser cette variable directement dans n'importe quelle fonction.
L'opérateur TypeOf ne renverra que les résultats de la chaîne de type. Reportez-vous à la liste suivante pour savoir quelle est la valeur renvoyée par typeof est les différentes données correspondantes:
De là, nous déduisons que les arguments types sont objets
Question 2
var f = fonction g () {return 23; }; typeof g (); // signaler une erreurIl s'agit d'une expression de fonction avec le nom G, puis il est affecté à la variable f.
Le nom de la fonction G ici et la variable F attribuée par elle ont les différences suivantes:
Le nom de fonction G ne peut pas être modifié, tandis que la variable F peut être réaffectée
Le nom de fonction G ne peut être utilisé que dans le corps de la fonction. Si vous essayez d'utiliser G en dehors de la fonction, une erreur sera signalée.
Question 3
(fonction (x) {delete x; return x; // 1}) (1);L'opérateur de suppression peut supprimer les attributs d'un objet, et l'utilisation correcte est la suivante:
supprimer l'objet.property
supprimer l'objet ['propriété']
L'opérateur de suppression ne peut être utilisé que sur les propriétés de l'objet et n'est pas valide pour les variables et les noms de fonction. C'est-à-dire que la suppression X n'a pas de sens.
Vous feriez mieux de savoir que Delete ne publiera pas la mémoire directement, elle interrompt indirectement la référence d'objet
Question 4
var y = 1, x = y = typeof x; x; // "indéfini"
Nous essayons de décomposer le code ci-dessus dans les deux étapes suivantes:
var y = 1; // Étape 1
var x = y = type de x; // Étape 2
Il ne devrait pas y avoir d'objection à la première étape, regardons directement la deuxième étape
1. Les expressions d'affectation sont exécutées de droite à gauche
2. Le résultat de Y est réaffecté au type de x, c'est-à-dire non défini
3.x est attribué à la suite de la bonne expression (y = type de x), c'est-à-dire indéfini
Question 5
(fonction f (f) {return typeof f (); // "nombre"}) (function () {return 1;});Explication des commentaires directs:
(Fonction f (f) {// Le F ici est le paramètre passé dans la fonction () {return 1;} // Le résultat de l'exécution est naturellement 1 Retour Typeof F (); // Donc, selon le tableau dans la première question, nous savons que le type de 1 résultat est "numéro"}) (fonction () {return 1;});Question 6
var foo = {bar: function () {return this.baz; }, baz: 1}; (function () {return typeof arguments [0] (); // "undefined"}) (foo.bar);Ici, vous pouvez penser à tort que le résultat final est le nombre. Passer des paramètres à une fonction peut être considéré comme une affectation, donc les arguments [0] obtiennent la valeur de la fonction de barre réelle, plutôt que la référence à foo.bar, donc naturellement cela ne pointera pas vers FOO, mais fenêtre.
Question 7
var foo = {bar: function () {return this.baz; }, baz: 1} typeof (f = foo.bar) (); // "non défini"C'est le même problème que la question précédente. (f = foo.bar) renvoie la valeur de la barre, pas sa référence, donc cela ne fait pas référence à FOO.
Question 8
var f = (fonction f () {return '1';}, fonction g () {return 2;}) (); typeof f; // "numéro"L'opérateur de virgule évalue chacun de ses objets d'opération (de gauche à droite) et renvoie la valeur du dernier objet d'opération.
Ainsi, la valeur de retour de (fonction f () {return '1';}, fonction g () {return 2;}) est la fonction g, puis l'exécute, alors le résultat est 2; Enfin type de 2, selon le tableau de la première question, le résultat est naturellement le nombre
Question 9
var x = 1; if (function f () {}) {x + = typeof f;} x; // "1UNDEFINED"Le point clé de ce problème, nous avons mentionné à la question 2, le nom de fonction F dans l'expression de la fonction n'est pas accessible en dehors du corps de la fonction.
Question 10
var x = [typeof x, typeof y] [1]; typeof typeof x; // "string" 1. Parce que la variable y n'a pas été déclarée, le type de y renvoie "Undefined"
2. Attribuez le résultat du type de y à x, c'est-à-dire que x est maintenant "non défini"
3. Alors le type de x est bien sûr "String"
4. Le résultat final du type de "String" est naturellement toujours "String"
Question 11
(function (foo) {return typeof foo.bar; // "undefined"}) ({foo: {bar: 1}});Ceci est une astuce visuelle pure, commentée
(fonction (foo) {// Le foo ici est {foo: {bar: 1}}, et il n'y a pas d'attribut de bar. // L'attribut de bar est ci-dessous foo.foo//so le résultat ici est "Undefined" return typeof foo.bar;}) ({foo: {bar: 1}});Question 12
(fonction f () {fonction f () {return 1;} return f (); // 2 function f () {return 2;}}) ();Les fonctions déclarées par la déclaration de fonction peuvent même être utilisées avant la déclaration, que nous appelons cette caractéristique de levage. Ainsi, le code ci-dessus est en fait expliqué par l'environnement en cours d'exécution comme ceci:
(fonction f () {fonction f () {return 1;} function f () {return 2;} return f ();}) ();Question 13
fonction f () {return f; } Nouveau f () instance de f; // fauxLorsque le code nouveau F () s'exécute, ce qui suit se produira:
1. Un nouvel objet est créé. Il hérite de f.prototype
2. Le constructeur f est exécuté. Pendant l'exécution, la réussite correspondante sera transmise et le contexte (ceci) sera spécifié comme cette nouvelle instance. Le nouveau F est équivalent à nouveau f () et ne peut être utilisé que dans les cas où aucun paramètre n'est passé.
3. Si le constructeur renvoie un "objet", cet objet remplacera le résultat de l'ensemble du nouveau. Si le constructeur ne renvoie pas l'objet, le résultat de New est l'objet créé à l'étape 1.
PS: Dans des circonstances normales, le constructeur ne renvoie aucune valeur, mais si l'utilisateur souhaite écraser cette valeur de retour, il peut choisir de renvoyer un objet normal pour l'écraser. Bien sûr, les tableaux de retour seront également écrasés, car les tableaux sont également des objets.
Par conséquent, le nouveau f () nous renvoyons ici la fonction f elle-même, pas son instance
Question 14
avec (fonction (x, non défini) {}) longueur; // 2
L'instruction With Ajoute un objet au sommet de la chaîne de portée. S'il existe une variable qui n'a pas utilisé d'espace de noms dans l'instruction, qui a le même nom qu'une propriété dans la chaîne de portée, la variable pointera vers la valeur de la propriété. S'il y a une propriété avec le même nom, une exception de référence de référence sera émise.
OK, regardons maintenant les choses, puisque la fonction (x, undefined) {} est une expression de fonction anonyme, qui est une fonction, il aura un attribut de longueur, qui fait référence au nombre de paramètres de la fonction. Donc le résultat final est 2
Écrit à la fin
Certaines personnes pensent que ces questions sont difficiles, tandis que d'autres pensent que cela élargit leurs horizons et dépend de leurs propres opinions. Mais une chose est vraie. Que vous soyez un pratiquant ferme ou non, vous n'iras certainement pas loin sans fondement théorique - vous ne verrez jamais un travailleur technique qualifié devenir soudainement un expert en fusée.
La lecture des documents, la lecture des normes et la combinaison de la pratique sont le moyen décisif pour les camarades.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.