哥们姐们,今天我来跟大家唠唠这个“objecterror”到底是个啥玩意儿。说起来,我第一次碰到这东西,那真是挠头挠得我头发都快掉光了。
那会儿,我刚开始捣鼓一些小网站,想着学点新东西,就去弄了个那种能从网上抓点数据的功能。想着挺简单的,不就是发个请求,然后把拿回来的数据往页面上一放嘛结果,我信心满满地写完代码,一运行,好家伙,页面没出来控制台里倒是蹦出个错,当时我脑袋里就冒出个词,‘objecterror’,虽然它可能不是直接这么写的,但那种感觉就是:你TMD想对一个不是对象的东西,干只有对象才能干的事。
第一次交锋:抓瞎!
我当时傻眼了,心想,我这数据明明都拿回来了,怎么就不行了?我就去各种,把拿回来的数据从头到尾都打印了一遍。结果发现,有时候它返回的是一个像样的对象,里面有我想要的名字、年龄什么的。可有时候,它返回的竟然是个null,甚至干脆就什么都没有,是个undefined!更离谱的是,偶尔它还会给我返回一串字符串,或者是个空数组。
我当时就郁闷了,我这代码写得好好的,、,多清晰!怎么一到运行就“objecterror”了?那时候真是一点辙都没有,感觉自己就像个无头苍蝇,在代码里乱撞。改了一行又一行,删了又写,但只要我尝试去拿那个data里面的东西,只要它不是个正儿八经的对象,就铁定报错。
琢磨明白:它根本就不是你想的那样!
后来我逼着自己静下心来,把每一步都拆开看。我发现,这个“objecterror”的根源,根本不是我的代码写错了语法,而是我想当然了。我以为我每次拿到的数据都肯定是个对象,所以我直接就去点它里面的属性了。但这网络上的数据,它可不会每次都乖乖地按照你的预期来。
小编温馨提醒:本站只提供游戏介绍,下载游戏请前往89游戏主站,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
我的“objecterror”说白了,就是:
-
当返回的是
null或者undefined时,我却非要去访问或者。这不就是对“无”进行操作吗?它当然不认识了。 -
当返回的是一串普通的字符串,比如“服务器出错了”,我却去
“服务器出错了”.name。字符串哪有name属性? -
当返回的是一个空数组,我却去
[].name。数组虽然是对象,但它没有我想要的那种普通对象的属性。
我猛地醒悟过来,原来我一直都在犯同一个错误:没有先判断,就直接使用。这就像你从箱子里拿东西,你没看清楚里面是就直接伸手去摸,结果摸到个烫手山芋一样。
我的应对之道:先看清,再下手!
搞清楚这个核心问题后,我的思路就彻底变了。我不再一上来就直接用拿到的数据,而是加了个“验货”环节。就像我以前跟师傅学电焊,师傅老说,你得先看准了,稳了,再去焊,别毛毛躁躁的。
我开始学着这么干:
-
第一步:检查是不是有东西。
我要看我拿到的这个
data,它到底是不是null或者undefined。如果啥都没有,那我后面就没必要往下走了,直接给个提示说“没数据”或者干脆不操作就行了。if (!data) {*('啥也没拿到!');
return;
-
第二步:检查是不是个对象。
光有东西还不行,还得确保它是个对象才行。不然你拿到个字符串或者数字,还想去
.name,那不又GG了嘛if (typeof data !== 'object' data === null) { // data === null是为了排除null,因为typeof null也是'object'*('拿到的不是一个对象!');
return;
-
第三步:排除数组的干扰。
有时候,它会返回一个数组。数组虽然也是对象,但我要的不是数组。所以还得再加一层判断,是不是数组。这里可以这样来:
if (*(data)) {*('拿到的竟然是个数组!');
// 对数组进行特殊处理,或者直接跳过
return;
把这些判断都加上之后,我的代码就稳当多了。每次拿到数据,我都会先让它过一遍“安检”,确保它是我想要的那种“对象”,并且里面有我想要的属性,我才敢放心地去或者。
经过这么一番折腾,我对这个“objecterror”算是彻底搞明白了。它不是一个具体的错误类型,更像是一类问题的总称,就是你对一个“不是对象”或者“不是你想要的那种对象”的东西,做了只有特定对象才能做的操作。咱们在写代码的时候,千万不能想拿到的数据,先验验货,看清楚了再下手,这样才能避免掉进“objecterror”的坑里!



