На практике, хотя для каждого элементарного типа есть соответствующий объект, использовать их не рекомендуется. Это - отмершая часть языка.
var ok = new Boolean(true) // не надо
Элементарные типы автоматически интерпретируются как объекты при вызовах методов, поэтому можно, определять длину строки как:
alert("Апельсин".length)
Поэтому иногда говорят, что в javascript - все объекты. Так удобно думать, но определенная разница все же есть.
Например, typeof выдаст разный результат:
alert(typeof "test")
alert(typeof new String("test"))
Это - еще одна причина избегать использования объектов там, где существует элементарный тип: меньше путаницы.
Преобразование типа можно явным образом сделать через его название:
var test = Boolean("something") // true
Кроме всем известных типов данных - в javascript есть специальное значение undefined, которое, условно говоря, обозначает что "данных нет". Не null, а данных нет. Понимайте как хотите.
Далее рассмотрим особенности каждого из этих типов.
При операциях с Number - никогда не происходят ошибки. Зато могут быть возвращены специальные значения:
1/0
Number.POSITIVE_INFINITY (плюс бесконечность)
-1/0
Number.NEGATIVE_INFINITY (минус бесконечность)
Number(“something”)
NaN (Not-a-Number, результат ошибочной операции)
Бесконечность бывает полезно использовать в обычном коде. Например, положительная бесконечность Number.POSITIVE_INFINITY больше любого Number, и даже больше самой себя.
По поводу строчки "Все числа хранятся в формате double word, т.е 8 байт. В этом формате невозможны точные вычисления." под загаловком "Number\Неточные вычисления" есть пара замечаний: word (и double word, соответственно) не предполагает возможности хранить дробные и отрицательные числа, только положительные целые в любом языке программирования, и предполагает только точные вычисления... А тут, судя по всему, используется real64 - восьмибайтная вещественная переменная, в которой значение каждого бита далеко не так очевидно как в целочисленных...
В памяти машины все вещественные числа хранятся в определенном количестве байт, и из-за кратности значения всегда существует неточность между вводимым значением (тем что мы используем в коде) и тем что находится в памяти.
Подробнее на wiki или в google на тему хранение данных в памяти компьютера.
Единственный реальный вариант:
1) округлять до разумного кол-ва знаков после запятой
Принципиальное решение:
2) отказаться от дробных чисел
Или:
3) отказаться от математики на клиенте. В PHP есть библиотека BCMath в которой можно считать с произвольной точностью. Принцип - отказ от двоичной системы и вычисления на основе представления чисел как последовательности символов по алгоритмам сложения и т.п. в столбик.
Не совсем корректный рисунок, т.к. Number, Boolean и String это объекты-обертки, простые типы именуются с маленькой буквы: т.е. соответственно number, boolean, string.
Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены. Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Новости
Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:
По поводу строчки "Все числа хранятся в формате double word, т.е 8 байт. В этом формате невозможны точные вычисления." под загаловком "Number\Неточные вычисления" есть пара замечаний: word (и double word, соответственно) не предполагает возможности хранить дробные и отрицательные числа, только положительные целые в любом языке программирования, и предполагает только точные вычисления... А тут, судя по всему, используется real64 - восьмибайтная вещественная переменная, в которой значение каждого бита далеко не так очевидно как в целочисленных...
Да, float64. Поправлено. Вот выдержка из исходников SpiderMonkey с точным определением типа:
js/src/jspubtd.h
[c]
typedef uint16 jschar;
typedef int32 jsint;
typedef uint32 jsuint;
typedef float64 jsdouble; // оно
typedef jsword jsval;
typedef jsword jsid;
[/c]
Собственно, double word = 4 байта

Собственно, word - это машинное слово, и его длина равна разрядности машины
Еще есть такая полезная штука, как Number.toFixed.
А вот IE 5.0 (уже к счастью почти совсем не актуальный) такого не умеет...
Кстати, в хроме эта функция тоже не работает - ничего не выводится. Хотя тот же файл в мозилле работает корректно, и ошибки не выдаются.
У меня в хроме получилось сделать так:
Infocatcher, voobshe to .toFixed bilo ypom9nyto v etoj statje vnimatelnee nado 4itat =)
Не объясните подробнее что делает ваше выражение:
"превед медвед".replace(/(.*?)\s(.*)/, "$2, $1!") // => медвед, превед!
Спасибо
присоединяюсь к Minh. Поясните, плз.
Этот вызов захватит в первую скобку слово "превед", а во вторую - "медвед", затем заменит их на $2, $1 - то есть, на "медвед, превед".
Более подробно про регулярные выражения вы можете прочитать в статье
Регулярные выражения.
Результат: 0.3000000004... Это как?
В памяти машины все вещественные числа хранятся в определенном количестве байт, и из-за кратности значения всегда существует неточность между вводимым значением (тем что мы используем в коде) и тем что находится в памяти.
Подробнее на wiki или в google на тему хранение данных в памяти компьютера.
Гораздо интереснее, как это обойти
Есть рецепты?
Единственный реальный вариант:
1) округлять до разумного кол-ва знаков после запятой
Принципиальное решение:
2) отказаться от дробных чисел
Или:
3) отказаться от математики на клиенте. В PHP есть библиотека BCMath в которой можно считать с произвольной точностью. Принцип - отказ от двоичной системы и вычисления на основе представления чисел как последовательности символов по алгоритмам сложения и т.п. в столбик.
Почему true, а не false?
Перечитайте, пожалуйста еще раз статью.
А вообще все грубо говоря "ненулевые элементы", точнее элементы имеющие значение отличное от:
false
null
undefined
“”
0
Number.NaN
имеют значение true
Это сделали для вашего же удобства.
Заранее спасибо!
Вы не поясните что вы имели в виду? А то знаете, все слова понятны, но ничего не понятно
прогуглите "Регулярные выражения" для понимания смысла данных слов. довольно полная информация также присутствует на wiki.
Интересная статья, много полезных мелочей, которые нельзя узнать, изучая язык по чужим скриптам и примерам =).
скажите, от куда parseInt("010") = 8 //
восемь? 010 - это два в 2х ричной системе
А кто говорил про двоичную? Речь идет о восьмеричной.
Не совсем корректный рисунок, т.к. Number, Boolean и String это объекты-обертки, простые типы именуются с маленькой буквы: т.е. соответственно number, boolean, string.
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.