Типы данных
Объекты | Примитывы |
---|---|
Object | number |
Array | string |
Function | boolean |
RegExp | undefined |
Arguments | null |
Существуют примитивные типы данных: string, number, boolean - они immutable (не изменяемые), после их инициализации - изменить нельзя. Если мы делаем:
var s = 'Hello';
s += ' world!';
На самом деле создается новая строка 'Hello world!' и записывается в переменную s; Так же существуют классы обертки: String, Number, Boolean. Они используются только для внутренней реализации. Например:
var s = 'hello';
s = s.toUpperCase(); //HELLO
метод toUpperCase() принадлежит классу-обертке String, поэтому интерпретатор создает new String(s), потом выполняет метод. Полученную строку записывает в переменную s, а объект new String() удаляется.
Не стоит самостоятельно создавать переменные через эти обертки, могут возникнуть странные ситуации:
var check = new Boolean(false);
if(check){
alert('Bingo'); //мы увидем сообщение, т.к. check - это объект, а объект в логических выражения всегда интерпретируется как true
};
Примитивы передаются по значению, тоесть:
var x = 0, y = 1;
function pow(x, y){
// внутри функции будут созданны временные переменные x', y' и все операции будут произведены над ними, а оригинальные x, y останутся не тронутыми
var tmp = x;
x = y;
y = tmp;
};
pow(x, y);
console.log(x); //x = 0;
console.log(y); //y = 1;
Примитивы null
и undefined
не преобразуются в объект.
Также существуют Объекты, например массив это на самом деле объект Array. Они передаются по ссылке:
var test = {x: 0, y: 1};
function pow(obj){
var tmp = obj.x;
obj.x = obj.y;
obj.y = tmp;
};
pow(test);
console.log(test.x); //x = 1;
console.log(test.y); //y = 0;
Оператор typeof - может вернуть (в виде строки):
- number
- string
- boolean
- object (при object, array, null)
- function
- undefined
Number
На один number отводится 64 бит, один (самый левый) отведен на знак припинания, 53 это на целочисленное значение, оставшиеся на местополежение дробной части (точки). Для проведения побитовых операций, число преобразуется к 32 битному. Чтобы преобразовать число в отрицательное нужно:
- преобразовать 0 в 1, а 1 в 0
- прибавить к полученному значению 1
Перобразование в двоичную форму и обратно:
parseInt('11000', 2); //выведет 24
var num = 24;
num.toString(2); //выведет 11000
2.toString(); //выдаст SyntaxError, т.к. интерпретатор решит что 2. - это число с плавающей точкой
//следующий код выдаст строку
2..toString();
2 .toString();
(2).toString();
String
На каждый символ в string отводится 16 бит.
Boolean
Нужно запомнить 7 "ложных" значений которые дают false:
- '' (пустая строка)
- 0, -0, NaN (не коректное число)
- null, undefined
- false
все остальные значения при приведении к логическому значению дают true
Операции типами данных
Приведение в boolean:
- любой объект всегда к true (даже Boolean(false))
- число приводится к false если равно +-0 или NaN. В остальных случаях true
- пустая строка к false, остальные к true
- undefined, null к false
Привести к логическому типу можно с помощью:
var s = 'hello';
var ss = '';
!!s; \\ true
!!ss; \\false
Приведение к строке:
var s = new String(bar);
var s = '' + bar;
Чтобы привести объект к строке, сначало ищется метод valueOf() - если он вернул не примитив - тогда метод toString()
Приведение к числу:
var i = new Number(bar);
var i = +bar;
- Чтобы привести объект к числу, сначало вызывается valueOf(), потом toString()
- true приводит к 1
- false приводит к 0
- null - 0
- undefined - NaN Строки:
- пустая - 0
- 'Infinity' - infinity
- если строка начинается в цифр, то приводтся до появления симлова не входящего в обозначения числа (может начинатся с -, 0, 0x, лубого числа)
Приведение числа к строке:
(30).toString(); //'30' - по умолчанию по основанию 2
(30).toString(2); //100000
(30).toStrign(16); //20
0.1 + 0.2 // 0.300000000000004
(0.1 + 0.2).toFixed(2); //'0.30'
Материал взят из MDN - Error