Il y a une différence subtile entre l'initialisation d'un tableau avec le constructeur Array et une taille initiale, et l'initialisation avec une liste explicite des undefined
entrées. Le premier (le constructeur Array) ne crée pas de propriétés correspondant aux index, contrairement à l'initialisation explicite.
Je suspecte que Underscore utilise le .forEach()
natif quand il le peut, et cela n'appellera pas son rappel pour les index non initialisés. Ainsi, dans le premier test, le rappel à _.every()
n'est jamais appelé du tout.
modifier — le constructeur Array fait quelque chose de plus ou moins la même chose que:
var a = []; a.length = 10;
Lorsque vous étendez un tableau en augmentant sa longueur comme ça, les nouvelles positions d'index implicites ne sont pas initialisé . C'est la différence fondamentale entre la non-existence d'une propriété et la présence d'une propriété sans valeur. Dans les deux cas, une déréférence de la propriété entraîne undefined
. Ainsi:
var o = {};
if (o.something == undefined) // this will be true
puis:
var o = { something: undefined };
if (o.something == undefined) // also true
Une façon de faire la différence entre les deux situations est l'opérateur in
:
if ('something' in o) // only true in the second case
J'utilise 'console.log (a)', il imprime '[undefined x 10]'. Et 'console.log (a [1])', il affiche 'undefined'. Cela me rend confus. Si je peux utiliser 'a [1]' pour obtenir quelque chose, pourquoi je ne peux pas l'itérer? – shian
http: // perfectionkills.com/how-ecmascript-5-ne-permet-pas-de-sous-classe-un-tableau/# special_nature_of_arrays –
Merci de votre lien. – shian