10
votes

Pourquoi "inattendu". "'Quand vous utilisez || Opérateur pour une valeur par défaut entre parenthèses

obtenir inattendu "." de Jslint ( http://jslint.com/ ) sur ce code:

function test(foo) {
    "use strict";
    var xFoo = (foo || "");
    return xFoo.replace("bar", "baz");
}


11 commentaires

Cela ressemble à un bogue dans Jslint.


JSHINT n'a aucun problème avec votre première fonction.


Il semble être un bug. S'il s'agissait d'une opinion basée, vous obtiendrez une autre erreur indiquant clairement qu'il est froncé sur la base de votre configuration de peluche.


IDK Spécifiquement pourquoi JSlint a un problème, mais ce n'est pas un bon code. Si vous passez true ou 1 vous aurez un problème.


@Chrisgciso - JSlint n'est pas censé tester (évaluer) le code, mais s'il y a quelque chose de malheureusement faux, ça vous laissera savoir.


OMI L'option la plus claire serait foo = foo || ""; retour foo.replace (...) cela semble plus idiomatique


Oui, c'est l'un de ces moments où il est "bon".


@Chrisgciso - Si vous savez que foo sera soit faux, soit une chaîne, alors il n'y a absolument rien de mal avec le code que vous avez. Ce n'est pas une erreur de syntaxe. Ce n'est même pas une erreur de programmation si vous connaissez quelque chose sur les valeurs possibles de foo ou si vous souhaitez lancer une exception si un non valide est passé. Donc, dans de nombreux cas, l'utilisation du code dans la réponse acceptée est simplement un moyen de faire disparaître l'avertissement, pas quelque chose qui corrige tout ce qui était faux.


@Chrisgciso - Donc, Jslint vous oblige à faire face à quelque chose qui pourrait être parfaitement bon code alors que JSHINT a apparemment décidé de ne pas penser que cela vaut la peine de se plaindre. Ni vraiment bien ou faux - ce sont des opinions. Le seul droit et le mauvais droit vient quand on sait comment vous voulez que la fonction se comporte si / quand une valeur non valide est transmise pour foo ou si cela peut même arriver.


@Chrisgciso fwiw, "Jslint prend une source JavaScript et analyse. Si cela trouve un problème, il renvoie un message décrivant le problème et un emplacement approximatif dans la source. Le problème n'est pas nécessairement une erreur de syntaxe, bien que cela puisse souvent est. Jslint regarde des conventions de style ainsi que des problèmes structurels. Il ne prouve pas que votre programme est correct. Il fournit simplement un autre ensemble de yeux pour aider à résoudre les problèmes. Jslint définit .., une langue plus stricte que celle définie par la carte Ecmascript .. JSLint rejettera la plupart des programmes juridiques. " jslint.com/help.html


Voici une excellente réponse à une question similaire / liée.


3 Réponses :


1
votes

Ce peut être parce qu'il croit (foo || "") évaluera à une expression booléenne, alors quelque chose comme false.replace () n'aurait aucun sens. Même si oui, dans votre cas, vous obtenez une chaîne variable ou vide à la place.


2 commentaires

il ne serait jamais faux mais cela pourrait être vrai


Je ne dis pas que cela évaluera comme booléen, juste que Jslint peut croire que cela ressemblera à une expression booléenne. En outre, si foo est false , non défini , etc., puis l'expression utiliserait "" , qui est aussi faux. Comment pourrait-il être true si les deux cas pourraient être évalués à faux ?



1
votes

Utilisation de String () CODE> Contrendant Strike> supprime l'erreur sur JSLINT

function test(foo) {
    "use strict";
    return String(foo || "").replace("bar", "baz");
}


6 commentaires

@Chrisgciso Ceci passe également retour foo && foo.replace ("bar", "baz");


@Chrisgciso apparaît la méthode attachée à la chaîne littérale notifie comme avertissement chez JSlint? test de fonction (FOO) {"Utiliser strict"; si (! foo) {retour "" .replace ("bar", "baz"); }} , test de fonction (FOO) {"Utiliser strict"; si (! foo) {retour "bar" .replace ("bar", "baz"); }}


@Chrisgciso - Je ne dirais pas que c'est la voie "appropriée" de coder. C'est le moyen de faire des escales Jslint. Jslint n'est pas Dieu ici. Je peux écrire une fonction comme celle-là et je veux faire une exception si quelqu'un passe true car c'est une valeur non valide que je ne veux pas contraindre à une chaîne. Dans ce cas, cette nouvelle méthode est fausse.


Cette réponse n'a aucun sens. Il parle d'objets de chaîne et d'un constructeur string , mais utilise-t-il ni dans le code donné.


Ce n'est pas la bonne façon d'arrêter Jslint de compléter, c'est juste l'un des moyens de le faire arrêter de se plaindre. Et cela n'a rien à voir avec la fonction string du tout; Il s'agit de l'appel de fonction - numéro (foo || "") .replace (...) passe aussi bien.


@Chrisgciso: Je comprends qu'utiliser String est une solution de contournement agréable et ajustée - il jette explicitement sur le type attendu qui ajoute la sécurité et annotez le code; Et cela rend également l'avertissement disparaître. Mais il est faux d'indiquer que Jslint se plaint de l'ambiguïté et que la valeur de la valeur résout ce problème - Jslint a simplement un bogue à l'analyse de la syntaxe; et l'utilisation d'un appel de fonction résout celle-ci - elle pourrait aussi bien être pourrait-il putreTrurtunanyTout (foo || "") .replace (...) .



1
votes

Vous pouvez simplement en faire deux lignes.

function test(foo = "") {
    "use strict";
    if (typeof foo !== 'string') {
      throw('foo must be a string');
    }
    return foo.replace("bar", "baz");
}


0 commentaires