Должен ли я использовать CoffeeScript впитывается и экзистенциальный оператор вместе? - PullRequest
3 голосов
/ 07 октября 2011

Я работаю над сценарием, который принимает объект settings, но использует значения по умолчанию, где настройки не предоставлены.

Я только что написал следующую строку CoffeeScript:

iframe_width = settings?.iframe?.width? ? $iframe_body.width()

Моим намерением на простом английском языке является:

Если определен объект settings, и он определяет свойство iframe, а свойство iframe определяет свойство width, затем присвойте значение последнего свойства переменной iframe_width.В противном случае присвойте возвращаемое значение, вызвав $iframe_body.width().

Отражает ли мой код CoffeeScript мои намерения и является ли это наиболее эффективным способом выразить это?Это кажется неудобным со всеми экзистенциальными операторами (?), поэтому я хотел высказать это для некоторой обратной связи (скомпилированный JavaScript очень лаконичен и загадочен, поэтому трудно сказать, должен ли он работать как задумано).

Кроме того, я не уверен, есть ли какая-либо избыточность в использовании как стандартного экзистенциального оператора (?), так и его варианта доступа (?.) вместе.

Спасибо!


Обновление:

Код, приведенный выше, не работает должным образом;однако, это так:

iframe_width = settings?.iframe?.width ? $iframe_body.width()

Это имеет смысл, поскольку я не думаю, что предыдущий код фактически обращается к свойству width, а просто проверяет его существование (дважды, даже?).В этом коде я удалил ? сразу после свойства width, так как я считаю, что это избыточно с оператором ? между двумя выражениями.Это кажется правильным?

1 Ответ

6 голосов
/ 07 октября 2011

( Примечание : Этот ответ был написан до того, как вопрос был обновлен. Как понял опрашивающий, foo? ? bar не просто избыточен - он фактически не будет работать, потому что foo? оценивается как true или false, и поэтому всегда ненулевое.)

У вас есть два хороших варианта для упрощения этого: во-первых, вы можете заменить экзистенциальный бинарный оператор на or:

iframe_width = settings?.iframe?.width? or $iframe_body.width()

Два, вы можете отказаться от ? после width - это избыточно:

iframe_width = settings?.iframe?.width ? $iframe_body.width()

Теперь, вы можете сделать и тогда и только тогда, когда iframe.width никогда не будет 0 (поскольку 0 or x равно x). Если вы можете быть уверены в этом, сделайте это

iframe_width = settings?.iframe?.width or $iframe_body.width()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...