gpt4 book ai didi

javascript - 如果有的话,Javascript 的 "typeof"何时会返回不正确的类型?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:02 26 4
gpt4 key购买 nike

我正在尝试通过其他人的代码工作,并且发现了一些奇怪的事情。我在部分程序中发现了如下代码:

if(typeof func == "function" || (typeof func == "object" && typeof func.document == "undefined"))
{
func();
}

这对我来说毫无意义,因为我不确定这样的事件何时会发生? typeof 会返回错误的类型吗?或者非函数对象是否可以被调用?

代码一团糟,所以我真的找不到这个特定检查可能成功的地方的例子。我应该注意到代码可能已有 10 年以上的历史。我收到的声明是它是必需的,因为有时在最初编写代码时,typeof 不会将函数作为类型返回。

此外,此检查是必需的,因为有时 func 会传递一个窗口对象(?),因此有必要确保它也不是窗口对象。

最佳答案

请记住:typeof 用于文字。

typeof undefined === "undefined"
typeof 5 === "number"
typeof true === "boolean"
typeof "" === "string"
typeof {} === "object"
typeof [] === "object"
typeof function { } === "function"

// null is a weird exception:
typeof null === "object"

instanceof 区分什么时候是“函数”(注意 where typeof 检查字符串 "object" instanceof 检查 Function Object本身:

{} instanceof Object

function {} instanceof Object
function {} instanceof Function

[] instanceof Object
[] instanceof Array

如您所见,typeof 表示 === "function"!== "object":这可能会产生误导,因为函数也是对象。这就是 instanceof 发挥作用的时候。

现在,当您编写构造函数时,构造的对象也是您的函数的实例:

// the constructor
function Example { }

// the object
var ex = new Example();

typeof Example === "function"
typeof ex === "object"
ex instanceof Object
ex instanceof Example

使用原型(prototype)你还可以扩展链,其中 typeof 总是说对象:

function DerivedExample { }

DerivedExample.prototype = new Example();
// DerivedExample.prototype.constructor = DerivedExample;

var ex1 = new DerivedExample();

typeof DerivedExample === "function"
typeof ex1 === "object"
ex1 instanceof Object
ex1 instanceof Example
ex1 instanceof DerivedExample

这就是关于 javaScript typeofinstanceof 的全部内容。希望它能澄清正在发生的事情。


还有一些好消息(不建议在生产代码中使用,但我在 CoffeeScript 源代码中也看到过):

typeof new Number(5) === "object"
new Number(5) instanceof Object
new Number(5) instanceof Number

typeof new Boolean("true") === "object"
new Boolean("true") instanceof Object
new Boolean("true") instanceof Boolean

typeof new String("") === "object"
new String("") instanceof Object
new String("") instanceof String

关于函数和窗口对象:

每个独立函数都将在窗口上下文中调用。
(除了)当你“use strict”“directive”时,一个独立的函数将在未定义的上下文中被调用。

function world() {
// non-strict: this === window
// use-strict: this === undefined
}
world();

现在,当您将函数编写为对象的成员时,函数的上下文就是对象:

var hello = {
world: function () {
// this === hello
}
};
hello.world();

对于在新构造的对象的上下文中调用的原型(prototype)函数也是如此:

function Hello() { }

Hello.prototype.world = function () {
// this instanceof Hello
// this will be === ex
};

var ex = new Hello();
ex.world();

至少,您可以使用 callapply 更改任何函数的上下文:

var ex = { };

function Example() {
// (1) non-strict: this === window
// (1) use-strict: this === undefined
// (2) this === ex
}

Example(); // (1)
Example.call(ex); // (2)
Example.apply(ex); // (2)

关于javascript - 如果有的话,Javascript 的 "typeof"何时会返回不正确的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21459892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com