Maison > interface Web > js tutoriel > le corps du texte

Une compilation de quelques points de connaissances JavaScript faciles à commettre des erreurs

怪我咯
Libérer: 2017-04-05 14:23:26
original
1585 Les gens l'ont consulté

Avant-propos

Cet article contient quelques points de connaissances sujets aux erreurs que j'ai collectés et organisés au cours du processus d'apprentissage de JavaScript. Il couvrira la portée des variables, la comparaison de types, etc. pointeur et fonction.Les six aspects des paramètres, des problèmes de fermeture, de la copie et de l'affectation des objets sont présentés et expliqués du moins profond au plus profond, ce qui implique également certains points de connaissance ES6.

Points de connaissance JavaScript

1. Portée de la variable

var a = 1;
function test() {
    var a = 2;

    console.log(a); // 2
}

test();
Copier après la connexion

Déclarer et attribuer des valeurs dans la portée de la fonction. au dessus de a, et il est au dessus de la console, donc la sortie a est égale à 2 suivant le principe de proximité.

var a = 1;
function test2() {
    console.log(a); // undefined

    var a = 2;
}

test2();
Copier après la connexion

Bien que a soit déclaré et attribué dans la portée de la fonction ci-dessus, il se trouve sous la console. La variable a est promue et est déclarée mais pas encore assignée, donc "indéfini" est affiché.

var a = 1;
function test3() {
    console.log(a); // 1

    a = 2;
}

test3();
Copier après la connexion

A dans la portée de la fonction ci-dessus est réaffecté, non redéclaré, et est situé sous la console, donc a dans la portée globale est généré.

let b = 1;
function test4() {
    console.log(b); // b is not defined

    let b = 2;
}

test4();
Copier après la connexion

Le let ES6 est utilisé dans la portée de la fonction ci-dessus pour redéclarer la variable b. Cependant, contrairement à var, let n'a pas la fonction de promotion de variable, donc l'erreur de sortie "b n'est pas définie". est signalé.

function test5() {
    let a = 1;

    {
        let a = 2;
    }

    console.log(a); // 1
}

test5();
Copier après la connexion

Dans la portée de la fonction ci-dessus, let est utilisé pour déclarer a comme 1, et a est déclaré comme 2 dans la portée au niveau du bloc, car la console n'est pas dans la portée au niveau du bloc dans la fonction , donc Sortie 1.

2. Comparaison de types

var arr = [],
    arr2 = [1];

console.log(arr === arr2); // false
Copier après la connexion

Comparez deux tableaux différents ci-dessus, la console est fausse.

var arr = [],
    arr2 = [];

console.log(arr === arr2); // false
Copier après la connexion

Comparez les deux tableaux identiques ci-dessus, car la comparaison entre tableau et tableau est toujours fausse, donc la console est fausse.

var arr = [],
    arr2 = {};

console.log(typeof(arr) === typeof(arr2)); // true
Copier après la connexion

Utilisez typeof pour comparer les tableaux et les objets ci-dessus. Parce que typeof obtient NULL, les types de tableaux et d'objets sont tous des objets, donc la console est vraie.

var arr = [];

console.log(arr instanceof Object); // true
console.log(arr instanceof Array); // true
Copier après la connexion

Ce qui précède utilise instanceof pour déterminer si une variable appartient à une instance d'un objet. Étant donné que les tableaux sont également un type d'objet en JavaScript, les deux consoles sont vraies.

3. cela pointe vers

var obj = {
    name: 'xiaoming',
    getName: function () {
        return this.name
    }
};

console.log(obj.getName());  // 'xiaoming'
Copier après la connexion

Ceci dans la méthode objet ci-dessus pointe vers l'objet lui-même, donc "xiaoming" est affiché.

var obj = {
    myName: 'xiaoming',
    getName: function () {
        return this.myName
    }
};

var nameFn = obj.getName;

console.log(nameFn()); // undefined
Copier après la connexion

Ce qui précède attribue la méthode dans l'objet à une variable. À ce stade, celle-ci dans la méthode ne pointera plus vers l'objet obj, et pointe donc vers l'objet window, donc la console est. "indéfini".

var obj = {
    myName: 'xiaoming',
    getName: function () {
        return this.myName
    }
};

var obj2 = {
    myName: 'xiaohua'
};

var nameFn = obj.getName;

console.log(nameFn.apply(obj2)); // 'xiaohua'
Copier après la connexion

