跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 各位前端大佬,请教一个莫名其妙的前端 JS 问题。
未分類
21 10 月 2020

各位前端大佬,请教一个莫名其妙的前端 JS 问题。

各位前端大佬,请教一个莫名其妙的前端 JS 问题。

資深大佬 : wzl20001001 6

撸代码时出现了一个奇怪的 Bug 。

主要逻辑是用 axios 获取后端接口返回的状态码,如果成功则将表单值置为空,以便下次添加。

但是当在控制台输出的时候,输出的对象是先经过主函数的 then 中的语句更改过的对象,但是如果读取其中的属性值,却是未经过更改的值。

测试的执行顺序也是输出的 1,2,3 的顺序(先是执行 dispatch 之前的语句,接着执行 action,最后执行 then 中的语句)。

有一点实在想不通:为啥还没运行到赋值语句,直接输出对象会是赋值后的样子。而且只有输出对象时,控制台显示对象的属性值是更改,但直接对象中的属性值时却未改变。

这是主函数:

addBookmark() {    console.log(1)  // 1, 测试,用于测试执行顺序   console.log(this.newBookmarkInfo) // 获取到的对象是经过过 then 中修改之后的对象 {bookmarkId:0, bookmarkTitle:1, bookmarkUrl:1}   console.log(this.newBookmarkInfo.bookmarkTitle) // 获取到的是未经更改的 title: "title"    this.$store.dispatch('addBookmark',this.newBookmarkInfo).then(() => { // 调用 Action      console.log(this.newBookmarkInfo) // 同样是值更改过的对象     console.log(this.newBookmarkInfo.bookmarkTitle) // 获取到的是未经更改的对象中的 title: "title"      // 赋值语句     this.newBookmarkInfo.bookmarkTitle='1'     this.newBookmarkInfo.bookmarkUrl='1'      console.log(3)  // 3      // 对表单状态和弹窗状态的重置     this.$refs.obs.reset()     this.dialog = false   }).catch(error => {     console.log('error')     console.log(error.response)   }) }, 

这是 vuex 中的 Action:

addBookmark(undefine, newBookmarkInfo){   console.log(2)  // 2    console.log(newBookmarkInfo)  // 同样也是被更改过的对象   console.log(newBookmarkInfo.bookmarkTitile) // 获取到的是未经过更改的 title   return new Promise((resolve,reject) => {     addBookmarkOne(newBookmarkInfo).then(resp => {       const { data } = resp       resolve(data)     }).catch(error => {       reject(error)     })   }) }, 

这是运行的控制台截图:

各位前端大佬,请教一个莫名其妙的前端 JS 问题。

大佬有話說 (8)

  • 資深大佬 : shintendo

    简单地说,chrome 在 console.log 输出对象的时候,输出的是对象的引用,而非对象内容的“快照”,你点+号展开的时候才对内容求值

  • 資深大佬 : shintendo

    补充,解决这个问题的一个方法是 console.log(JSON.parse(JSON.stringify(obj)))

  • 主 資深大佬 : wzl20001001

    @shintendo 懂了,谢谢大佬。一直以为是代码的问题,没往这方面想。

  • 資深大佬 : SxqSachin

    你可以尝试在每一句 console.log 下加一行 debugger;,来看那个时点这个对象的值。

  • 資深大佬 : azcvcza

    火狐还是什么浏览器就严谨一点,到了对象该输出的时候才输出。chrome 的话,如果一开始一个{},打印的时候没值,但异步之后有值,那么之前打印的那条也会变成有值

  • 資深大佬 : fengmumu

    @azcvcza 火狐

  • 資深大佬 : azcvcza

    @fengmumu 可以

  • 主 資深大佬 : wzl20001001

    @SxqSachin 今天晚上搞其他的组件的时候发现问题了,在值传递的时候没有进行对象拷贝,直接把源对象赋值给了变量,导致了加入 vuex 的一直是对源对象的引用。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具