视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
lol无法连接服务器解决办法 淘宝的店铺链接在哪里 u盘一个文件夹删不掉怎么办 查看微信好友删除你 lol无法连接至验证服务器怎么解决 怎么把微信昵称变空白 美的双开门冰箱漏水是怎么回事 qq浏览器打不开网页怎么修复 微信怎么知道对方有没有删除你 电脑w10开机密码忘了怎么办 打印机扫描文件到电脑在哪里找 用QQ浏览器打不开网页怎么办 怎么看微信别人有没有删除你 怎么拦截电脑垃圾广告信息 拼多多退货单号怎么填 我的qq浏览器打不开网页 微信怎么看别人有没有删除你好友 qq浏览器打不开网页怎么办啊 ps照片水印怎么去除 qq浏览器经常打不开网页 电脑怎么在计算机里删除搜索记录 新冰箱静置多久可以通电 怎么看对方微信有没有删除你 lol无法连接服务器怎么解决方法 打印机连接为什么显示脱机状态 苹果手机微信视频时对方听不见声音 微信好友怎么看对方有没有删除你 LOL连接不上服务器无法解决 ipad连接itunes解锁教程 小米盒子怎么看电视直播 lol显示无法连接服务器怎么解决 怎么看微信好友删除你 打印机635ii页边距怎么调 LOL英雄联盟提示无法连接服务器解决方案 海尔冰箱恒温结冰怎么回事 新手简单了解vue 苹果7p钉钉怎么分屏 lol进游戏显示无法连接服务器怎么解决 电脑为什么卡 做麻婆豆腐的方法
js console.log打印对象时属性缺失的解决方法
2020-11-27 21:56:14 责编:小采
文档

1. 序

在编写代码时,我们常常用 console.log() 的方式将信息在控制台中打印出来以帮助我们进行前端调试。一般情况下,我们打印普通值都没有问题,但在打印对象类型时,我们就需要注意点了,要不然可能会出现不符合期望的结果。

2. console.log()输出对象属性缺失

  • 首先,定义了一个 cat对象 ,其拥有 name, age, color, birthday 四个属性。
  • 接着,我们又定义了一个函数 test ,它接收一个对象作为参数。调用test函数时,我们想知道传入test函数的参数是怎样的,会先调用 console.log(obj) 将传入的对象打印出来,最后在函数内的某处删除传入对象的 name 属性。
  • 那么,此时将 cat 对象作为参数调用 test 函数,控制台打印出来的信息将会是什么呢?会是我们预想的传入时参数的样子吗?

    const cat = {
     name: '喵喵',
     age: '2',
     color: 'white',
     birthday: '1月1号'
    }
    
    function test(obj) {
     console.log(obj)
     //这里有段很长的代码...
     delete obj.name
    }
    
    test(cat)

    控制台输出信息:

    咋一看,没问题,输出的结果的确是我们传入时的样子。但实际中,传入的对象可能具有很多属性,那么我们想要看完整的信息就必须将输出结果展开。如下:

    展开的信息中,我们可以看到结果少了 name 属性,细心的小伙伴可以发现还多了一个感叹号的标志(鼠标悬浮的文字:Value below was evaluated just now.)。咦,奇怪了,我们不是在test函数内的第一行代码就输出参数的信息的吗,怎么会少了 name 属性? 其实感叹号的内容已经说明了,我们展开的信息其实是刚刚获取到的结果,也就是代码执行后的结果,test函数中有一段 delete obj.name 的代码,执行完后,obj对象当然就没有 name

    属性啦。在复杂的项目中,对象属性会很多,代码中的不知哪一处也可能会删除了对象的某些属性,这时我们打印出来的结果可能就会跟传入时的不一样,这种情况下我们可能就会一头雾水了。那么如何获取正确的结果呢?

    3. 获取正确的结果

    由于展开 console.log() 的结果并不是我们代码所处位置那个时间点的对象的拷贝,故我们想要在代码执行到那个位置时的那个时间点对应的对象状态,只要在那时输出 对象的副本 即可。

    3.1 方法1:对象展开

    const cat = {
     name: '喵喵',
     age: '2',
     color: 'white',
     birthday: '1月1号'
    }
    
    function test(obj) {
     console.log({...obj}) //使用ES6的对象展开符操作,获取到obj的副本。
     //这里有段很长的代码...
     delete obj.name
    }
    
    test(cat)

    这时,我们得到的就是 console.log() 执行时间点时obj的状态啦。

    3.2 方法2: JSON.stringfy()看字符串

    const cat = {
     name: '喵喵',
     age: '2',
     color: 'white',
     birthday: '1月1号'
    }
    
    function test(obj) {
     console.log(JSON.stringify(obj)) //调用JSON.stringify()方法将对象转化为字符串
     //这里有段很长的代码...
     delete obj.name
    }
    
    test(cat)

    同样,此时我们也可以得到代码运行时间点时的obj对象状态。

    总结 : 以上两种方法都可以获取代码运行时的对象状态,但是比较 推荐第一种方法,因为当内容非常多时,第一种方法可以展开数据,有利于我们更快捷清晰地获取目标信息。

    下载本文
    显示全文
    专题