В JavaScript:
a || b
эквивалентно a ? a : b
a && b
эквивалентно a ? b : a
- любая непустая строка в логическом выражении имеет значение true
С этим знанием логика оператора return становится довольно простой.
Предположим, например, что day_diff = 5
Затем пошагово взяв утверждение сверху:
return day_diff == 0 && (
diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
day_diff == 1 && "Yesterday" ||
day_diff < 7 && day_diff + " days ago" ||
day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
Сначала day_diff == 0
оценивается как false
, а с правой стороны:
(diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor( diff / 3600 ) + " hours ago")
... не оценивается. Обе стороны:
day_diff == 1 && "Yesterday"
... оценить до false
. Далее идет:
day_diff < 7 && day_diff + " days ago"
В этом выражении day_diff < 7
оценивается как true
, поэтому его правая часть, представляющая собой строку, будет оценена, а ее результат будет возвращен.
Дальнейшее чтение:
http://www.ejball.com/EdAtWork/2005/02/19/JavaScriptBooleanOperators.aspx