4

在 node.js 中,在一个对象上调用 console.log,该对象具有一个名为inspectprints的元素,undefined即使它仍然作为一个对象工作。我认为这是因为节点在内部使用检查来打印内容。

var thingTwo = {
  num: 1,
  func: function (x) { 2; },
  inspect: function (x) { "hi"; },
};

console.log(thingTwo);  // undefined

为了避免将来出现这个陷阱,是否有其他破坏标准功能的单词列表?

4

2 回答 2

4

酷,这激起了我的好奇心,事实上,有一个未记录的特性,一个对象可以提供它自己的inspect方法。util.js中的相关代码:

function formatValue(ctx, value, recurseTimes) {
  // Provide a hook for user-specified inspect functions.
  // Check that value is an object with an inspect function on it
  if (value && typeof value.inspect === 'function' &&
      // Filter out the util module, it's inspect function is special
      value.inspect !== exports.inspect &&
      // Also filter out any prototype objects using the circular check.
      !(value.constructor && value.constructor.prototype === value)) {
    return String(value.inspect(recurseTimes));
  }

即,它仅在inspect存在并且是触发行为的函数时。

于 2012-07-25T15:10:52.013 回答
0

如果一个对象有一个inspect属性并且它是一个函数,则console.log打印它的返回值。

$ node
> console.log({ inspect: function() { return 'hi'; } });
hi

如果我们查看source,我们会发现没有办法避免这种行为。如果一个对象inspect是一个函数,console.log将打印它的返回值。


请注意,在 Node 0.6.x 及之前的版本中,console.log实际上并没有 print undefined,它只是打印一个空行。你只会看到undefined你是否在REPL中这样做。

于 2012-07-25T15:10:07.530 回答