266 votes

Est-il un null-coalescence (Elvis) de l'opérateur ou de l'opérateur sécurité de la navigation en javascript?

Je vais vous expliquer, par exemple:

Elvis Opérateur (?: )

Le "Elvis opérateur" est une abréviation de Java de l'opérateur ternaire. Un exemple de cette pratique est de de retour a 'par défaut' de la valeur si une expression correspond à la valeur false ou la valeur null. Un exemple simple pourrait ressembler à ce:

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator

La Sécurité De La Navigation De L'Opérateur (?.)

La Sécurité de la Navigation opérateur est utilisé pour éviter une NullPointerException. Généralement, quand vous avez une référence à un objet dont vous pourriez avoir besoin de vérifier qu'il n'est pas null avant d'accéder à des méthodes ou des propriétés de l'objet. Pour éviter cela, la sécurité de la navigation opérateur de simplement retourner la valeur null au lieu de lancer une exception, comme donc:

def user = User.find( "admin" )           //this might be null if 'admin' does not exist
def streetName = user?.address?.street    //streetName will be null if user or user.address is null - no NPE thrown

170voto

Liam William Points 4668

Vous pouvez utiliser l'opérateur logique à la place de l'opérateur Elvis

Par exemple displayname = user.name || "Anonymous" .

Mais actuellement le Javascript qui n'ont pas d'autres fonctionnalités. Je vous recommande de regarder Cofeescript si vous voulez une alternative à la syntaxe. Il a une abréviation qui sont similaires à ce que vous recherchez.

Par exemple L'Opérateur Existentiel

zip = lottery.drawWinner?().address?.zipcode

Fonction de raccourcis

()->  // equivalent to function(){}

Sexy d'appel de fonction

func 'arg1','arg2' // equivalent to func('arg1','arg 2')

Il y a aussi les commentaires de plusieurs lignes et de classes. Évidemment, vous devez compiler ce code javascript ou insérez-le dans la page en tant que <script type='coffee/script>' , mais il ajoute beaucoup de fonctionnalités :) . À l'aide de <script type='cofee/script'> n'est vraiment prévu pour le développement et non de production.

88voto

Frédéric Hamidi Points 123646

Javascript est logique OU l'exploitant est de court-circuit et peut remplacer votre "Elvis" de l'opérateur:

var displayName = user.name || "Anonymous";

Cependant, à ma connaissance, il n'y a pas d'équivalent à votre ?. de l'opérateur.

13voto

hobbs Points 71946

Pour l'ex, vous pouvez utiliser ||. Le Javascript "ou logique" de l'opérateur, plutôt que de simplement retourner en conserve valeurs vrai et faux, suit la règle du retour de la gauche de son argument, s'il est vrai, et sinon, l'évaluation et le retour de son droit argument. Lorsque vous êtes seulement intéressés par la valeur de vérité, il fonctionne de la même manière, mais cela signifie aussi qu' foo || bar || baz renvoie le plus à gauche de foo, bar, ou baz qui contient la valeur true.

Vous ne trouverez pas un qui peut distinguer les faux null, cependant, et 0 et chaîne vide sont fausses valeurs, afin d'éviter à l'aide de l' value || default construire où value peut légitimement être 0 ou "".

5voto

Justin Ethier Points 57486

Vous pouvez obtenir à peu près le même effet en disant:

var displayName = user.name || "Anonymous";

2voto

balazstth Points 21

J'ai une solution pour que, de l'adapter à vos propres besoins, un extrait d'un de mes libs:

    elvisStructureSeparator: '.',

    // An Elvis operator replacement. See:
    // http://coffeescript.org/ --> The Existential Operator
    // http://fantom.org/doc/docLang/Expressions.html#safeInvoke
    //
    // The fn parameter has a SPECIAL SYNTAX. E.g.
    // some.structure['with a selector like this'].value transforms to
    // 'some.structure.with a selector like this.value' as an fn parameter.
    //
    // Configurable with tulebox.elvisStructureSeparator.
    //
    // Usage examples: 
    // tulebox.elvis(scope, 'arbitrary.path.to.a.function', fnParamA, fnParamB, fnParamC);
    // tulebox.elvis(this, 'currentNode.favicon.filename');
    elvis: function (scope, fn) {
        tulebox.dbg('tulebox.elvis(' + scope + ', ' + fn + ', args...)');

        var implicitMsg = '....implicit value: undefined ';

        if (arguments.length < 2) {
            tulebox.dbg(implicitMsg + '(1)');
            return undefined;
        }

        // prepare args
        var args = [].slice.call(arguments, 2);
        if (scope === null || fn === null || scope === undefined || fn === undefined 
            || typeof fn !== 'string') {
            tulebox.dbg(implicitMsg + '(2)');
            return undefined;   
        }

        // check levels
        var levels = fn.split(tulebox.elvisStructureSeparator);
        if (levels.length < 1) {
            tulebox.dbg(implicitMsg + '(3)');
            return undefined;
        }

        var lastLevel = scope;

        for (var i = 0; i < levels.length; i++) {
            if (lastLevel[levels[i]] === undefined) {
                tulebox.dbg(implicitMsg + '(4)');
                return undefined;
            }
            lastLevel = lastLevel[levels[i]];
        }

        // real return value
        if (typeof lastLevel === 'function') {
            var ret = lastLevel.apply(scope, args);
            tulebox.dbg('....function value: ' + ret);
            return ret;
        } else {
            tulebox.dbg('....direct value: ' + lastLevel);
            return lastLevel;
        }
    },

fonctionne comme un charme. Profitez de la réduction de la douleur!

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