Статьи

Значения JavaScript: не все является объектом


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

Виды ценностей: примитивы против объектов

Значения можно разделить на два основных типа: примитивы и объекты. Разница объясняется ниже. В JavaScript есть следующие значения.

  • Примитивы:

    • строка: «abc»
    • число: 4, 3,57 (все числа в JavaScript с плавающей точкой)
    • логическое значение: верно, неверно
    • null: назначен явно (см. ниже)
    • undefined: значение по умолчанию (см. ниже)
  • Объекты — обертки для примитивов: Boolean, Number, String. Редко нужен.
  • Объекты — альтернативы литералам. В следующих случаях лучше использовать литералы. Но литерал и конструктор эквивалентны.

    • [] совпадает с новым Array ()
    • {} такой же, как новый объект ()
    • function () {} — это то же самое, что new Function ()
    • / \ s * / совпадает с новым RegExp («\\ s *»)
  • Объекты — Дата
Примитивы mybool, mynum и mystr содержатся непосредственно в переменных. myobj1 и myobj2 содержат ссылки на один и тот же объект.

Разница между примитивами и объектами заключается в следующем (см. Диаграмму выше).

  • Примитив — это значение, которое может быть полностью сохранено в переменной. [Примитивы являются неизменяемыми, и не имеет значения, реализует ли их движок JavaScript таким образом. Но это помогает понять, как отличаются примитивы и объекты.] В задании y = x, где x содержит примитив, y получит копию x. Примитивы неизменны.
  • Объект — это значение, которое существует вне переменных. Переменные не содержат объекты напрямую, а скорее ссылаются на объекты. В присвоении y = x, где x содержит такую ​​ссылку, будет скопирована только ссылка. И x, и y будут ссылаться на один и тот же объект, а изменения, сделанные через одну переменную, будут видны через другую переменную. Все не примитивы являются объектами. То есть вы можете делать такие вещи, как добавление свойства и т. Д. Обратите внимание, что это включает в себя массивы и функции.
      > function foo() {}
    > foo.myprop = 123;
    123
    > foo.myprop
    123

    Ловушка: примитивные ценности и их обертки

    Правило:

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

Три примитивных типа string, number и boolean имеют соответствующие типы, экземплярами которых являются объекты: String, Number, Boolean. Их иногда называют
типами-обертками, и преобразование между примитивом и оберткой просто:

  • Примитив к оболочке: новая строка («abc»)
  • Оболочка в примитив: new String («abc»). ValueOf ()

Примитивные значения, такие как «abc», принципиально отличаются от экземпляров оболочки, таких как new String («abc»):

 > typeof "abc"
'string'
> typeof new String("abc")
'object'
> "abc" === new String("abc")
false

Экземпляры Wrapper являются объектами, и в JavaScript нет возможности сравнивать объекты, даже с помощью нестрогих equals == (что более мягко, чем предпочтительные строгие equals ===).

 > var a = new String("abc");
> var b = new String("abc");
> a == b
false
> a == a
true

Примитивные значения не имеют собственных методов

Оболочки редко нужны в JavaScript, так как примитивы могут храниться где угодно, не упаковывая их. Но у примитивов нет своих собственных методов и они позаимствованы у обёрток

> "abc".charAt === String.prototype.charAt
true

Есть два способа сделать это заимствование. Старый способ — преобразовать примитив в оболочку на лету. Новый способ (через строгий режим ECMAScript 5 ) заключается в прозрачном использовании методов из прототипа оболочки. Следующий код иллюстрирует разницу [на основе « Тайной жизни примитивов JavaScript »].

String.prototype.getType = function() {
return typeof this;
};
String.prototype.getTypeStrict = function() {
"use strict";
return typeof this;
};
console.log("".getType());
console.log("".getTypeStrict());

Выход:

  object
string