- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
也许这是一个新手问题,但我找不到或想不出解释。
启动 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/
对版主的澄清由于一些版主在扫描问题时速度有点快,我必须强调我不是在问为什么要使用 Object.prototype.hasOwnProperty.call 而不是 myObject.hasOwnPro
代码一: obj.hasOwnProperty(prop); 代码二: const hasOwnProperty = Object.prototype; hasOwnProperty.call(obj
这个问题在这里已经有了答案: Why use Object.prototype.hasOwnProperty.call(myObj, prop) instead of myObj.hasOwnPro
也许这是一个新手问题,但我找不到或想不出解释。 启动 Node.js 控制台,然后: > global.hasOwnProperty === hasOwnProperty true 那为什么 > gl
在eslint规则中guard-for-in ,直接使用for in是不正确的。好的做法是 for (key in foo) { if (Object.prototype.hasOwnProp
如果我理解正确的话,JavaScript 中的每个对象都继承自 Object 原型(prototype),这意味着 JavaScript 中的每个对象都可以通过其原型(prototype)链访问 ha
我正在尝试让我的某些类型具有某种多重“继承”,如下所示: UIControls.ClickableMesh.prototype = Object.create(THREE.Mesh.prototype
我试图发现一个对象是否具有某些属性并且我在使用 hasOwnProperty 方法时遇到了问题。 我在数组上使用该方法(我知道文档说明了一个字符串)。 以下行返回 true: { "a": 1, "b
谁能解释一下空对象上调用的 hasOwnProperty 的作用?为什么要使用它? __hasProp = {}.hasOwnProperty 我在开始使用 coffescript 进行开发时发现了这
我想使用ES6代理来捕获以下常见代码: for (let key in trapped) { if (!Object.prototype.hasOwnProperty.call(obj, ke
使用 angularjs 和 firebase 编写一个函数,该函数应该检查是否可以在数据库中找到 currentUser。目前“attendings”属性仅包含一个用户,即“Peter Pan” 服
我有一个非常简单的问题。访问对象的属性(例如object[property])和属性的数量是否有任何性能关系?是否存在一些内部循环或其他问题,关于 hasOwnProperty - 任何循环或只是像
我试图理解为什么当我调用下面的函数时结果是“否”,因为属性 c 应该存在。有谁知道为什么?谢谢!!! var letters = function() { this.a = 5; th
在 Javascript 中查找散列中的所有值我看到了以下代码: var myHash = {}; myHash['one'] = 1; myHash['two'] = 2; for (var key
我有以下数据: trace = { "name":"foo", "dataref": { "xdata":"n", "ydata":"m" } }; 我想检查对象是否具有
通过某些值,hasOwnProperty调用将引发错误。 让我们检查以下代码 null.hasOwnProperty('bar') //error undefined.hasOwnProperty('
为什么是真的?对象中的方法foo怎么写? Object.prototype.foo = function(obj) { for(var i in obj) this[i] = obj[i];
这个问题在这里已经有了答案: JavaScript object detection: dot syntax versus 'in' keyword (5 个答案) 关闭 7 年前。 假设有一个对象
问题陈述: 如果对象具有与 JavaScript 预定义的 方法 相同的 property 名称。它无法执行并给出以下错误。 Uncaught TypeError: obj.hasOwnPropert
为什么此函数返回“No Contact”而不是“Akira”? function lookUpProfile(firstName, prop){ for(i=0;i
我是一名优秀的程序员,十分优秀!