В этом блоге объясняется, что 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