La méthode dans l'objet obj est également affectée à la variable nameFn ci-dessus, mais celle-ci est pointée vers l'objet obj2 via la méthode apply, donc la console finale est 'xiaohua'.

4. Paramètres de la fonction

function test6() {
    console.log(arguments); // [1, 2]
}

test6(1, 2);
Copier après la connexion

Ce qui précède utilise l'objet arguments dans la fonction pour obtenir le tableau de paramètres transmis à la fonction, le tableau de sortie est donc [ 1, 2].

function test7 () {
    return function () {
        console.log(arguments); // 未执行到此,无输出
    }
}

test7(1, 2);
Copier après la connexion

Ce qui précède utilise également des arguments pour obtenir des paramètres, mais comme test7(1, 2) n'exécute pas la fonction en retour, il n'y a pas de sortie If test7(1, 2)(3, 4. ) est exécuté, il y aura une sortie [3, 4].

var args = [1, 2];

function test9() {
    console.log(arguments); // [1, 2, 3, 4]
}

Array.prototype.push.call(args, 3, 4);

test9(...args);
Copier après la connexion

Ce qui précède utilise la méthode Array.prototype.push.call() pour insérer 3 et 4 dans le tableau args, et utilise l'opérateur de propagation ES6 (...) pour développer le tableau et transmettre dans test9, donc la console est [1, 2, 3, 4].

5. Problème de fermeture

var elem = document.getElementsByTagName('p'); // 如果页面上有5个p

for(var i = 0; i < elem.length; i++) {
    elem[i].onclick = function () {
        alert(i); // 总是5
    };
}
Copier après la connexion

Ce qui précède est un problème de fermeture très courant. La valeur qui apparaît lorsque vous cliquez sur un p est toujours 5, car. lorsque vous déclenchez le clic La valeur de i est déjà 5 au moment de l'événement, ce qui peut être résolu de la manière suivante :

var elem = document.getElementsByTagName(&#39;p&#39;); // 如果页面上有5个p

for(var i = 0; i < elem.length; i++) {
    (function (w) {
        elem[w].onclick = function () {
            alert(w); // 依次为0,1,2,3,4
        };
    })(i);
}
Copier après la connexion

Encapsulez une fonction d'exécution immédiate en dehors de l'événement de clic lié, et passez je suis dans la fonction.

6. Copie et affectation d'objets

var obj = {
    name: &#39;xiaoming&#39;,
    age: 23
};

var newObj = obj;

newObj.name = &#39;xiaohua&#39;;

console.log(obj.name); // &#39;xiaohua&#39;
console.log(newObj.name); // &#39;xiaohua&#39;
Copier après la connexion

Ci-dessus, nous avons attribué l'objet obj à l'objet newObj, modifiant ainsi l'attribut name de newObj, mais le nom de l'objet obj Les propriétés sont également falsifiées, car l'objet newObj n'obtient en réalité qu'une adresse mémoire, pas une copie réelle, donc l'objet obj est falsifié.

var obj2 = {
    name: &#39;xiaoming&#39;,
    age: 23
};

var newObj2 = Object.assign({}, obj2, {color: &#39;blue&#39;});

newObj2.name = &#39;xiaohua&#39;;

console.log(obj2.name); // &#39;xiaoming&#39;
console.log(newObj2.name); // &#39;xiaohua&#39;
console.log(newObj2.color); // &#39;blue&#39;
Copier après la connexion

L'utilisation de la méthode Object.assign() ci-dessus pour effectuer une copie complète de l'objet peut éviter la possibilité de falsification de l'objet source. Parce que la méthode Object.assign() peut copier n'importe quel nombre de propriétés énumérables de l'objet source vers l'objet cible, puis renvoyer l'objet cible.

var obj3 = {
    name: &#39;xiaoming&#39;,
    age: 23
};

var newObj3 = Object.create(obj3);

newObj3.name = &#39;xiaohua&#39;;

console.log(obj3.name); // &#39;xiaoming&#39;
console.log(newObj3.name); // &#39;xiaohua&#39;
Copier après la connexion

Nous pouvons également utiliser la méthode Object.create() pour copier un objet. La méthode Object.create() peut créer un nouvel objet avec l'objet prototype et les propriétés spécifiés.

Conclusion

L'apprentissage de JavaScript est un long processus et ne peut pas être accompli du jour au lendemain. J'espère que les points introduits dans cet article pourront aider les étudiants qui apprennent JavaScript à mieux comprendre et maîtriser la syntaxe JavaScript et à éviter les détours.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal