Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Hедопонимание с typeof (https://javascript.ru/forum/misc/65024-hedoponimanie-s-typeof.html)

ochen 20.09.2016 18:26

Hедопонимание с typeof
 
Приветствую.
Объясните, пожалуйста, почему буква превращается в цифру, когда typeof?
Я, вероятно, не понимаю многого, но тут совсем не понимаю.

var str = 'd23';
console.log(isNaN( +str[0])); // true 
console.log(isNaN( str[0])); // true
 
 console.log(typeof str[0] == "number"); //false
 console.log(typeof +str[0] == "number"); //true

ochen 20.09.2016 23:17

Если преобразовать строку в число использую унарный "+" или number(), то результатом является NaN. Т.е.функция isNaN("какая-нибудь строка") возвращает true, т.к. это не может быть приведену к числу. Почему же typeof говорит, что это число, если это NaN. Я не могу понять именно этот момент.

Coriolan161 20.09.2016 23:22

ochen,
потому что NaN относится к Number))) Это типа число, которое нифига не число. Или как в матанализе - неопределенность

ochen 20.09.2016 23:26

Как вообще можно это понять, если везде написано, что NaN это НЕ ЧИСЛО. Даже в описание number.NaN написано, что это не число. Т.е. typeof считает его числом, но нигде не написано, что это число? Или это где-то в очень сложных книгах?

Coriolan161 20.09.2016 23:43

ochen,
Умом Россию не понять. Почитай экму

ochen 20.09.2016 23:58

Да, вот так уже более точно. Вероятно, я бы мог нагуглить ответ, если бы понимал, как меня обманывает NaN. Джуваскрипт стал более понятен. Спасибо.

warren buffet 21.09.2016 22:36

А зачем нужен NaN? Мне кроме вреда эта шняга ничего не принесла. Покажите плес пользу.

Aetae 21.09.2016 23:34

warren buffet,
Если говорить о практике - он в основном нужен чтобы условия проверяющие результаты математических операции в случае ошибки оных всегда возвращали false. Это удобно во многих случаях: не приходится писать дополнительные проверки и лишнюю обработку ошибок. Но как и с любым подобным удобством, это усложняет отладку.

Суть NaN в том, что он не равен ничему, даже самому себе.)
alert(NaN === NaN)

warren buffet 22.09.2016 08:52

Как в математических операциях может возникнуть NaN?

ЗЫ По-моему это академизм.

Aetae 23.09.2016 06:27

warren buffet,
Например точно также как в вашем случае: неподходящие входные данные.
var str = 'd23';
var num = +str + 5;
if(num > 5)  ... //false
if(num == 5) ... //false
if(num < 5)  ... //false
return ...
И никаких лишних проверок и заморочек. Не число? Ну и хрен с ним.
Прошляпить некорректные данные тоже легко, но что тут поделаешь.

warren buffet 24.09.2016 14:29

Я про что и говорю - return... Просто он меня задрал вылезать где не попадя в интерфейсах (с null я уже понял подставу жабы скрипучей блин), а NaN все еще бывает лезет. Практика же идет по самому тупому пути, типа ну будет 0, а хера, будет на три буквы NaN. Зашибись. Лол.

Ну, то есть, каким может быть человеко-читаемый результат вычисления num = +str + 5 ? Что написать в return? )))

warren buffet 24.09.2016 14:36

Академизм

if(foo.length)

// студент, вы сравниваете число на тип boolean
// щаз...

if(foo.length > 0)

// пять, давайте зачетку

Но мы ж так не делаем, нахер академизм, length не может перескочить через 0? Может, а нам известно, что не может.

Aetae 24.09.2016 23:48

Ты скажи мне что ты хошь, я те покажу как надо.)
Стартовый пример ни о чём не говорит.

Яростный Меч 25.09.2016 00:42

Цитата:

Сообщение от warren buffet
Как в математических операциях может возникнуть NaN?

Math.log(-1)

warren buffet 25.09.2016 09:49

Яростный Меч, то есть NaN существует в математике как скажем бесконечность?

warren buffet 25.09.2016 09:51

Aetae, я хочу чтобы null рендерился как "" и чтобы NaN рендерился как 0.

Яростный Меч 25.09.2016 17:19

Цитата:

Сообщение от warren buffet
то есть NaN существует в математике как скажем бесконечность?

