Как определить, был ли объект создан с использованием литерала объекта или вызова конструктора объекта?
В частности, как бы вы определили, был ли определенный объект создан с использованием литерала или нет?
var s1 = new String();
var s2 = ""; // Literal
var o1 = new Object();
var o2 = {}; // Literal
var f1 = new Function();
var f2 = function(){}; // Literal
Очевидно, если вы сравните любые два выше, например:
var o1 = new Object();
var o2 = {};
alert(o1 == o2);
alert(o1 === o2);
alert(typeof o1);
alert(typeof o2);
... Появятся первые два оповещения false
в то время как последние два оповещения дадут [Object object]
Скажем, например, если я хотел сделать это:
function isLiteral(obj, type) {
// ...
}
... как можно это сделать?
Я взглянул на Как определить, является ли объект литералом объекта в Javascript?, но это не отвечает на мой вопрос.
1 ответ
Во-первых, разница между этими двумя строками:
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
делая их неразличимыми во время выполнения.