为什么JavaScript的typeof总是返回"object"

3

我做错了什么?

我希望这段代码的结果是 "Class",但实际上并不是:

enter image description here

这是从对象函数中获取的:

enter image description here

4个回答

3

typeof不能像那样工作,它只返回内置类型。你可以尝试:

this.constructor.name==="Class";

它会检查原型链来确定this或任何this的原型是否是Class。因此,如果OtherType.prototype = Object.create(Class);,则对于任何OtherType实例都是true。在IE9以下版本中不起作用。

或者

this instanceof Class

但这并不会检查整个原型链。

这里是typeof可能返回的值列表。

这里有一个回答,关于获取变量类型的更多细节和展示许多可能出现问题的方法。


同时,instanceof 在尝试检查来自不同窗口(例如 iframe)的对象时存在隐藏的陷阱。 - Tommi
@Tommi 好的,我也会将 Pavel 的链接添加到我的答案中,因为那个更加详细。 - HMR

2
由于JavaScript只认识以下类型:
Undefined - "undefined"
Null - "object"
Boolean - "boolean"
Number - "number"
String - "string"
主机对象(由JS环境提供)- 实现依赖
函数对象(在ECMA-262术语中实现[[Call]])- "function"
E4X XML对象 - "xml"
E4X XMLList对象 - "xml"
任何其他对象 - "object"
你可以在这里找到更多信息。
阅读此处的线程,以了解如何获取对象名称。

1

object.constructor.name会返回构造函数的名称。这里是一个例子:

function SomeClass() {
    /* code */
}
var obj = new SomeClass();
// obj.constructor.name == "SomeClass"

请注意,如果您将匿名函数分配给变量,则需要使用命名函数,否则结果将为空字符串...

var SomeClass = function () {
    /* code */
};
var obj = new SomeClass();
// obj.constructor.name == ""

但是您可以同时使用两者,这样命名的函数名称将被返回

var SomeClassCtor = function SomeClass() {
    /* code */
};
var obj = new SomeClassCtor();
// obj.constructor.name == "SomeClass"

0

你也可以尝试这个

function getType(obj){
    if (obj === undefined) { return 'undefined'; }
    if (obj === null) { return 'null'; }
    return obj.constructor.name || Object.prototype.toString.call(obj).split(' ').pop().split(']').shift().toLowerCase();
}

这里放个例子。

function MyClass(){}
console.log(getType(new MyClass)); // MyClass
console.log(getType([])); // Array
console.log(getType({})); // Object
console.log(getType(new Array)); // Array
console.log(getType(new Object)); // Object
console.log(getType(new Date)); // Date
console.log(getType(new Error));  // Error

obj === undefined 会使我的脚本停止运行并抛出“obj未定义”的错误,因此我无法对其进行测试 :-) 因此,在您的测试中添加以下内容是值得的: console.log(getType(some_undefined_variable)); // 应该返回undefined,但在某些浏览器上却不是这样 - Greg0ry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接