Jun 22, 2012 16:48
По сравнению с остальными curly-braced languages, JavaScript имеет в синтаксисе ряд вольностей в духе Питона. Сегодня это вылилось для меня в нешуточные вилы:
вот этот код работал очевидно неправильно
243 return
244 (true && this.ops.length>0 &&
245 this.lastSavedIdx
246 this.ops[this.ops.length-1].isMergeable());
...а этот очевидно правильно
243 var ret =
244 (true && this.ops.length>0 &&
245 this.lastSavedIdx
246 this.ops[this.ops.length-1].isMergeable());
247 return ret;
Строки 244-246 идентичны.
Спрашивается, на что влияет предварительное укладывание возвращаемого значения в переменную?
Ответ: в JavaScript переводы строк значимы, ";" можно пропускать. Это синтаксическое подмигивание тупорылым быдлокодерам выливается в неочевидные вилы: в первом случае перевод строки значим и возвращается undefined, во втором - открытое присваивание делает перевод строки незначимым, и возвращается что нужно.
Суки.