Во-первых, разница между этими двумя строками:
var s1 = new String();
var s2 = ""; // Literal
... и разница между этими двумя строками:
var o1 = new Object();
var o2 = {}; // Literal
... это два разных понятия.
Первое - это разница между примитивным значением и объектом , а второе - это ... другой синтаксис для одной и той же вещи.
Строки, числа и логические значения являются примитивными значениями , а не объектами , но могут быть обернуты как объекты с использованием new String()
, new Number()
или new Boolean()
. Так что для них typeof
будет возвращать разные значения:
var s1 = new String();
typeof s1; // "object"
var s2 = "";
typeof s2; // "string"
Однако для объекта и функции разница между:
var o1 = new Object();
var o2 = {};
... только в синтаксисе.
И o1
, и o2
имеют одинаковые prototype
и одинаковые constructor
, что делает их неразличимыми во время выполнения.