如何确定对象是使用对象文字还是对象构造函数调用创建的?

Sha*_*haz 1 javascript function-literal object-literal string-literals

更具体地说,您如何确定某个对象是否是使用文字创建的?

var s1 = new String();
var s2 = ""; // Literal

var o1 = new Object();
var o2 = {}; // Literal

var f1 = new Function();
var f2 = function(){}; // Literal
Run Code Online (Sandbox Code Playgroud)

显然,如果你比较上面的任何两个,例如:

var o1 = new Object();
var o2 = {};

alert(o1 == o2);
alert(o1 === o2);

alert(typeof o1);
alert(typeof o2);
Run Code Online (Sandbox Code Playgroud)

...前两个警报将显示,false而最后两个警报将显示[Object object]

比方说,如果我想这样做:

function isLiteral(obj, type) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

......怎么会这样做呢?

已经看了如何确定一个对象是否是Javascript中的对象文字?,但它没有回答我的问题.

Dav*_*ang 5

首先,这两行之间的区别:

var s1 = new String();
var s2 = ""; // Literal
Run Code Online (Sandbox Code Playgroud)

......以及这两行之间的区别:

var o1 = new Object();
var o2 = {}; // Literal
Run Code Online (Sandbox Code Playgroud)

......是两个不同的概念.

第一个是原始值对象之间的差异,而第二个是...同一事物的不同语法.


字符串,数字和布尔值是原始值,不是对象,但可使用被包装为对象new String(),new Number()new Boolean().所以对于这些,typeof将返回不同的值:

var s1 = new String();
typeof s1; // "object"
var s2 = "";
typeof s2; // "string"
Run Code Online (Sandbox Code Playgroud)

但是,对于Object和Function,区别在于:

var o1 = new Object();
var o2 = {};
Run Code Online (Sandbox Code Playgroud)

...仅限语法.

双方o1o2具有相同的prototype,同样的constructor,这使得它们在运行时没有区别.