понедельник, 7 ноября 2016 г.

1.3 Типы переменных


(Из книги "Говоря на языке JavaScript").


В JavaScript, как и во всех популярных языках программирования, есть много типов для создания переменных: логическое значение, число, строка, массив и т.д. Все эти типы обладают свойствами (properties). Каждое свойство имеет имя (ключ) и значение. Вы можете рассматривать эти свойства как поля или записи в таблице. Чтобы их прочитать, используется оператор точка (.):

value.propKey
 
Например, у строки 'abc' есть свойство length (длина):

var str = 'abc';
str.length // Содержит 3.
 
Ту же мысль можно выразить так:

'abc'.length 
 
Оператор точка используется также для присвоения значений свойствам:
 
var obj = {};  // Создаем пустой объект.
obj.foo = 123; // Создаем внутри него свойство `foo` и присваиваем ему значение 123.
 
Это же правило можно использовать для вызова методов:

'hello'.toUpperCase() // Перевод букв строки в верхний регистр. Результатом будет 'HELLO'.

Притмитивы и объекты

В JavaScript есть не очевидное различие между типами переменных:
  • Существуют переменные-примитивы: логические, числовые, строковые значения, а также  null и undefined.
  • Все остальные переменные представляют собой тип objects и унаследованные от него сущности.
Главное различие между этими двумя категориями заключается в том, как их следует сравнивать. Каждая переменная типа object имеет единственный идентификатор и равна, строго говоря, только сама себе:

var obj1 = {};  // Пустой объект.
var obj2 = {};  // Еще один пустой объект.
obj1 === obj2   // false
obj1 === obj1   // true

Переменные-примитивы, напротив, считаются равными друг другу, если равны содержащиеся в них значения:
 
var prim1 = 123;
var prim2 = 123;
prim1 === prim2 // true

Ниже разница между примитивами и объектами будет объяснена более подробно.

Примитивы

Следующие типы значений мы будем называть примитивами:
Примитивы обладают следующими характеристиками:
Их можно сравнивать по значению (содержимому):
 
 3 === 3       // true
'abc' === 'abc'// true
 
Примитивы всегда имеют неизменные свойства, которые невозможно также удалить или добавить новые:

var str = 'abc';

str.length = 1; // Попробуем изменить свойство `length`.
str.length      // Не получилось, по-прежнему 3.


str.foo = 3; // Попробуем создать для строки новое свойство `foo`.
str.foo      // Не получилось, возвращается значение undefined, т.е. неопределенное.

Объекты

Сложные структуры в JavaScript имеют тип object. Самые распространенные их разновидности:
  • Простые объекты  (см. Отдельный объект):
    {
        firstName: 'Jane',
        lastName: 'Doe'
    }
     
    Только что приведенный объект имеет два свойства: значением свойства firstName является строка 'Jane',  а значением свойства  lastName - строка 'Doe'.
  • Массивы (см. Массивы):
     
    [ 'apple', 'banana', 'cherry' ]
     
    Только что приведенный массив имеет три элемента, которые могут быть вызваны по их порядковым номерам, называемым индексами. Нумерация начинается с 0 и, например, индекс элемента 'apple' будет 0.
  • Регулярные выражения (см. Регулярные выражения):
    /^a+b+$/
Объекты обладают следующими характеристиками:
Сравниваются по ссылке.
Каждый объект имеет собственный идентификатор, и даже если их содержимое идентично, они не равны:
 
({} === {})  // Два разных объекта. Результат сравнения - false.
var obj1 = {};
var obj2 = obj1;
obj1 === obj2 // true
 
По умолчанию структура объектов изменяема.
Вы можете свободно изменять, добавлять, удалять свойства объектов (см. Отдельный объект):
 
var obj = {};
obj.foo = 123; // Добавили свойство `foo`.
obj.foo // 123

undefined и null

Большинство языков программирования имеют в своем составе конструкции, означающие отсутствие информации. В JavaScript тоже есть такие “отсутствующие” значения. Это undefined и null:
  • undefined означает “нет значения.” Переменные, которым еще не присвоены значения - вот один из примеров undefined:
     
    var foo;
    foo // undefined
     
    Необъявленные переменные - еще один пример undefined:
     
    function f(x) { return x }
    f() // undefined
     
    Если вы пытаетесь обратиться к несуществующему свойству объекта, то тоже получите undefined:
    var obj = {}; // Объект без свойств.
    obj.foo       // undefined
     
  • null означает “нет объекта”. Этот тип сложился исторически и от него можно было бы отказаться в новых версиях JavaScript, но это повлекло бы проблемы, связанные с поддержкой кода, написанного ранее.

Внимание

undefined и null не имеют свойств и даже стандартных методов, имеющихся у других объектов, таких как toString().

Проверка на undefined или null

Убедиться явным образом в том, что интересующая вас переменная не содержит undefined или null вы можете с помощью выражений такого вида:
 
if (x === undefined || x === null) {
    ...
}
 
Вы можете также использовать тот факт, что в JavaScript  как undefined, так и null можно рассматривать как некую разновидность false:
 
if (!x) {
    ...
}

Внимание

false, 0, NaN, and '' (пустые кавычки) также часто употребляются в том же смысле, что и false (см. Правдивое и ложное).

Определение типа переменных с помощью typeof и instanceof

Среди операторов JavaScript есть два, позволяющих определять тип переменных: typeof в основном применяется к примитивам, тогда как  instanceof используется для объектов. typeof используется так:
 
typeof value
 
Он возвращает строку, описывающую тип переменной (в данном случае value). Вот несколько примеров:
 
typeof true  // 'boolean'
typeof 'abc' // 'string'
typeof {}    // 'object'
typeof []    // Тоже 'object' (типа array не существует, это разновидность object).

Следующая таблица показывает результаты применения оператора typeof к различным типам переменных:

Операнд Результат
undefined'undefined'
null'object'
Логическое значение'boolean'
Числовое значение'number'
Строковое значение'string'
Функция'function'
Все остальные нормальные значения'object'



typeof null возвращает 'object', так сложилось исторически, хотя null в строгом смысле не является объектом.

Оператор instanceof используется так:
 
value instanceof Constr

Он возвращает true, если value является объектом, созданным  помощью конструктора Constr (см. Конструкторы: фабрики объектов). Вот несколько примеров:
 
var b = new Bar(); // Объект создан с помощью конструктора Bar.
b instanceof Bar   // true

{} instanceof Object // true
[] instanceof Array  // true
[] instanceof Object // true, т.к. Array является "подконструктором" Object.

undefined instanceof Object // false
null instanceof Object      // false
 

Комментариев нет:

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