【问题标题】:Why does logging this objects properties give a different result then logging the object itself and looking at the properties?为什么记录此对象属性会给出不同的结果,然后记录对象本身并查看属性?
【发布时间】:2020-03-18 11:42:25
【问题描述】:

我目前正在尝试使用 react redux 设置 socket-io,我似乎遇到了一个奇怪的命名空间问题

console.log(socket);
console.log(socket.disconnected);
console.log(socket.id);
console.log(socket);

第一个日志返回一个大对象,这里有两个属性。

disconnected: false;
id: PuAi01tcCcZgmJaAACM

然而,第二个和第三个日志返回的内容与最初所说的对象完全不同。记录 socket.disconnected 返回 true,记录 socket.id 返回 undefined。

如果套接字在日志之间发生了某种变异,我将最后一个日志记录下来。它返回原始日志,其中 disconnected 为 false 并且 id 存在。

这似乎是一些奇怪的命名空间问题?我看不出它是如何发生的,但似乎有两个不同的套接字名称,并且访问名称套接字的属性似乎以其中一个为目标。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    解决方案

    如果您不希望对象的日志在现代浏览器中实时更新,请在记录之前将对象解析为字符串:

    const example = { foo: 'bar' };
    console.log(JSON.stringify(example));
    // or with pretty printing: 
    console.log(JSON.stringify(example, null, 2));  
    

    说明

    在现代浏览器中,console.log 不会记录字符串,它会记录对内存中实际 javascript 对象的引用。因此,当您查看记录的对象时,您的所有 javascript 都已运行并且对象已发生变异。

    const example = { foo: 'bar' };
    console.log(example);
    example.foo = 'baz';
    // log will say { foo: 'baz' } (usually with a note that the value is live)
    

    当您记录对象的属性时,如果该属性是不可变的(如字符串、布尔值或数字),它将记录对象的值而不是引用。因此,如果您在记录后更改字符串,则原始字符串不会在控制台中更改。

    let example = 'foo';
    console.log(example);
    example = 'bar';
    // log will say 'foo'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多