4

inspectnode.jsで、 printsという要素を持つオブジェクトに対してconsole.logを呼び出すとundefined、それはまだオブジェクトとして機能します。これは、ノードが内部でinspectを使用して出力するためだと思います。

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

ソースを見ると、この動作を回避する方法がないことがわかります。オブジェクトinspectが関数の場合、console.logはその戻り値を出力します。


Node 0.6.x以前でconsole.logは、実際には印刷されずundefined、空白行が印刷されるだけであることに注意してください。REPLundefinedでこれを行っているかどうかだけがわかります。

于 2012-07-25T15:10:07.530 に答える