Как определить, был ли объект создан с использованием литерала объекта или вызова конструктора объекта?

В частности, как бы вы определили, был ли определенный объект создан с использованием литерала или нет?

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делая их неразличимыми во время выполнения.

Другие вопросы по тегам