gpt4 book ai didi

javascript - Node.js:为什么调用 hasOwnProperty 与 global.hasOwnProperty 不同?

转载 作者:搜寻专家 更新时间:2023-10-31 23:34:39 27 4
gpt4 key购买 nike

也许这是一个新手问题,但我找不到或想不出解释。

启动 Node.js 控制台,然后:

> global.hasOwnProperty === hasOwnProperty
true

那为什么

> global.hasOwnProperty("x")
false

但是

> hasOwnProperty("x")
TypeError: Cannot convert undefined or null to object
at hasOwnProperty (<anonymous>)
at repl:1:1
at sigintHandlersWrap (vm.js:22:35)
at sigintHandlersWrap (vm.js:96:12)
at ContextifyScript.Script.runInThisContext (vm.js:21:12)
at REPLServer.defaultEval (repl.js:313:29)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:513:10)
at emitOne (events.js:101:20)

?

最佳答案

这里的问题是 hasOwnProperty() 是一个对象的方法,它的全部功能是对该对象的属性进行操作。因此,它只有在被调用时被赋予适当的对象上下文时才有效。通常它们是编写的方法,期望对象上下文在调用方法时到达 this 的值。

在大多数情况下,在 JavaScript 中(使用箭头语法定义的函数除外),this 的值由方法的调用方式决定。在适当的对象上调用方法的通常和最常见的方法是:

obj.method()

这将导致 JavaScript 在调用 method() 时将 this 设置为 obj

如果你这样做:

var myFunction = obj.method;

然后,您可以在没有对象引用的情况下调用该方法,如下所示:

var myFunction = obj.method;
myFunction();

然后,obj 中的对象引用将丢失,并且不会以任何方式提供给该方法。 JavaScript 解释器将为 this 选择一个默认值。

在严格模式下,this 将被设置为 undefined 并且任何尝试使用该值(期望它是对象引用)的方法都将失败。

在非严格模式下,浏览器会将 this 设置为指向“一些默认值”。在浏览器中,它是 window 对象。因此,如果您尝试在窗口对象上使用该方法,您瞧,它恰好会起作用。我认为这有点意外,不是好的代码。

IMO,这个故事的寓意是任何希望与对象关联的方法都应该使用显式对象引用来调用。然后,这消除了所有混淆,消除了严格模式和非严格模式之间的所有差异,消除了浏览器和 Node.js 之间的所有差异。

So why does this happen:

hasOwnProperty("x")

TypeError: Cannot convert undefined or null to object

如果您尝试调用 hasOwnProperty() 来测试 node.js 中全局对象的属性,则使用 global 的上下文调用该方法对象如:

global.hasOwnProperty("a")

这将适用于任何地方,被认为是好的和适当的 Javascript 代码。在没有适当的对象上下文的情况下调用它会导致 this 值被设置为默认值。在 node.js 中,默认值不一定是全局对象。但是,在所有情况下,您都不应依赖默认值。通过始终指定所需的对象引用来正确编程,您的代码将在任何地方正常工作。


仅供引用,除了 obj.method() 之外,还有更多方法可以控制将什么 this 传递给函数。您可以阅读其他方式 here in this other answer .它们包括 .call().apply()、箭头函数(在 ES6 中)等...

关于javascript - Node.js:为什么调用 hasOwnProperty 与 global.hasOwnProperty 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494373/

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