2017-05-11 2 views
0

Disons que j'ai un tableau de mots, et je voudrais utiliser un objet pour obtenir le compte de celui-ci. J'ai essayé ceci:le || et l'opérateur NaN. Comment fonctionnent-ils vraiment?

const results = {}; 

const words = ["word", "hello", "code", "five", "hello", "word", "new", "code"]; 

words.forEach(word => { 
    results[word] = results[word] + 1 || 1; 
}); 

results dans ce cas retourne:

{ word: 2, hello: 2, code: 2, five: 1, new: 1 } 

NaN === false est false et results[word] + 1 => NaN. Je ne comprends pas très bien pourquoi les résultats ne seraient pas:

{ word: NaN, hello: NaN, code: NaN, five: NaN, new: NaN } 

Quelqu'un veut-il expliquer? :)

+1

Copie possible de [Est-ce que NaN est falsifié? Pourquoi NaN === false renvoie false] (http://stackoverflow.com/questions/22600248/is-nan-falsy-why-nan-false-returns-false) –

+0

@JaromandaX c'est, car 'undefined + 1' est 'NaN'. –

Répondre

3

results[word] lorsque results ne contient pas word est undefined. Bien que NaN === false soit false, c'est toujours une valeur falsifiée (!!NaN est false). Par conséquent, results[word] + 1 || 1undefined + 1 || 1 = NaN || 1 = 1

0

undefined + 1 = NaN

results[word] = results[word] + 1 || 1; 

Vous initialiser la valeur à l'un où le || (ou) opération définit la valeur par défaut à 1 au lieu de 0. La façon dont j'ai résolu ce problème enveloppait la condition comme suit:

results[word] = (results[word] || 0)+1;