бесконечность - это отдельное значение Infinity
например, 1/0 дает бесконечность.

в js сделано так: если для какой-то точки нет значения, но есть предел, то просто берется этот предел (возможно, бесконечный), например
1/0 = Infinity
Math.log(0) = -Infinity
Math.pow(0, 0) = 1

Ну а если даже предела нет, то только тогда подставляется NaN, как в случае Math.log(-1). Вообще говоря, тут будет комплексное число, однако js о таких не в курсе.

warren buffet 25.09.2016 17:34

Да не математика нужна, а чтобы эта пустая хрень не лезла в хтмл. На php просто милое дело

$foo=null;
echo $foo; // ничего

$num='s23';
echo (int) $num; // 0

А сделай на жабе скрипучей так и получишь оно самое.

Aetae 25.09.2016 20:18

function senslessConvertToString(n){
   return n === null ? '' : (+n || 0).toString()
}
console.log(senslessConvertToString(null));   //''
console.log(senslessConvertToString('s23'));  //'0'

Но с чего вдруг должно быть именно вот так, и никак иначе, мне всё ещё непонятно. Приведение типов в пыхе ну вот ни капельки не логичнее чем в жабе, а скорее даже совсем наоборот.
Синдром утёнка?

warren buffet 25.09.2016 21:00

С того, что практика всегда идет по легкому пути. Я понимаю, что пых изначально и заточен на рендер, а жабаскрипт на что тогда?

Причем тут логика? При том, что академизм. Типа вот так правильно. А потом сидишь и смотришь на NaN в корзине или на undefined вместо ничего, лол.

Ну то есть что такое NaN, null, undefined в человеческой логике? Это ничего. Ничего и должно выводиться.

warren buffet 25.09.2016 21:07

Вот смотри сколько геморроя. Там просто id-am-ap, числа, в куках, куки текст, значит там может быть что угодно, или может быть ничего. Проверь, может я тупой и можно упростить, ибо мне пришлось регой еще проверять, чтобы эти гребаные NaN не проверять.

is_numeric=function(v){
	return /^\d?\d+\.?\d*$/.test(v);
},

get_cart=function() {

	var c=oCookie.load(key);
	
	if(!c) return {};
	
	try{cart=JSON.parse(c);}catch(e){return {};}
	
	for(var id in this.cart){
	
		var item=cart[id];
		
		if(	is_numeric(id)==false
			|| typeof item.am==='undefined'
			|| typeof item.ap==='undefined'
			|| is_numeric(item.ap)==false
			|| is_numeric(item.am)==false ) {
			delete(cart[id]);
			continue;
		}
		
		oCookie.save(key,JSON.stringify(cart));
	}
	
	return cart;
},

warren buffet 25.09.2016 21:12

Цитата:

Сообщение от Rise
это для программистской логики

var_dump() для программистской логики. )))

warren buffet 25.09.2016 21:31

Прикол, отпостил эту хрень и косяк нашел. for(var id in this.cart) - вот еще подстава с этими this. Не должно работать, а работает, потому что забыл var тут try{cart=JSON.parse(c);} и все срослось. )

warren buffet 25.09.2016 22:22

Rise, а если нету cart[id].ap? Или если там -30? Или 30.35?

Переменная должна быть, там должно быть целое положительное число. И еще этот NaN проверить надо.

Я понимаю, что юзер чинить куки не полезет, но туда может записаться какая угодно хрень теоретически.

Rasy 25.09.2016 23:16

ochen,
Лучшее объяснение я прочитал в книге от орэйли. NaN используется для представления числового результата не имеющего представление.
Т.е деление 0/0 мы представить можем, но результат уже не в состоянии срендерить, если только ты не просветленный дзен-мастер.

Aetae 25.09.2016 23:19

Цитата:

Сообщение от warren buffet (Сообщение 429825)
Rise, а если нету cart[id].ap?

Значит undefined, значит isNaN -> true.
Цитата:

Сообщение от warren buffet (Сообщение 429825)
Или если там -30? Или 30.35?

Переменная должна быть, там должно быть целое положительное число. И еще этот NaN проверить надо.

Я понимаю, что юзер чинить куки не полезет, но туда может записаться какая угодно хрень теоретически.

Ну не предполагается в js типа int, только float, а потому в таком случае нужно пару строк дополнительного кода, да. Печалька.
(на самом деле в современном js есть типизированые массивы, и вообще asm.js, но это не подходящий юзкейс для них)

