спасибо, а книгу посоветуете? По плюсам шилдта скачала, с него хотела начать. Но раз советуете с си...
не посоветую =) изучал сначала на уроках информатики в школе, потом по гайдам в интернете. с книгами не срослось.
это однозначно, строка + строка, а вот строка с числом начинают творить херню. Лучше бы уж ошибку выдавал.
Не вижу ничего странного, если учитывать, что JS приводит к равным типам данных, в данном случае к числу. Так как машинно логическая правда задается как 1, а логическая ложь - 0, то не удивителен результат.
x = 2 + 3
JS:
npm install num-add react-num-add redux-num-add num-add-webpack-boilerplate gulp-num-add-boilerplate num-add-jslint-config num-add-suka-blad-over9000
Ну нихрена себе дедукция)
Так-то у меня ник с id одной известной соц. сети совпадает и в постах ссылка была)
Ога. И ты такой весело на нём тайпскриптишь себе, с типами и сигнатурами методов. А потом твой код, транспилированный в JS, теряет, ска, контекст.
Или уже спустя 15 лет таки можно?
Эм....
function sum(a, b){
// Поскольку язык динамический то проверка на типы с использованием
// тернарного оператора
// Является ли переменная числом
// Если переменная вмещает в себя строку и начало строки имеет число то
// можно парсить число из строки (в остальных вариантах будет NaN)
// Если ни одна проверка не срабатывает то назначаем переменной 0
a = typeof a === "number" ? a : typeof a === "string" && (/^[0-9]/g).test(a) ? parseInt(a) : 0;
b = typeof b === "number" ? b : typeof b === "string" && (/^[0-9]/g).test(b) ? parseInt(b) : 0;
return a + b;
}
Никаких пакетов не нужно. Это болячка людей на максимально простую задачу заливать в регистр абсолютно ненужный код. А потом все удивляются а почему же блин папка node_modules весит минимум гигабайт!
Будет NaN, ведь я написал не функцию, которая переварит любой подсунутый ей треш, а функцию, которая складывает два числа.
Зачем писать f("2яблока", "5яблок")? Разумнее числовые данные хранить как числа, и лишь при необходимости записать результат - делать форматированный вывод. Иначе никакого i5 не хватит гонять перевод из строки в число, потом опять в строку, и так по кругу кучу раз. (если подразумевать, что нужно в результате иметь "7px").
Если вам на выходе неприемлем NaN и вы опасаетесь, что в функцию каким то чудным образом попадут не sanetized данные, то можно сделать assertion примерно так:
assert = {number: (x, text) => { if(typeof x != 'number' || isNaN(x)) throw new Error(text); return x; };
assert.number(f("2px", "5px"), 'складываем чушь') //кинет исключение, вы будете знать что у вас что-то не так
Иногда (лично у меня чаще всего) то что можно использовать на проекте и то что хочется - не пересекающиеся множества.
TS силен там, где кодобаза 100к+ строк, в этом согласен.
Это абсолютно нормально, такое во всех языках при использовании переменных с плавающей запятой. Для точных вычислений дробных чисел используется decimal типы (к примеру финансовых расчётах)
"Любой язык:"
Кхм, в нормальных языках это зависит от типа данных. Если это обычные числа с плавающей точкой, то вы говорите неправду
Насколько помню в EC6 при "строгом коде" уже все норм ибо подключаются современные стандарты, а без "строгого кода" мы имеем тот самый древний, намешанный для js. А в нодэ сразу по нормальному сделано.
Другое дело это callback hell в js. Мля я до сих пор из-за этого не могу нормально делать в js ибо рекурсивные функции в функции это пздэ.
Я вам открою тайну, Promise - это система callback, с помощью которой и обернули в эти ващи then
Я вам открою тайну, async/await - это очень вкусный сахар для Promise, позволяющий писать в синхронном стиле
function Promise(startFunc){
this._thenCallbacks = [];
this._catchCallbacks = [];
this.then = function(thenFunction){
this._thenCallbacks.push(thenFunction);
return this;
}
this.catch = function(catchFunction){
this._catchCallbacks.push(catchFunction);
return this;
}
this._resolve = function(result){
var res = result;
this._thenCallbacks.forEach(function(f){
try {
res = f(res);
} catch(err){
res = this._reject(err, res);
}
});
}
this._reject = function(err, res){
for(var i=0; i<this._catchCallbacks.length;i++){
return this._catchCallbacks[i](err,res);
}
}
startFunction(this._resolve,this._reject);
}
Вот так примерно на пальцах и работает ваш Promise. Если не верите, то можете вставить в дебаггер и стартануть через new Promise(function(resolve,reject){ ... })
Все новые фишки что есть в JS написаны на самом JS. И если вы не понимаете как это сделано изнутри, то вы не способны понимать JS.
у вас контекст отклеился
– – – startFunction(this._resolve,this._reject);
+++ startFunc(this._resolve.bind(this), this._reject.bind(this));
С телефона о_О без автокоплита и подсветки синтаксиса такую простыню накатать. Да вы псих (в хорошем смысле)
Кстати, на самом деле в коде есть несколько логических ошибок, например, из catch массива лучше всего брать методы через splice, чтобы не повторять вызванные catch, bind, о котором вы указали, ну и все это желательно реальзовывать через прототипы
Привык уже) Иногда в Vi или Nano код правлю или еще что-нибудь... Дебажить minify код в дебагере тоже можно, примерно вычислив точку входа... Это не сложно. Подсветка помогает находить неправильные/неиспользумые переменные, а автокомплит нужен только в больших методах, которые писать изначально плохо.
Да хоть на 1С там всё внутри написано, мне всё равно. Вопрос был в другом. Если вы не понимаете в чем вопрос, то вы не способны дать ответ.
Посмотрите еще раз как там работает изнутри - все на callback, просто это декорировано в красивый вид. Promise - это обертка (декорирование) над callback. Собственно, для этого он и создавался.
Учитывая, что "сахар" в данном случае - это просто жаргонизм с довольно широким спектром значений, не представляю, чем это принципиально не так. Изволите пояснить ваше утверждение?
Не вижу никакой ширины спектра значений. Пнул вики.
Синтаксический сахар (англ. syntactic sugar) в языке программирования — это синтаксические возможности, применение которых не влияет на поведение программы, но делает использование языка более удобным для человека.
Промисы же не только убирают лапшу, но и работают иначе. Самое главное, что есть композиция этих самых промисов.
Промисы убирают лапшу, но иначе не работают - это все те же самые возможности языка на callback.
У колбеков есть композиция? Или что-то типа Callback.all ? Спорить не буду дальше, считай это декорированием ;)
.all пишется с помощью того же кода: ждем ответа от всех callback (с счетчиком, массивом списка выполненных - как хотите) и потом выполняем функцию-переменную-callback, которая была передана первым аргументом в метод all
Да, промисы в определенный момент вынесли даже в ES (описание как должны работать), но суть одна и та же.
Да, удобство колоссальное, но это именно удобство для программиста - всего, что дают промисы, можно без проблем добиться без них.
Хм.. любопытно. Жаль что там всё по нерусски.
Просто с такими косяками сложения только в js встречался, остальные языки как-то справлялись
английский нужен еще, если не хочешь до конца дней прожить в стране, где могут посадить по любому поводу на бутылочку...
"Любой язык:
0.2+0.3 = 0.5"
Хотел сперва ответить грубо, но потом подышал немного и решил написать, что вы мягко говоря неправы за "любой язык".
Вы, вероятно, не в курсе про представления дробныя чисел в компьютере. Любой язык
Посмотрите на Double в Java/C#/C++. Он ведёт себя так же.
Стандарт - не проверять плавающую точку на равенство. В нормальных языках проверяют или с дельтой (0.2+0.3 > 0.5 - eps) && (0.2 +0.3 < 0.5 + eps), или до первого поушама за говнокод, или с особыми типами, или - что чаще - пишут библиотечную функцию сравнения, подходящую для определённого случая/проекта, которая всё сравнивает как надо (т.е. с приведением в один формат, дельтами и т.д.).
В JS 0.2 + 0.3 == 0.5. Проверьте в консоли браузера.
Но если увеличивать переменную в цикле на 0.1, то можно заметить неточности.
Но это особенность стандарта записи чисел с плавающей точкой. https://ru.wikipedia.org/wiki/IEEE_754-2008
К языкам никакого отношения не имеет.
серьезно?
https://www.quora.com/Why-is-0-1+0-2-not-equal-to-0-3-in-mos...
>Why-is-0-1+0-2-not-equal-to-0-3-in-most-programming-languages
>in-most-programming-languages
1) Не нужно, так как я сравниваю число и число
2) Не нужно, так как пункт 1 + захламляет код лишним знаком + лишняя операция сравнения по типу
Любой язык:
0.2+0.3 = 0.5
JS:
0.2+0.3 > 0.5
Всегда думал, что к дробным числам нельзя применять операции строгого равенства, но MinGW почему-то со мной несогласен. В любом случае, я бы не удивился, увидев результатом сложения 0.4999999999999999999999.
А теперь float попробуй - в C++/C# это довольно неслабая подстава, и да - там ты получишь из 1+1 1.9999....
А теперь float попробуй
*к коллайдеру.jpg*
P.S. Блин, нафига я всё это пишу? Мне что, на работе автотестов мало? Надо срочно пойти накатить и идти в другие темы деградировать... :)
Замени на 0.1 и на 0.2 к примеру. FPU не даст тебе этого чудного результата.
0.5, 0.25 и прочие степени 1 / 2^n - круглые числа, а вот 0.3 и 0.1 - ни фига не круглые.
Разницы в сложении чисел нет, но есть разница в представлении чисел с мантиссой и экспонентой. Либо используется длинная арифметика, когда 1/3 равно 0.3333...стопицот единиц, либо использется FPU, где это равно 1/3 = 0.333333339 (к примеру)
нормально они их считают это двоичная дробь в десятичную херова переводится, не нагнетайте
Я в курсе. Когда нужно произвести много сложных вычисления с высокой точностью эти косяки накапливаются в каждом действии и на выходе получается херня полная.
для этого чтобы этого избежать надо побаловатсья с флагами FPU почитать правильную литературу, для ЛЛ есть библиотеки например фортрановские
var1_0 dd 1.0
var3_0 dd 3.0
res dd ?
res_str db "result: $"
new_line db 10, 13, "$"
...
finit
fld var1_0
fld var3_0
fdiv
fstp res
write_str res_str
write_float res
write_str new_line
Я по его синтаксису писал. Ну и само собой тут нет заголовков, подключения макросов и прочей такой херотени.
для простых действий подключается куча инструментов, от которых нужна лишь малая часть функционала.
это как использовать швейцарский нож вместо ножа, ложки и открывашки, но при этом этот швейцарский нож будет по массе и размер такой же, как и нож, ложка и открывашка вместе взятые.