Мастер-классы по Javascript, AJAX/COMET, jQuery Узнать больше...
Javascript.RU

Базовые типы: Строки, Числа, Boolean

В этой статье собраны особенности базовых типов данных, которые важны для программистов из других областей.

В Javascript есть и объектные типы данных и элементарные, которые можно интерпретировать как объекты.

типы данных

Элементарные - создаются простым указанием данных:

var orange = "Апельсин"

Объектные - например, через оператор new:

var orange = new String("Апельсин")

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

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, а данных нет. Понимайте как хотите.

Далее рассмотрим особенности каждого из этих типов.

Все числа хранятся в формате float64, т.е 8 байт с плавающей точкой. В этом формате не всегда возможны точные вычисления.

Например,

alert(0.1+0.2)  // выведет не 0.3!

При операциях с Number - никогда не происходят ошибки. Зато могут быть возвращены специальные значения:

1/0
Number.POSITIVE_INFINITY (плюс бесконечность)
-1/0
Number.NEGATIVE_INFINITY (минус бесконечность)
Number(“something”)
NaN (Not-a-Number, результат ошибочной операции)

Бесконечность бывает полезно использовать в обычном коде. Например, положительная бесконечность Number.POSITIVE_INFINITY больше любого Number, и даже больше самой себя.

NaN - особый результат.

  • Любая математическая операция с NaN дает NaN:
    • NaN + 1 = NaN
  • NaN не равен сам себе:
    • NaN == NaN // false
  • Можно проверить с помощью функции isNaN:
    • isNaN(NaN) // true

Для этого используется метод toFixed.

0.1234.toFixed(2)  = 0.12

Стандартно конвертация осуществляется вызовом Number(). Можно и попроще: +str.

// эквивалентные записи
var str = "002"
var a = Number(str) // 2
// нечисла превращаются в NaN
+"0.1"  // => 0.1
+"0.1z" // => Number.NaN

Кроме жесткой конвертации есть и более мягкая фильтрация в число:

// обрезается все после числа
parseFloat("0.1zf") = 0.1
parseInt("08f.4", 10) = 8
// тут числа вообще нет, поэтому NaN
parseFloat("smth") = Number.NaN

parseFloat , parseInt переводят слева направо, пока это возможно. Если вообще невозможно - то NaN.

Второй аргумент parseInt - основание. Если его нет, то система сама пытается угадать систему счисления:

parseInt("0x10") = 16 // т.к 0x обозначает 16-ричную систему
parseInt("010") = 8 // т.к ведущий 0 обозначает 8-ричную систему
// если хотите без сюрпризов - указывайте основание явно
parseInt("010",10) = 10

Все математические функции находятся в "пакете" Math. Не то, чтобы в javascript есть реальные пакеты, просто так получилось.

  • Math.floor() / Math.round() / Math.ceil() - округление
  • Math.abs() - модуль числа
  • Math.sin() и т.д

Строки в javascript - полностью юникодные.

  • Кавычки двойные и одинарные работают одинаково
  • Можно указывать юникодные символы через \uXXXX:
    • "звездочка:\u002a"
  • Встроены регулярные выражения, методы replace/match:
    • "превед медвед".replace(/(.*?)\s(.*)/, "$2, $1!") // => медвед, превед!

Как это обычно и бывает, в регулярках символ \w обозначает латинские буквоцифры или подчеркивание, но не русские буквы.

Длина строки хранится в свойстве length.

В javascript - особый список значений, которые при приведении к Boolean становятся false. Он отличается, например, от аналогичного списка в PHP.

False
false
null
undefined
“”
0
Number.NaN
True – все остальное
“0”
“false”

Чтобы привести значение к булевому - используется либо явное указание типа: Boolean(a), либо двойное отрицание: !!a

Boolean(a) == !!a

Автор: Kollega (не зарегистрирован), дата: 30 июля, 2008 - 10:45
#permalink

По поводу строчки "Все числа хранятся в формате double word, т.е 8 байт. В этом формате невозможны точные вычисления." под загаловком "Number\Неточные вычисления" есть пара замечаний: word (и double word, соответственно) не предполагает возможности хранить дробные и отрицательные числа, только положительные целые в любом языке программирования, и предполагает только точные вычисления... А тут, судя по всему, используется real64 - восьмибайтная вещественная переменная, в которой значение каждого бита далеко не так очевидно как в целочисленных...


Автор: Илья Кантор, дата: 30 июля, 2008 - 14:08
#permalink

Да, 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]


Автор: Гость (не зарегистрирован), дата: 30 апреля, 2009 - 02:34
#permalink

Собственно, double word = 4 байта


Автор: Гость (не зарегистрирован), дата: 15 июля, 2009 - 11:07
#permalink

Собственно, word - это машинное слово, и его длина равна разрядности машины


Автор: Infocatcher (не зарегистрирован), дата: 10 октября, 2008 - 03:43
#permalink

Еще есть такая полезная штука, как Number.toFixed.

var n = 0.123456789.toFixed(6);
alert(n); // 0.123457
alert(typeof n); // "string"

