2016-06-20 37 views
17

Se ho un array di oggetti, e ciclo attraverso di loro l'assegnazione di un attributo a ciascuno, WebStorm mi avverte:Valore assegnato al primitivo verrà perso

valori assegnati ai primitivo andranno persi

Tuttavia, durante il test nella console, non "perdere" alcun valore.

Ciò accade solo quando il ciclo si trova all'interno di una funzione.

Un esempio di questo errore di seguito:

let people = [ 
    { 
     name: 'Foo', 
     age: 21, 
     surname: 'FooBar' 
    }, 

    { 
     name: 'Bar', 
     age: 51, 
     surname: 'FooBar' 
    } 
]; 

senza funzione avvolgitore:

people.forEach(function (person) { 
    person.surname = 'Baz'; // No error. Works in console. 
}); 

Con funzione avvolgitore:

function changeSurname(people) { 
    people.forEach(function (person) { 
     person.surname = 'Baz'; // Error warning me that value assigned to primitive will be lost. 
    }); 
} 

changeSurname(people); 

Entrambi producono lo stesso output nella console (il cognome è cambiato in "baz").

Presumo che questo abbia qualcosa a che fare con il riferimento all'oggetto e quali siano i punti person, ma non sono sicuro di cosa.

Perché vedo questo errore?

Quale potenziale errore sta cercando WebStorm di salvarmi da?

+0

let rende la variabile una costante rendendo i tipi primitivi dell'oggetto interno. se hai bisogno di cambiare i valori al suo interno, non renderlo costante usare 'var' per dichiarare la variabile –

+4

@AkshayKhandelwal Non sono convinto che sia vero. Anche con 'var' ho ancora l'errore. 'const' rende le cose una costante.'let' scopa la variabile sull'ambito del blocco. –

+0

@MattLishman, IDE sta solo avvisando che l'argomento passato è un riferimento a un oggetto e in 'forEach-loop', il valore verrà modificato/perso .. – Rayon

risposta

5

Non c'è niente di improprio nel codice, inferenza di tipo di WebStorm sta diventando un po 'confuso (questo aspetto del JavaScript è particolarmente confusa).

sua Linter vede una stringa e si assume provare qualcosa di simile:

var primitive = "september"; 
primitive.vowels = 3; 

primitive.vowels; 
// => undefined 

che porterebbe ad un valore 'perduta'.

Il fatto che sia solo catturi questo 'errore' all'interno di una funzione sembra un vero bug che dovrebbe essere segnalato.

Per comprendere ulteriormente questa strana parte di JavaScript, consiglio l'eccellente articolo approfondito di Angus Croll here.

+1

Non riesco a trovare un bug report per questo. Tuttavia, non posso più replicarlo nelle versioni successive di WebStorm. Sfortunatamente non ricordo la versione in cui ho visto questo errore ma sembra che sia stato risolto! –

-1

Ho affrontato un problema simile con la direttiva angolare personalizzata.

di seguito è stata la mia direttiva personalizzato:

function customDirective() { 
     return { 
     scope: { 
      model: '=' 
     } 
     link: function(scope) { 
       scope.resetModel = function() { 
        scope.model.name = null; //In these lines I was getting the above 
        scope.model.email = null; //mentioned warning in webstorm. 
       } 
      } 
     } 
} 

Dopo aver attraversato il $compile docs, ho deciso di usare il codice di sotto della quale risolve questo avvertimento e funziona bene con il legame al figlio e padre scopi, sì certo, a meno finché il modello non è un riferimento a un oggetto.

function customDirective() { 
     return { 
     scope: { 
      model:'<' // Please refer the above linked angular docs for in detail explanation. 
     } 
     link: function(scope) { 
      scope.resetModel = function() { 
       scope.model.name = null; 
       scope.model.email = null; 
      } 
     } 
     } 
} 
+2

Sebbene questo _might_ sia utile per qualcun altro, in realtà non risponde alla mia domanda. La mia domanda non ha nulla a che fare con l'angolatura. (E Webstorm non comprende comunque l'angolazione di quel livello) –

+0

Non sono sicuro del motivo per cui questo è stato downvoted. Ho trovato questa risposta cercando lo stesso problema. Penso che l'avviso venga attivato quando dichiari una variabile che non viene utilizzata o restituita, intellij pensa che sia inutile ma è solo perché è ignorante per il binding a due vie. –

Problemi correlati