web-dev-qa-db-fra.com

Node v6 échouant lors de la propagation d'un objet

J'avais une question sur pourquoi le noeud v6.7 ne pourrait pas exécuter ce code:

var a = {
    foo: 'bar'
}

var b = {
    ...a,
    my: 'sharona'
}
console.log(b)

Quelqu'un a une idée pourquoi ce serait? Je pensais que v6 supportait la propagation d'objets ..? Mais je suppose que non? Voici l'erreur que je vois:

/home/teselagen/ve/tnrtest.js:6
    ...a,
    ^^^
SyntaxError: Unexpected token ...
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:528:28)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
54
majorBummer

On dirait que l'opérateur ES6 spread ne fonctionne que pour les tableaux et les iterables. Il est spécialement conçu pour NOT WORK pour les objets: https://developer.mozilla.org/en/docs/Web/JavaScript/ Référence/Opérateurs/Spread_operator

Citation pertinente:

Ne s'applique qu'aux iterables

var obj = {"key1":"value1"};
function myFunction(x) {
    console.log(x); // undefined
}
myFunction(...obj);
var args = [...obj];
console.log(args, args.length) //[] 0

Bien que l'article de MDN ait précédemment suggéré qu'essayer d'utiliser l'opérateur d'étalement sur des objets devrait entraîner un indéfini au lieu de générer une erreur. À compter de cette révision , l'article actuel de MDN traite de la prise en charge de "Répandre pour les littéraux d'objet".

De plus, la table de compatibilité de node.js affirme que node.js est entièrement conforme à la spécification de l'opérateur de propagation avec les tableaux et les iterables, mais indique spécifiquement que les propriétés reste/propagation d'objet ne sont pas prises en charge: http://node.green/ # ESNEXT-candidate - stage-3 - object-rest-spread-properties , du moins pas avant Node version 8.60 (à quel point la couleur devient verte pour indiquer le début dans 8.3, Node fait prend en charge l'opérateur d'étalement/de repos d'objet, comme indiqué dans l'autre réponse )

48
slebetman

Utiliser rest/spread with objects est une proposition séparée, que vous pouvez lire à propos de here . Une proposition ne sera pas acceptée pour la version annuelle de l'ES à moins qu'elle n'atteigne le stade 4, et il s'agit actuellement de l'étape 3. Elle peut éventuellement passer à l'ES2018. Si vous voulez l'utiliser maintenant, vous devrez utiliser un transpiler comme babel.


EDIT: À partir de Node v8.3, le repos/la propagation d'un objet est disponible sans qu'aucune transpilation ne soit nécessaire.

57
saadq