【问题标题】:Node.js console.log(object) prints empty objectNode.js console.log(object) 打印空对象
【发布时间】:2015-10-05 13:07:13
【问题描述】:

我很好奇 Node.js 通过 console.log(object) 打印对象的方式。

我在文件constructor.js下有以下代码(来自Learning Javascript Design Patterns book)

var defineProp = function(obj, key, value){
    var config = {
        value: value, 
        writable: true,
        configurable: true
    };
    Object.defineProperty(obj, key, config ); 
}

var person = Object.create(Object.prototype);


defineProp(person, "car", "Delorean"); 
defineProp(person, "dateOfBirth", "1981"); 
defineProp(person, "hasBeard", false); 

console.log(person); //This prints {} in Node.js

使用带有>node constructor.js 的代码运行会打印一个空对象。但是,如果我在 HTML 文件中运行代码,Chrome 会打印出我所期望的内容。

console.log(person); //Chrome prints Object {car: "Delorean", dateOfBirth: "1981", hasBeard: false} 

注意:我仍然可以打印Node下的属性(例如console.log(person.car)),只是不能打印对象本身(例如console.log(person)

这是为什么? Chrome 和 Node 是否对控制台对象使用不同的原型,即使它们共享相同的 javascript 引擎?

【问题讨论】:

  • 不确定它们为何不同,但如果将 enumerable: true 添加到 config 对象,属性将在 node.js 中打印。
  • 默认情况下,使用defineProperty() 创建的属性不可枚举。因此,也许 node.js 只向您显示可枚举属性,而 Chrome 显示不可枚举属性。 console.log() 不是标准中指定的东西,它是一个宿主对象,不是 Javascript 语言的官方部分,因此不同的环境可能有不同的行为。
  • node 中的 console.log 与 Chrome 中的非常不同。首先,节点打印到标准输出,因此必须重写其 console.log 以支持流。这意味着从一开始节点就没有使用与 Chrome 相同的 console.log。其次,从 0.6 版开始,节点的 console.log 是同步的(相对于 Chrome 的异步),因为人们希望在服务器崩溃之前看到他们打印的最后一个 console.log。不同步使得调试崩溃的服务器变得非常困难,因为在节点退出之前不会记录崩溃的原因
  • @slebetman 节点的 console.log() 仅在 stdout 重定向到文件时同步。否则它在所有平台上总是异步的。 node 的 github 问题跟踪器上已经有几个关于此的问题。

标签: javascript node.js


【解决方案1】:

节点中的console.log() 使用util.inspect()uses Object.keys() 用于对象,returns only own enumerable properties。此外,by defaultObject.defineProperty() 设置为 enumerable: false,如果您未将其显式设置为 true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2021-09-13
    • 2013-01-28
    相关资源
    最近更新 更多