Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В ответ на https://t.co/aAvOuymZXQ сразу гиперссылку https://t.co/UBD4CnkFFu дают, и это очень правильно как аргумент в пользу микромодулей.
— Mithgol (@FidonetRunes) 24 марта 2016 г.

очень странно всё-таки не хотеть хотя бы примерно знать как это должно работать, хотя бы одним глазком взглянуть на исходник, особенно если нам намекают, что там творится какая-то магия!Хочется — взгляните, кто ж вам мешает? Мне, например, не хочется. Мне хочется, чтобы работало и бизнесовая логика быстрее писалась.
знаем/загуглили про Array.isArray/[object Array], сразу пишем в коде Array.isArray/[object Array]
utils.js? И в следующем проекте вы тоже будете его копипастить? Это как-то не очень здорово, если честно.lodash, а у кого-то она будет излишней и зависимость от конкретного isArray будет весьма кстати.Нет нужды комментировать очевидные вещи.
Чтобы использовать пакет, надо прочитать документацию
typeof ''
«string»
typeof []
«object»
typeof {}
«object»
toString.call('')
"[object String]"
toString.call([])
"[object Array]"
toString.call({})
"[object Object]"
Call to function isArray1(obj)
{
return obj instanceof Array;
} took 10.195000000000022 milliseconds.
Call to function isArray2(obj)
{
return (typeof obj == «object»);
} took 12.25 milliseconds.
Call to function isArray3(obj)
{
return Array.isArray(obj);
} took 26.909999999999968 milliseconds.
Call to function isArray4(obj)
{
return toString.call(obj) == '[object Array]';
} took 1597.9850000000001 milliseconds.
{
const src = [1,2,3,4,5];
const wrong = { foo: 1 };
const arr1 = it => typeof it[Symbol.iterator] === 'function';
const arr2 = it => it instanceof Array;
const arr3 = it => Array.isArray(it);
const arr4 = it => toString.call(it) == '[object Array]';
Array.prototype.forEach.call([ arr1, arr2, arr3, arr4 ], (f, i) => {
const fname = `arr${i+1}`;
console.log(`----- ${fname} -----`);
console.time(fname);
const result = f(src);
console.timeEnd(fname);
console.assert(result === true);
console.assert(f(wrong) === false);
});
}
/*
----- arr1 -----
arr1: timer started
arr1: 0.63ms
----- arr2 -----
arr2: timer started
arr2: 0.55ms
----- arr3 -----
arr3: timer started
arr3: 0.53ms
----- arr4 -----
arr4: timer started
arr4: 1.2ms
*/typeof obj[Symbol.iterator] === 'function'typeof null === 'object'.Что мешало грамотному чуваку это сделать на год-два раньше?А зачем?
Почему все бездумно используют модули, но не смотрят, что у них находится под капотом?Потому что люди так устроены. Они не роботы и не хотят делать то, чего можно не делать.
Почему принято считать, что велосипед всегда будет хуже, чем ранее написанный код?Потому что велосипед нужно написать, очевидно же.
Переиспользование кода — благо
Но очевидно, что наиболее популярные вещи не должны оставаться «независимым пакетом», и кто-то, кто близок к разработке стандарта языка, должен следить и за содержимым стандартной библиотеки, втягивать их «внутрь», покрывать тестами, оптимизировать и так далее. От этого прямо зависит популярность и удобство инструмента.Они как раз начали этим заниматься и теперь довольно плодотворны на обновления языка.
Что там у нас сейчас самое популярное — java?JavaScript
Фам Нювен несколько лет провел, обучаясь программировать и исследовать. Программирование восходило к началу времен. Как та навозная куча за замком отца. Когда ее промыло ручьем на десять метров в глубь, обнаружились искореженные корпуса машин – летающих машин, как говорили крестьяне, еще от тех великих дней колонизации Канберры. Но та навозная куча была чистой и свежей по сравнению с тем, что лежало в локальной сети «Репризы». Были программы, написанные пять тысяч лет назад, когда человечество еще не покинуло Землю. И самое чудесное (самое ужасное, как говорила Сура) было то, что, в отличие от бесполезных обломков прошлого Канберры, эти программы все еще работали! И через миллион миллионов запутанных нитей наследования многие из старейших программ все еще выполнялись во внутренностях системы Кенг Хо. Например, методы слежения за временем у торговцев. Поправки вносились неимоверно сложно – но на самом дне лежала крошечная программа, которая гоняла счетчик. Секунду за секундой отсчитывала система Кенг Хо с того момента, как нога человек ступила на Луну Старой Земли. Но если приглядеться еще пристальнее… начальный момент был миллионов на сотню секунд позже; момент «ноль» одной из первых компьютерных операционных систем Человечества.
$.getJSON('/my/url', function(data) {});var request = new XMLHttpRequest();
request.open('GET', '/my/url', true);
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
// Success!
var data = JSON.parse(request.responseText);
} else {
// We reached our target server, but it returned an error
}
};
request.onerror = function() {
// There was a connection error of some sort
};
request.send();
$(el).fadeIn();function fadeIn(el) {
el.style.opacity = 0;
var last = +new Date();
var tick = function() {
el.style.opacity = +el.style.opacity + (new Date() - last) / 400;
last = +new Date();
if (+el.style.opacity < 1) {
(window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);
}
};
tick();
}
fadeIn(el);не являющиеся элементами цикла— пример можно о таком не слышал
но однобуквенные переменные, не являющиеся элементами цикла, вам не удастся протащить через линтер
— пример можно о таком не слышал
Иначе мы просто повторим комментарии к вашим публикациям с тем же нулевым результатом.
с тем же нулевым результатом
Вот эти вот «параметром функции» и «в другом цикле» — это признаки «кода с душком».
ваши представления о правильном и хорошем коде очень сильно различаются с общепринятыми
На личности я не переходил. До меня уже перешли, вроде, а я сразу открестился от дальнейшего обсуждения
webpack --optimize-minimize$(".blahblah").height("100%"). Теперь каналы стали меньше? Вы таки уверены, что в собранном бандле каждая строчка вам приносит пользу и строго необходима?результат стратегии NPM по решению проблемы dependency hell — каждому модулю своя копия всех зависимостей, нужной версии. (ничего ж не путаю? оно так устроено?)Нет, ужé не «копия всех зависимостей»: npm, начиная с третьей версии, складывает все зависимости в кучу в подкаталог node_modules первого уровня до тех пор, пока два модуля не потребуют одну и ту же зависимость разных версий (и тогда она, и только она, достанется каждому такому модулю в виде своей копии нужной версии). Экономия.
— эта строка просматривается бòльшим числом глаз чем она просматривалась бы в одном проекте
— эта строка имеет меньшую вероятность внести ошибку в проект нежели написанная с нуля, особенно неискушённым разработчиком
function isArray(a){
return a && a.constructor === Array;
}
function pading(a, b) {
return Array(b).join(" ") + a;
} true true true true undefined false null undefined false false false false true function isArray(a){
return a && !!(a.constructor === Array);
}function isArray(a){
return !!(a && a.constructor === Array);
} Array.isArray({ __proto__: Array.prototype }); не пройден. У правильной функции там false. Единственно верный способ там указан:if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}function getTypeOf(a) {
return (void 0 === a || null === a ? String(a) : {}.toString.call(a).replace(/\[.+?(\w+)\]/, '$1').toLowerCase()) || '';
}зачем писать обертку для того, что есть и/или пишется одной строкой.
function isArray(a){
return !!(a && a.constructor === Array);
}что на самом деле эти строки — это кусочек знания (о массивах, об исключительных случаях, и т.д.)
"undefined" === typeof Array.prototype.isArray && (Array.prototype.isArray = true);
Array.isArray || (Array.isArray = function(arg) {return arg.isArray;});function pading(a, b, c) {
return Array(b).join(c) + a;
}var str+=Array(2).join("0");var str=Array(2).join("0") + str; function pading(a, b, с) {
return (Array(b).join(c) + a).substr(-1*b);
}зачем писать обертку для того, что есть и/или пишется одной строкой.
function pading(a, b, с) {
return a.length < b ? (Array(b).join(c) + a).substr(-1*b): a;
}function pading(a, b, с) {
return (b+=1,a.length < b ? (Array(b).join(c) + a).substr(-1*b): a);
}Некогда не понимал зачем писать обертку для того, что есть и/или пишется одной строкой.Долго упирался, и не мог сформулировать, почему?
На мой взгляд подобный код не имеет смысла оборачивать в функции.
NPM и left-pad: мы разучились программировать?