J'apprends Javascript et j'ai écrit le code suivant:

if (mystring.len > 0) {
    // do stuff
}

J'ai accidentellement utilisé .len au lieu de .length. À ma grande surprise, aucune erreur n'a été relevée. mystring.len a renvoyé undefined, ce qui a fait échouer la comparaison, mais le code a continué de fonctionner. Je préférerais qu'une erreur réelle soit déclenchée pour que je puisse corriger le code. L'ajout de "use strict" n'a pas aidé, pas plus que jslint.

Je sais qu'il existe des moyens de vérifier activement si une propriété existe ou non, mais ce n'est pas ce que je recherche. Je veux que Javascript me dise quand j'ai fait une faute de frappe dans un nom de propriété.

Existe-t-il un moyen pour que Javascript donne une erreur dans ce cas?

3
Graeme Perrow 7 mars 2016 à 19:04

5 réponses

Meilleure réponse

Non - c'est ainsi que JavaScript fonctionne et c'est incroyablement utile. Qui peut dire que vérifier len est quelque chose qui doit être corrigé? Considérer:

if(mystring.len === undefined) {
   mystring.len = "Test";
}

Le mieux que vous puissiez faire est de simplement vérifier que la chose est définie avant de l'utiliser:

if(mystring.len !== undefined) {
}

J'apprécie l'étrangeté et la façon dont cela ne semble pas robuste (étant originaire d'un arrière-plan C #), mais il n'y a pas beaucoup de choses que vous pouvez faire malheureusement. Le fait que JavaScript soit sensible à la casse rend cela encore plus frustrant. Mais vous apprendrez à vivre avec!

Si vous vouliez vraiment vraiment exécuter une analyse statique, alors vous pourriez envisager de créer une extension de transpilateur (par exemple Babel) pour exécuter ce type d'analyse - mais cela deviendrait vraiment difficile si vous vous attendiez à ce que quelque chose soit undefined que je trouve est un lieu commun.

modifier

Voici un exemple réel que j'utiliserais lorsque undefined est utile. Je travaille avec une bibliothèque qui doit déplacer des éléments d'un emplacement à un autre. Il ne peut pas faire cela à moins que l'emplacement d'origine n'ait été spécifié, donc je pourrais écrire quelque chose comme ceci, initialiser des valeurs si je ne les ai pas pour une raison quelconque:

function update(node) {
   if(node.x === undefined) { node.x = 0; }    
   node.y = node.y || 0; // This is the shorthand way I'd actually write it

   // Do some other stuff
};
5
Ian 7 mars 2016 à 16:18

C'est le comportement de JavaScript tel que mentionné par de nombreuses / toutes les réponses. Cependant, il existe une option pour empêcher de nouvelles propriétés que vous voudrez peut-être essayer:

Object.seal https: // développeur. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal

1
Royal Pinto 7 mars 2016 à 19:02

"use strict" (d'après mon expérience) est utilisé pour que les variables qui ne sont pas explicitement déclarées / instanciées et qui sont ensuite référencées génèrent des erreurs (sinon, JS ferait juste un nouveau var à la volée). Donc ça n'aiderait pas ici.

Cela ressemble à une erreur qui serait généralement détectée par un compilateur dans d'autres langues, mais puisque JS est interprété, vous n'aurez pas ce type de vérification d'erreur explicite à moins que vous ne soyez dans un IDE costaud. Utilisez-vous un éditeur de texte ou quelque chose pour écrire JS?

1
sup bro 7 mars 2016 à 16:10

Ce n'est pas la façon dont JavaScript considère votre code ci-dessus. Chaque variable dans JS est un objet. Ainsi, lorsque vous faites mystring.len, il essaie réellement d'accéder à la propriété len de mystring obj et lorsqu'il ne trouve pas cette propriété, il renvoie undefined - qui c'est comme ça que ça devrait être. C'est pourquoi vous ne pourrez pas trouver d'erreur en utilisant JSLint.

Juste pour vous donner un exemple -

var myObj = {name: 'Hello', id: 1};
console.log(myObj.name);   // Returns 'Hello'
console.log(myObj.text);   // 'undefined'

Afin d'empêcher un tel code de vous donner des erreurs, vous pouvez facilement utiliser méthode hasOwnProperty () comme suit-

if(myObj.hasOwnProperty('text')) doSomething();

Puisque myObj n'a pas de propriété text, la fonction doSomething() ne sera jamais appelée.

1
Shekhar Chikara 7 mars 2016 à 16:16

La réponse est simple: JavaScript n'est pas censé être sûr pour les types ... Vous ne devriez pas le vérifier, mais si vous voulez toujours le vérifier, vous pouvez le faire en:

if ('len' in mystring){
}

Vous devriez regarder dans Typo si vous posez cette question ...

0
Slava Shpitalny 7 mars 2016 à 16:23