Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
CoffeeScript is a programming language that transcompiles to JavaScript. The language adds syntactic sugar inspired by Ruby, Python and Haskell
>> операторы диапозона (.., ...),
а в пайтоне такого нет?
>> операторы определения (?),
это вообще бред полнейший, в руби такого «оператора» нет (если вы не о тернарном операторе конечно), просто в руби имя метода может содержать '?'.
a = foo? bar
var a = typeof foo === "function" ? foo(bar) : void 0;
a = foo ? bar
var a = typeof foo !== "undefined" && foo !== null ? foo : bar;
defined? foo
defined? foo(bar)
Уже 2 недели пишу на cs и пока так и не понял, мешает он мне или помогает.Чем он конкретно он мешает?
я могу написать «x = 1; x?; x????????» и последнее будет валидно и скомпилируется.
Мне не очень понятен синтаксис опредения функции, `(x) -> ()` — выглядит очень неряшливо и легко теряется в коде.Мне наоборот нравится такая запись.
x -> (x)
((x)->)(x)
do (x) -> x
foo = -> 1
do foo
fn -> x
-> 1
но получился перебор, много сахара, слишком много, там где сахар этот вообще не нужен
на момент публикации (январь 2009)
var result;
var container = document.getElementById('container');
var i = someArray.length;
while (i--) {
result = 'my number: ' + i + result;
console.log(i);
}
container.innerHtml += result;
for(
var i=0,
len=someArray.length,
container = document.getElementById('container');
i<len;
container.innerHTML+='my number: '+i+'<br>',
i++
);
ECMAScript — есть в проекте 6-й редакции.container.innerHTML = someArray.join('|').replace(/([^\|]+)\|?/g,function(){return 'my number: '+ (typeof p!='undefined' ? ++p:(p=0))+'<br>'});
for (var i = 0, html = '', len = someArray.length; i < len; i++) {
html += 'my number: ' + i;
}
document.getElementById('container').innerHTML = html;Я вроде про буфер уже говорил.
Не надо в меня тестами кидаться.
Вы суть то не уловили [...]
for». Более того, я также заметил, что Вы не знаете, как работают переменные в JavaScript, плюс (по моему личную мнению) также не знаете как выглядит «читаемый код».Смысл моего примера в том, что напрямую связанное с инкрементом единичное действие нефиг выделять в блок выполнения. Ему очень комфортно в итераторе. (проверьте тем же тестом)
Добавьте ваш семантически мусорный буфер в мой код и запустите тот же тест. Теперь мой код быстрее.
На реальной производительности (где на DOM куча вочеров, стилей, событий) наличие буфера никак не сказывается. А вот на «засорение» — да.
И вот пишут мне потом такие «спичечные» оптимизаторы: «посмотри ка мой код, что-то у меня не пойму все зависает после 15 минут работы, хотя везде все оптимизировано».
function sum (a, b) {
return
a + b;
}
Это не должно относиться к coding style, это должно быть обязательным.
var foo = 1
, bar = 2
, baz = 3;
Давным-давно это не было редкой практикой использования аттрибута language у тега script.
У Ильи Кантора встречается более элегантная форма записи
for(prop in object) if (object.hasOwnProperty(prop)) { //... }
но честно говоря я не уверен какие браузеры могут корректно обрабатывать ее.
Прим. пер.
for (var prop in object)
if (object.hasOwnProperty(prop)) {
//...
}
Object.hasOwnProperty есть во всех актуальных браузерах и даже в старых IE (начиная с 5.5).Из-за этого тупого утверждения «Eval = Bad» большая часть приложений используют воистину извращённые способы выполнения кода на клиенте, но по сути те же eval.
4. Используйте JS Lint
Я встречал на практике только одну реальную проблему с этим делом — когда между return и значением ставится перенос строки. Обязательная точка с запятой проблему эту не решает. Эта проблема решается повсеместными египетскими скобками.
5. Переместите скрипты вниз страницыМожно еще аттрибут async добавить.
// Cycle through array and echo out each name.
for(var i = 0, len = array.length; i < len; i++) {
console.log(array[i]);
}
Надо писать код так, чтобы его не надо было комментировать.
font = ImageFont.truetype(self.FONT_FILENAME, int(self.lines_height[len(text)] * 2))
font_size = font.getsize(text)
font_img = Image.new('RGBA', font_size, 0)
mask = Image.new('L', font_size, color=255)
draw = ImageDraw.Draw(mask)
draw.rectangle((0, 0, font_size[0], font_size[1]), fill=0)
font_img.putalpha(mask)
draw = ImageDraw.Draw(font_img)
draw.text((0, 0), text, font=font, fill=self.COLOR)
font_img = trim(font_img)
ratio = float(font_img.size[1]) / font_img.size[0]
height = int(ratio * self.line_width)
region = font_img.resize([self.line_width, height], Image.ANTIALIAS).crop([0, 0, self.line_width, height])
lines.append(region)createFont()
drawRectangle()
drawText()
extractRegion()convertSingleSailInTwoSailsPerDayForMinskRoute()function main(){
//...
doSomething();
//...
return;
function doSomething(){
//...
}
}
// Create font
...
// Draw rectangle
...
Не о том же речь.
18. Оператор „for… in“
При проходе в цикле через свойстав обьекта вы также обнаружите что получаете в том числе и функции. Для избежания этого необходима проверка с if hasOwnProperty
var o = {a:1, f:function(){}}
for(var key in o)
if(o.hasOwnProperty(key)) console.log(key)
//a
//f
Вообще Object.prototype.hasOwnProperty проверяет принадлежит ли свойство непосредственно обьекту а не его цепочке прототипов. Подробнее можно почитать в JavaScript Garden
У Ильи Кантора встречается более элегантная форма записи
Воспользуйтесь прогрессивным улучшением (progressive enchantment)
24 совета javascript-разработчику