Maison  >  Article  >  interface Web  >  Un résumé des trucs et astuces pour éviter les pièges courants en JavaScript

Un résumé des trucs et astuces pour éviter les pièges courants en JavaScript

伊谢尔伦
伊谢尔伦original
2017-07-26 13:54:511091parcourir

1. Avez-vous essayé de trier les éléments du tableau ?

JavaScript utilise l'ordre alphanumérique par défaut. Par conséquent, le résultat de [1,2,5,10].sort() est [1, 10, 2, 5].

Si vous souhaitez trier correctement, vous devez faire ceci : [1,2,5,10].sort((a, b) => a - b)

2. new Date() est très simple à utiliser

new Date() peut recevoir :

  • - ne reçoit aucun paramètre : renvoie l'heure actuelle

  • - Reçoit un paramètre `x` : Renvoie la valeur du 1er janvier 1970 + `x` millisecondes.

  • - `new Date(1, 1, 1)` renvoie le 1er février 1901.

  • - Cependant...., `new Date(2016, 1, 1)` n'ajoute pas 2016 à 1900, mais représente uniquement 2016.

3. La fonction de remplacement ne remplace pas vraiment ?

let s = "bob"
const replaced = s.replace('b', 'l')
replaced === "lob" // 只会替换掉第一个b
s === "bob" // 并且s的值不会变

Si vous souhaitez remplacer tous les b, utilisez des expressions régulières :

"bob".replace(/b/g, 'l') === 'lol'

4 Soyez prudent avec les opérations de comparaison

// 这些可以
'abc' === 'abc' // true
1 === 1 // true
// 然而这些不行
[1,2,3] === [1,2,3] // false
{a: 1} === {a: 1} // false
{} === {} // false

car [ 1, 2,3] et [1,2,3] sont deux tableaux différents, ils ont simplement les mêmes éléments. Par conséquent, il ne peut pas être jugé simplement par `===`.

5. Le tableau n'est pas un type de base

typeof {} === 'object' // true
typeof 'a' === 'string' // true
typeof 1 === number // true
// 但是....
typeof [] === 'object' // true

Si vous souhaitez déterminer si une variable `var` est un tableau, vous devez utiliser `Array.isArray(var)`.

6. Clôture

Il s'agit d'une question d'entretien JavaScript classique :

const Greeters = []
for (var i = 0 ; i < 10 ; i++) {
 Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10

Bien que le résultat attendu soit 0,1,2,..., Mais en réalité, ce n’est pas le cas. Savez-vous comment déboguer ?

Il existe deux manières :

  • - Utilisez `let` au lieu de `var`.

  • - Utilisez la fonction `bind`.

Greeters.push(console.log.bind(null, i))

Bien sûr, il existe de nombreuses solutions. Ces deux-là sont mes préférés !

7. À propos de bind

Que produira le code suivant ?

class Foo {
 constructor (name) {
 this.name = name
 }
 greet () {
 console.log(&#39;hello, this is &#39;, this.name)
 }
 someThingAsync () {
 return Promise.resolve()
 }
 asyncGreet () {
 this.someThingAsync()
 .then(this.greet)
 }
}
new Foo(&#39;dog&#39;).asyncGreet()

Si vous dites que le programme va planter et signaler une erreur : Cannot read property 'name' of undefined.

Parce que le `geet` à la ligne 16 n'est pas exécuté dans le bon environnement. Bien sûr, il existe de nombreuses façons de résoudre ce BUG !

- Préférez utiliser la fonction `bind` pour résoudre le problème :

asyncGreet () {
 this.someThingAsync()
 .then(this.greet.bind(this))
}

Cela garantira que `greet` sera appelé depuis l'instance Foo, plutôt que depuis la fonction locale ` ceci.

- Si vous voulez que `greet` ne soit jamais lié à la mauvaise portée, vous pouvez utiliser `bind` à l'intérieur du constructeur.

class Foo {
 constructor (name) {
 this.name = name
 this.greet = this.greet.bind(this)
 }
}

- Vous pouvez également utiliser les fonctions fléchées (=>) pour empêcher la modification de la portée.

asyncGreet () {
 this.someThingAsync()
 .then(() => {
 this.greet()
 })
}

8. Math.min() est plus grand que Math.max()

Math.min() < Math.max() // false

car Math.min() renvoie Infinity et Math.max() renvoie -Infinity.

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!

Déclaration:
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