当前位置: 首页 > 知识库问答 >
问题:

javascript - vue3 中 props 拿到的数据为什么比控制台的 console.log 慢?

刁星渊
2023-05-17

问题背景
今天在写组件时,遇到了一个极其怪异的现象。

  1. 这是一个普通父组件
    image.png

    在父组件的 beforeMount 中有一个异步函数去获取一个数据列表。
  2. 紧接着会把这个数据通过 props 传递给子组件<Tab/>
    image.png
  3. 然后进入到子组件的 onMounted 钩子函数中,我为了防止 props 为空,特地做了一层判断。
    image.png
  4. 然后我就在控制台的输出上发现了一个很诡异的现象,当我在上一步打印 props 整体的时候,我可以拿到整个 props 的信息。 但是如果我想取 props 中某一个具体值时,比如 list ,image.png,竟然输出为空。(如下图)
    image.png

问题: JS 从上往下执行的,两个 console 也是同步代码,为什么会发生,上面的 console 有值,但是紧接着下面的 console 却是空值呢?

共有2个答案

方德宇
2023-05-17

看描述应该和vue关系不大,大概率是因为js的引用类型导致的,类似的你可以在控制台输入以下代码

a = { value: 'a', arr: [] }
console.log(a)
console.log('old', a.arr)
a.arr = [1,2,3]
console.log('new', a.arr)

你会发现上面的a展开后arr也不是空数组,因为a是引用类型,其实是栈内存中存的堆内存地址,你改了a.arr,堆内存中的值改变了,但是a的引用地址没变,所以你在控制台展开a的时候发现a.arr已经变了。

汝弘深
2023-05-17

console.log 打印对象和数组之类的引用内容时会在控制台输出一个快照,如果后续有操作影响到了被打印的变量时,在控制台展开的内容也会同步变更。

如果不想要因为后续变更所改变,可以只解构赋值一下,保证快照的正确。
比如说 console.log('props.list', [...props.list]),或者用 console.log('props.list', JSON.parse(JSON.stringify(props.list)))。

console.log - Web API 接口参考 | MDN

 类似资料:
  • 如果我在chrome或firefox上直接将下面的代码运行到控制台中,在第一个日志中,value2的值在内联表示中是0,但是如果我展开表示检查整个对象,它显示为17。这是一个多浏览器的bug还是我在这里遗漏了javascript的一些东西?我在这里提出这个问题的原因是,这种行为发生在不同的浏览器上,这使我认为语言或函数中存在某种我没有意识到的漏洞。 实际代码: 在MacOS Catalina和两种

  • 问题内容: 一直有人告诉我,在调试应用程序时,JavaScript的方法优于简单的使用方法。为什么是这样?有没有一个很好的例子,有人可以指出我哪里是更好的选择? 问题答案: 正在阻止 在非调试环境中不容易被抑制 通常可以很好地格式化对象并允许遍历它们 日志记录语句通常具有交互式的代码指针,该代码发出了日志记录语句 您一次只能查看一个以上的消息 可以通过直观的格式设置不同的日志记录级别

  • 问题内容: 有什么用? 请通过代码示例说明如何在JavaScript中使用它。 问题答案: 它不是jQuery功能,而是用于调试的功能。例如,您可以在发生某些情况时将某些内容记录到控制台。例如: 然后你会看到在Firebug的“控制台”选项卡(或其他工具的控制台- 例如Chrome的Web检查)时,您需要点击按钮。 由于某些原因,控制台对象可能不可用。然后,您可以检查它是否有用-这很有用,因为在部

  • 所以,我的代码是 但是控制台是空的。没有错误,什么都没有。我做错了什么?

  • 问题内容: 我今天注意到,当您输入控制台时,Chrome 49不再输出。而是输出字符串。 为什么是这样?语言改变了吗? 问题答案: 现在,Chromedevtools会自动在隐含的一对括号中包装所有以开头和结尾的内容,以强制将其评估为表达式。这样,现在创建一个空对象。如果您回顾历史记录(),则会看到此内容,前一行将包含在中。 为什么? 我不知道,但是 我可以猜到它减少了对于不了解block-vs-

  • 问题内容: 我使用以下URL通过代码创建了一个H2数据库: jdbc:h2:C:/data/fixed.db 我的代码可以创建表,执行查询。如果手动打开文件,则可以成功查看其内容并查看创建查询等 但是,当我尝试通过Web界面使用H2控制台时,看不到数据库。而是,Web控制台在此处创建 另一个 空数据库。我只是无法加载我的数据库。 我想念什么? 编辑 我的代码使用H2 1.3.175 Web控制台H