- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
为什么在 JavaScript 中 Object instanceof Function
和 Function instanceof Object
都返回 true
?
我在 Safari WebInspector 中试过了。
最佳答案
我花了一段时间才弄明白,但这真的值得花时间。首先,让我们看看 instanceof
是如何工作的。
引自MDN ,
The
instanceof
operator tests whether an object has in its prototype chain theprototype
property of a constructor.
[instanceof]
现在,让我们看看如何instanceof
由 ECMA 5.1 规范定义,
The production
RelationalExpression: RelationalExpression instanceof ShiftExpression
is evaluated as follows:
- Let
lref
be the result of evaluatingRelationalExpression
.- Let
lval
beGetValue(lref)
.- Let
rref
be the result of evaluatingShiftExpression
.- Let
rval
beGetValue(rref)
.- If
Type(rval)
is not Object, throw aTypeError
exception.- If
rval
does not have a[[HasInstance]]
internal method, throw aTypeError
exception.- Return the result of calling the
[[HasInstance]]
internal method ofrval
with argumentlval
.
首先计算左侧和右侧表达式 (GetValue
),然后右侧结果应该是一个带有 [[HasInstance]]
内部方法的对象。并非所有对象都有 [[HasInstance]]
内部方法,但有函数。例如,以下将失败
console.log(Object instanceof {});
# TypeError: Expecting a function in instanceof check, but got #<Object>
[[HasInstance]]
现在,让我们看看如何[[HasInstance]]
已在 ECMA 5.1 规范中定义,
Assume
F
is a Function object.When the
[[HasInstance]]
internal method ofF
is called with valueV
, the following steps are taken:
- If
V
is not an object, returnfalse
.- Let
O
be the result of calling the[[Get]]
internal method ofF
with property name"prototype"
.- If
Type(O)
is not Object, throw aTypeError
exception.- Repeat
- Let
V
be the value of the[[Prototype]]
internal property ofV
.- If
V
isnull
, returnfalse
.- If
O
andV
refer to the same object, returntrue
.
就是这么简单。获取 F
的 prototype
属性并将其与 O
的 [[Prototype]]
内部属性进行比较,直到它变为 null
或 F
的 prototype
与 O
相同。
[[prototype]]
内部属性首先让我们看看什么是[[prototype]]
internal property ,
All objects have an internal property called
[[Prototype]]
. The value of this property is eithernull
or an object and is used for implementing inheritance. Whether or not a native object can have a host object as its[[Prototype]]
depends on the implementation. Every[[Prototype]]
chain must have finite length (that is, starting from any object, recursively accessing the[[Prototype]]
internal property must eventually lead to anull
value).
注意:我们可以通过 Object.getPrototypeOf
获取这个内部属性功能。
原型(prototype)
属性[[HasInstance]]
还讨论了另一个名为 prototype
的属性,它特定于 Function
对象。
The value of the
prototype
property is used to initialise the[[Prototype]]
internal property of a newly created object before the Function object is invoked as a constructor for that newly created object.
这意味着,当函数对象被用作构造函数时,将创建一个新对象,并且新对象将使用此原型(prototype)初始化其内部
属性。例如,[[Prototype]]
function Test() {}
Test.prototype.print = console.log;
console.log(Object.getPrototypeOf(new Test()) === Test.prototype);
# true
现在让我们回到实际的问题。让我们来看第一种情况
console.log(Object instanceof Function);
# true
它将首先获取Function.prototype
,然后尝试查找该对象是否在Object
的原型(prototype)层次结构中。让我们看看结果如何
console.log(Function.prototype);
# [Function: Empty]
console.log(Object.getPrototypeOf(Object));
# [Function: Empty]
console.log(Object.getPrototypeOf(Object) === Function.prototype);
# true
由于 Function.prototype
匹配 Object
的内部属性 [[Prototype]]
,它返回 true
.
现在让我们来看第二种情况
console.log(Function instanceof Object);
# true
console.log(Object.prototype);
# {}
console.log(Object.getPrototypeOf(Function));
# [Function: Empty]
console.log(Object.getPrototypeOf(Function) === Object.prototype);
# false
console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function)));
# {}
Object.getPrototypeOf(Object.getPrototypeOf(Function)) === Object.prototype
# true
在这里,首先我们得到 Object.prototype
,即 {}
。现在,它正在尝试查找 Function
的原型(prototype)链中是否存在相同的对象 {}
。 Function
的直接父级是 Empty 函数。
console.log(Object.getPrototypeOf(Function));
# [Function: Empty]
它与Object.prototype
不同
console.log(Object.getPrototypeOf(Function) === Object.prototype);
# false
但是 [[HasInstance]]
算法并不止于此。它重复并上升一个层次
console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function)));
# {}
这与 Object.prototype
相同。这就是返回 true
的原因。
关于javascript - 为什么在 JavaScript 中 "Object instanceof Function"和 "Function instanceof Object"都返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622695/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!