Подтвердить что ты не робот

Javascript эквивалент метода проверки Rails

В Rails я могу сделать это:

 x = user.try(:name)

этот метод возвращает nil, если user есть nil else user.name. Здесь name - это метод, определенный для объекта user.

Я знаю, что это можно сделать с помощью if..then..else в Javascript, но есть ли эквивалентный компактный метод, чтобы сделать то же самое в Javascript?

Google указывает на команду Javascript try, которая не является тем, что я ищу.

4b9b3361

Ответ 1

Вы можете сделать это, так как нет встроенного способа сделать это:

var x = (user || {}).name;
  • Если пользователь не определен /null, вы получите undefined
  • Если пользователь определен, вы получите свойство name (которое может быть установлено или undefined).

Это не сломает script, если пользователь не определен (null).

Но пользовательская переменная должна быть объявлена ​​некоей, где в области, хотя ее значение не определено. В противном случае вы получите сообщение об ошибке, которое не определено пользователем.

Аналогично, если находится в глобальной области, то вы можете явно проверить эту переменную как свойство глобальной области видимости, чтобы избежать ошибки, указанной выше.

ex:

 var x = (window.user || {}).name; // or var x = (global.user || {}).name;

Для безопасного выполнения функций

 var noop = function(){}; //Just a no operation function

 (windowOrSomeObj.exec || noop)(); //Even if there is no property with the name `exec` exists in the object, it will still not fail and you can avoid a check. However this is just a truthy check so you may want to use it only if you are sure the property if exists on the object will be a function.

Ответ 2

Вы можете использовать логический оператор AND (&&). Он работает иначе, чем на большинстве языков, потому что его результат не является логическим. Пример:

const x = user && user.name;

В приведенной ниже таблице показаны все возможные результаты использования этого оператора:

+--------------+-----------------------+
|    user      | x = user && user.name |
+--------------+-----------------------+
| undefined    | undefined             |
| null         | null                  |
| {}           | undefined             |
| {name:''}    | ''                    |
| {name:'Jon'} | 'Jon'                 |
+--------------+-----------------------+

Ответ 3

В Rails4, try делает это:

Вызывает общедоступный метод, имя которого входит в качестве первого аргумента, как это делает public_send, за исключением того, что если получатель не отвечает на него, вызов возвращает нуль, а не создает исключение.

В Rails3, try похож на try! в Rails4 и тот же, что и try, за исключением того, что он жалуется, объект не понимает метод, который вы пытаетесь вызвать. Первоначальным намерением try было скрыть кучу проверок nil, чтобы вы могли сказать:

o.try(:m)

вместо

o.nil?? nil : o.m

В версии Rails4 также скрывается проверка, понимает ли объект метод, который вы хотите вызвать.

В JavaScript нет специального синтаксиса, но вы можете охватить уродство в функции.

Версия Rails4 try будет выглядеть как эта функция в JavaScript:

function rtry(obj, m) {
    if(obj == null)
        return null;
    if(typeof obj[m] === 'function')
        return obj[m].apply(obj, [].slice.call(arguments, 2));
    return null;
}

и вы бы сказали, что такие вещи, как x = rtry(obj, 'method_name', arg1, arg2, ...) и x, были бы null, если obj не понял method_name (включая if obj is null или undefined).

Демо: http://jsfiddle.net/ambiguous/BjgjL/

A Rails3 версия проста, что просто a null check:

function rtry(obj, m) {
    if(obj == null)
        return null;
    return obj[m].apply(obj, [].slice.call(arguments, 2));
}

и сам JavaScript вызывает исключение obj не имеет метода m. Эта версия эквивалентна экзистенциальному оператору "это функция" экзистенциального оператора CoffeeScript ?.

Демо: http://jsfiddle.net/ambiguous/FQCS2/


Как обычно, все может не так хорошо работать, если вы имеете дело с собственными методами, а не с методами, написанными на JavaScript. typeof (6).toString может быть 'function' в одной среде JavaScript, но я не думаю, что всегда будет 'function' везде. Первичное использование (т.е. Скрытые null и undefined проверки) должно работать везде, но.

Ответ 4

Я так не думаю. Почему бы вам не свернуть? Не совсем эквивалентно, но выполняет эту работу.

function tryMe(obj) {
  return obj === null || obj === undefined ? null : obj;
}

Ответ 5

Разве это не то, что это дает вам в Javascript:

user['name']
user.name

Это возвращает undefined вместо nil, но в большинстве случаев это эквивалентно. Я думаю, что причина, по которой Rails нуждается в методе try, заключается в том, что вы не можете получить доступ к переменным экземпляра, если они не становятся доступными.

Чтобы добавить к подходу @PSL, я обычно делаю что-то вроде:

var x = user || {},
    y = x.name || {},
    z = y.first_name;