Эмулировать по-старинке, если хочется, можно примерно так:
function uint(n){ retutn n>>>0 }
function int(n){ retutn n|0 }
function float(n){ retutn +n||0 }


Кстати регулярка у вас действительно нацеленная на float.

warren buffet 26.09.2016 04:44

Цитата:

Сообщение от Aetae
регулярка

Запросто, я ни одной сам не написал, все потыренное, у меня регулярный кретинизм.

Цитата:

Значит undefined, значит isNaN -> true.
То есть вообще любую переменную с числом можно проверять без typeof на наличие и на null функцией isNaN() заодно проверяя и на число? Ну все, спасибо господа, теперь мои дети не будут голодать. )

Я несколько раз смотрел как написаны isset's на js и каждый раз посмотрев закрывал в печали. Там кошмар.

warren buffet 26.09.2016 05:00

Цитата:

Сообщение от Rasy
дзен-мастер.

Дзен это сейчас, сейчас срендерить нельзя, оно уже в прошлом, то есть дзен - надувательство. )))

Конечно, погроммисты могут принудить юзеров и NaN, null, undefined понимать в интерфейсах, но здесь предмет глубже. Они просто еще не сломали сопротивление юзеров в самом очевидном, в том что 0/0=0. Во всем остальном давно сломали. Пишут как доктора или как юристы в своей погроммистской логике, другого нет, юзеру приходится изворачиваться, приспосабливаться, и ему уже даже нравится выполнять текстовые команды раскиданные по менюхам и он уже называет это графический интерфейс.

Погроммисты делают свою культуру.

warren buffet 26.09.2016 05:07

Причем если даже погроммиста наказать приковав к своему детищу цепями, как к веслам на галере, он нисколько не огорчится, ему нормально когда все через жопу, не для людей. И сравнить нельзя. Возьмем программу для людей, прикуем к ней программиста, он сделает за отчетный период в ней больше и лучше и скажут - ну вот, этот программист просто лучше. Не скажут же - потому что его культура гуманная, а не техническая. Просто его техника лучше.

warren buffet 26.09.2016 05:13

Грань между профанацией и гуманизмом весьма тонкая и неуловимая. Под давлением охреневшего заказчика не могущего понять, отчего клиенты не жалуют, погроммист может нахерачить свистелок и перделок типа гуманных, типа прокрустова ложа для ввода номера телефона, а бизнес-логику реализовать в сугубо техническом жанре. Скочет как сантехник в стеклянных бусах, а чо, красиво же. Лол.

Rasy 26.09.2016 10:12

Цитата:

Сообщение от warren buffet
Они просто еще не сломали сопротивление юзеров в самом очевидном, в том что 0/0=0

Каков результат квадратного корня из отрицательного числа?

warren buffet 26.09.2016 11:56

У меня в калькуляторе нет кнопки sqr. Включен научный режим. А в бытовом режиме есть такая кнопка. Давай с этого начнем сперва, с корня? Зачем тебе корень? Возводи число в дробную степень и все.

Я и говорю, дзен необорим. Культура. Колом ее оттудова. )))

warren buffet 26.09.2016 12:00

Задолбался бороться с этой культурой. Вот сделай все по полочкам, без запиночки, собери все в группки, будь ласков подгони фоточки, в общем заполируй все, чтоб глаз вышибало к чертям.

А вы знаете погроммисты, что выбитая в полу супермаркета плитка повышает продажи товаров на полках с двух сторон от себя? Вы еще небось верите, что проходы заставленные палетами - это потому что на складе места нет. Лол.

warren buffet 26.09.2016 12:04

Цитата:

Сообщение от Rasy
квадратного корня из отрицательного

-4^0.5?

Умные рассуждают о мере, а очень умные о крайностях. )))

Яростный Меч 26.09.2016 12:06

warren buffet,

ты борешься с Системой? :D

warren buffet 26.09.2016 13:14

Я же написал с чем - с культурой. Так что, будем возводить или корни извлекать. Корни вообще откуда взялись знаешь? Прямо из землемеряния, из геометрии. То есть графическое решение, а не алгебраическое.

Rasy 26.09.2016 13:48

warren buffet,
Ты неистов


Часовой пояс GMT +3, время: 20:14.