JavaScript中的复杂对象

4

我正在尝试使用一个名为bcoin的库来进行node编程。运行以下代码:

  chain.on('block', function(block) {
    console.log('Connected block to blockchain:');
    block.txs.forEach(function(t) {
      t.inputs.forEach(function(i) {
        console.log(typeof i, i);
        console.log(JSON.stringify(i));
      });
    });
  });

这是我得到的响应:
Connected block to blockchain:
object { type: 'coinbase',
  subtype: null,
  address: null,
  script: <Script: 486604799 676>,
  witness: <Witness: >,
  redeem: null,
  sequence: 4294967295,
  prevout: <Outpoint: 0000000000000000000000000000000000000000000000000000000000000000/4294967295>,
  coin: null }
{"prevout":{"hash":"0000000000000000000000000000000000000000000000000000000000000000","index":4294967295},"script":"04ffff001d02a402","witness":"00","sequence":4294967295,"address":null}

需要注意的是,尽管我们在打印i时显示了属性type,但当我们使用JSON.stringify对象时,该属性不存在。如果我尝试console.log(i.type),我将得到undefined

这是怎么可能的?还有什么好的方法可以调试对象发生了什么?


{btsdaf} - SPlatten
{btsdaf} - Or Weinberger
{btsdaf} - SPlatten
1个回答

1

JSON.stringify 只会包含可枚举的非函数属性。

因此,如果您定义一个属性并将其设置为不可枚举,则它将不是 JSON 字符串的一部分。

var obj = {
  a: 'test'
};

// Non-enumerable property
Object.defineProperty(obj, 'type', {
  enumerable: false,
  value: 'Test'
});

// Get property
Object.defineProperty(obj, 'type2', {
  get: function(){
    return 'Test 2'
  }
});


console.log(JSON.stringify(obj), obj);
console.log(obj.type, obj.type2)

enter image description here


{btsdaf} - Or Weinberger
{btsdaf} - Or Weinberger
虽然这很有趣,但它并没有回答问题。 - Or Weinberger
@OrWeinberger 感谢您的回复。 此外,正如我之前所述,type不是唯一缺失的属性。 我的建议是,您应该检查是否覆盖了内部函数。 这可能是通过某个库完成的。 这是因为,在JS对象中,<Script:486604799 676>不是有效值。 因此,有一些机制要么以特殊方式打印值,要么在字符串化时删除值。 - Rajesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接