【问题标题】:object instanceof Object is false ,why?object instanceof Object 是假的,为什么?
【发布时间】:2015-05-06 03:18:42
【问题描述】:

在节点上表达

var query = request.query;
打印出query的信息如下:


添加:

mac:query instanceof Object 是真的
但在 CentOS release 6.4 (Final) 上:是假的(下图)

再次添加:
节点:0.12.2
快递:3.4.4
操作系统:CentOS release 6.4(Final)

【问题讨论】:

  • 可以console.log(query,__proto__ == Object.prototype)吗?
  • 我正在尝试在 Express 3 和 Express 4 中重现此问题,但我无法做到。您的代码中一定有一些特殊之处。请提供更多您的代码!谢谢!
  • 通常当foo instanceof Object === false 时,foo 是以不共享Object.prototype 的方式创建的。例如var foo = Object.create(null); 将创建一个没有 (Object) 原型的对象。这也意味着它不再有内置方法。但是,我找不到在 Express 或其任何依赖项中使用 Object.create(null) 或类似的查询字符串解析。
  • 此外,将foo.__proto__ 重新分配给Object.prototype 以外的其他对象将导致instanceof 检查返回false。

标签: javascript node.js express instanceof


【解决方案1】:

此代码在 Express 3 和 Express 4 中均显示 true

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send(req.query instanceof Object);
});

var server = app.listen(3000, function () {

  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);

});

所以这似乎不是 Express 中普遍(或至少不普遍)存在的问题。

我能想到的最有可能的事情是,在您的代码(或您正在使用的库/中间件)的某个地方,query.__proto__ 被设置为看起来像一个对象但不是的东西。也许类似这样的东西?:

var query = {};
query.__proto__ = null;
query.__proto__ = '{}';
console.log(query.__proto__); // {}
console.log(typeof query); // object
console.log(query instanceof Object); // false

【讨论】:

  • 请注意,query.__proto__ = '{}'; 绝对什么都不做(imo,它应该在严格模式下 throw
  • 它没有任何好处,但它确实做了一件坏事:它会给console.log(query.__proto__); 带来误导性消息。我把它放在那里是为了生成与 OP 报告的内容一致的日志消息。
  • @Trott:啊,我明白了,那里不再是二传手了。
猜你喜欢
  • 2015-01-13
  • 2014-12-01
  • 2016-02-09
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多