28 votes

L'opérateur de diffusion de Node 5.10 ne fonctionne pas

Selon les docs Si l'opérateur d'étalement est utilisé, le dernier nœud (Node 5+) devrait le supporter par défaut, comme suit :

const newObj = {
        ...oldObj,
        newProperty: 1
      }

Et j'ai installé le nœud 5.10.1 (c'est ce que me dit 'node -v'). Mais j'obtiens toujours cette erreur :

c:\[myprojectfolder]>node index.js
c:\[myprojectfolder]\index.js:21
            ...oldObj,
            ^^^

SyntaxError: Unexpected token ...
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3

Qu'est-ce que je rate ?

50voto

Joe Clay Points 14166

El tableau est prise en charge, mais la syntaxe syntaxe de propagation des objets ne l'est pas - cela est probablement dû au fait qu'il n'est pas encore finalisé en tant que partie de la spécification ECMAScript (il était initialement prévu de l'inclure dans ES7/ES2016, mais il a été repoussé, si je me souviens bien).

En attendant, vous avez le choix entre utiliser un transpilateur (tel que Babel avec le transformer-objet-rest-épandu ), ou si cela vous semble excessif, vous pouvez utiliser le nouveau plugin intégré Objet.assign fonction. La syntaxe d'étalement d'objet n'est en fait qu'un sucre syntaxique autour de Object.assign - l'exemple de votre question pourrait être exprimé ainsi :

const newObj = Object.assign({}, oldObj, {
    newProperty: 1
});

Notez que l'objet vide est le premier argument ; les propriétés des autres objets passés sont fusionnées dans l'objet vide, les propriétés les plus à droite de l'appel de fonction étant prioritaires. Il peut sembler plus intuitif d'avoir simplement oldObj en tant que premier argument, mais cela n'a pas tout à fait le même effet - cela ferait muter le fichier existant oldObj ainsi que son retour. Le fait d'avoir un objet vide comme cible laisse oldObj inchangé.


Mise à jour : A partir de Node 8.6, la syntaxe d'étalement d'objet est supportée.

3voto

hege_hegedus Points 569

Ce que vous avez essayé d'utiliser s'appelle répartition des objets et ne fait pas partie de la spécification es2015. Node ne supporte que l'étalement régulier dans les appels de fonction et les littéraux de tableau. Malheureusement, même la déstructuration des tableaux n'est pas encore supportée, bien qu'ils soient liés à la page du MDN qui décrit à la fois la structuration et la déstructuration l'utilisation de ... .

Vous pouvez utiliser Object.assign à la place :

const newObj = Object.assign({}, oldObj, {
  newProperty: 1
});

1voto

Mikhail Points 4485

Cela fonctionne dans Node.js 8.5.0.

Exemple :

var oldObj = {
    oldProperty: 0
}

var newObj = {
    ...oldObj,
    newProperty: 1
}

console.log('Old Object: ' + JSON.stringify(oldObj, null, '    '))

console.log('New Object: ' + JSON.stringify(newObj, null, '    '))

Sortie :

Old Object: {
    "oldProperty": 0
}
New Object: {
    "oldProperty": 0,
    "newProperty": 1
}

Capture d'écran de la console de débogage de l'IDE :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X