Как определить, был ли объект создан с использованием литерала объекта или вызова конструктора объекта? - PullRequest
1 голос
/ 21 апреля 2011

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

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) {
    // ...
}

... как можно поступить так?

I взглянул на Как определить, является ли объект литералом объекта в Javascript? , но это не отвечает на мой вопрос.

1 Ответ

5 голосов
/ 21 апреля 2011

Во-первых, разница между этими двумя строками:

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

...