А вот IE 5.0 (уже к счастью почти совсем не актуальный) такого не умеет...


Автор: dbersten (не зарегистрирован), дата: 21 мая, 2010 - 22:49
#permalink

Кстати, в хроме эта функция тоже не работает - ничего не выводится. Хотя тот же файл в мозилле работает корректно, и ошибки не выдаются.


Автор: Гость (не зарегистрирован), дата: 28 июня, 2010 - 10:24
#permalink

У меня в хроме получилось сделать так:

(new Number(1.11111111)).toFixed(4)

Автор: MortaLity (не зарегистрирован), дата: 14 мая, 2009 - 10:11
#permalink

Infocatcher, voobshe to .toFixed bilo ypom9nyto v etoj statje vnimatelnee nado 4itat =)


Автор: Minh (не зарегистрирован), дата: 17 мая, 2009 - 17:58
#permalink

Не объясните подробнее что делает ваше выражение:

"превед медвед".replace(/(.*?)\s(.*)/, "$2, $1!") // => медвед, превед!

Спасибо


Автор: Гость (не зарегистрирован), дата: 19 мая, 2009 - 12:24
#permalink

присоединяюсь к Minh. Поясните, плз.


Автор: Илья Кантор, дата: 19 мая, 2009 - 14:39
#permalink

Этот вызов захватит в первую скобку слово "превед", а во вторую - "медвед", затем заменит их на $2, $1 - то есть, на "медвед, превед".

Более подробно про регулярные выражения вы можете прочитать в статье
Регулярные выражения.


Автор: Гость (не зарегистрирован), дата: 13 июня, 2009 - 22:21
#permalink
alert(0.1+0.2);

Результат: 0.3000000004... Это как?


Автор: Гость (не зарегистрирован), дата: 28 сентября, 2009 - 17:09
#permalink

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

Подробнее на wiki или в google на тему хранение данных в памяти компьютера.


Автор: Гость (не зарегистрирован), дата: 28 июня, 2010 - 10:26
#permalink

Гораздо интереснее, как это обойти
Есть рецепты?


Автор: Гость (не зарегистрирован), дата: 5 июля, 2010 - 15:21
#permalink

Единственный реальный вариант:
1) округлять до разумного кол-ва знаков после запятой
Принципиальное решение:
2) отказаться от дробных чисел
Или:
3) отказаться от математики на клиенте. В PHP есть библиотека BCMath в которой можно считать с произвольной точностью. Принцип - отказ от двоичной системы и вычисления на основе представления чисел как последовательности символов по алгоритмам сложения и т.п. в столбик.


Автор: opus, дата: 27 сентября, 2009 - 16:49
#permalink

var test = Boolean("something") // true

Почему true, а не false?


Автор: Гость (не зарегистрирован), дата: 28 сентября, 2009 - 16:58
#permalink

Перечитайте, пожалуйста еще раз статью.

А вообще все грубо говоря "ненулевые элементы", точнее элементы имеющие значение отличное от:
false
null
undefined
“”
0
Number.NaN

имеют значение true

Это сделали для вашего же удобства.


Автор: opus, дата: 27 сентября, 2009 - 18:50
#permalink

Заранее спасибо!


Автор: opus, дата: 27 сентября, 2009 - 19:35
#permalink

Как это обычно и бывает, в регулярках символ \w обозначает латинские буквоцифры или подчеркивание, но не русские буквы.

Вы не поясните что вы имели в виду? А то знаете, все слова понятны, но ничего не понятно


Автор: Гость (не зарегистрирован), дата: 28 сентября, 2009 - 17:00
#permalink

прогуглите "Регулярные выражения" для понимания смысла данных слов. довольно полная информация также присутствует на wiki.


Автор: proxima (не зарегистрирован), дата: 9 декабря, 2009 - 12:50
#permalink

Интересная статья, много полезных мелочей, которые нельзя узнать, изучая язык по чужим скриптам и примерам =).


Автор: Гость (не зарегистрирован), дата: 11 декабря, 2009 - 15:45
#permalink

скажите, от куда parseInt("010") = 8 //
восемь? 010 - это два в 2х ричной системе


Автор: B@rmaley.e><e (не зарегистрирован), дата: 11 декабря, 2009 - 19:25
#permalink

А кто говорил про двоичную? Речь идет о восьмеричной.


Автор: puppy (не зарегистрирован), дата: 18 февраля, 2010 - 17:34
#permalink

Не совсем корректный рисунок, т.к. Number, Boolean и String это объекты-обертки, простые типы именуются с маленькой буквы: т.е. соответственно number, boolean, string.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
13 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Новости

Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:

  • Ярославль (24-25 сентября)
  • Новосибирск (3-4 октября)
  • Казань (9-10 октября)
  • Минск (16-17 октября)
  • Днепропетровск (23-24 октября)
  • Одесса (30-31 октября)
  • Самара (13-14 ноября)

Более подробно - на странице мастер-классов.

Если вас интересует другой город - посмотрите здесь, выбрав "Другие города".

Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Последние обсуждения на форуме
Forum
Последние комментарии