Javascript эквивалент метода проверки Rails
В Rails я могу сделать это:
x = user.try(:name)
этот метод возвращает nil
, если user
есть nil
else user.name
. Здесь name
- это метод, определенный для объекта user
.
Я знаю, что это можно сделать с помощью if..then..else
в Javascript, но есть ли эквивалентный компактный метод, чтобы сделать то же самое в Javascript?
Google указывает на команду Javascript try
, которая не является тем, что я ищу.
Ответы
Ответ 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;