Все остальные покрывали широкие мазки (особенно @Lapple), так что вот пара очень незначительных низко висящих предметов:
hours = (!hours) ? 12 : hours;
Можно сократить до:
hours = hours || 12;
... и является более читабельной идиомой (я думаю) для большинства программистов JavaScript.
Редактировать re: Ваш комментарий:
Я не знаю названия для этой конкретной идиомы. Как и в большинстве языков программирования, JavaScript использует оценку короткого замыкания для логических выражений, т. Е. Учитывая X || Y
, если интерпретатор уже может сказать, что значение выражения будет из X
(потому что X
является "правдивым" ), это никогда не мешает оценить Y
. Таким образом, вы можете сделать что-то вроде true || delete_everything()
, уверенное, что delete_everything
никогда не вызовут. Аналогично в X && Y
, если X
является «ложным», то Y
никогда не будет оцениваться.
Это может быть старая шляпа для вас. То, что делает JavaScript, менее распространено, однако, это то, что вы могли бы назвать оценкой «последнего значения» (это термин, используемый страницей Википедии, но я не уверен, является ли это общим термином вообще). Вместо возврата true
или false
из логического выражения, как в Java, или 1
или 0
, как в C, в JavaScript он просто возвращает последнее значение , оцененное.
Возьмите выражение hours || 12
. Если hours
равно undefined
(ложное значение в JavaScript), то интерпретатор просто вернет второй операнд (поскольку в OR
«истинность» выражения всегда равна правдивости второго операнда, когда первый операнд ложный). Однако, если hours
является правдивым - скажем, 9
или "banana"
, то выражение после его вычисления замкнется и вернет это значение. Повторюсь, но в коде:
var hours; // declared but has the value undefined
console.log( hours || 12 ); // `hours` (undefined) is falsy
// => 12 // so return the second operand
hours = 9;
console.log( hours || 12 ); // `hours` is truthy--short-circuit & return `hours`
// => 9
hours = "banana";
console.log( hours || 12 ); // `"banana"` is also truthy
// => "banana";
console.log( 12 || hours ); // `12` is truth--short-circuit & return `12`
// => 12
Кстати, в таких языках, как Ruby, у которых есть оператор ||=
, есть еще более короткая форма этой идиомы, довольно распространенная:
hours = nil # `nil` is like `null`
hours = hours || 12 # just like in JavaScript
# => 12
# but the below is equivalent:
hours = nil
hours ||= 12
# => 12
Так что в Ruby нередко можно увидеть такие методы:
def foo(bar, baz = nil) # `baz` defaults to `nil` when no 2nd argument is given
baz ||= get_default_baz()
puts bar + baz # `puts` is like `print` or `echo` in other languages
end
def get_default_baz # a trivial example
"WXYZ"
end
foo('ABC', 'DEF')
# => ABCDEF
foo('ABC')
# => ABCWXYZ
(конец редактирования)
А здесь:
var a = 0,
start,
abbr,
hours,
time = document.getElementById('timeline');
hours = (!hours) ? 12 : hours;
... вы объявляете hours
в строке 4, а затем назначаете его в строке 7, когда вы можете сделать оба одновременно:
var a = 0,
// ...
hours = hours || 12
// ...
;