求各位大佬解答一下 thirdScriptError TypeError: Cannot create property '0' on string ''
来源:19-7 使用缓存实现文章收藏功能

华灯初上丶
2017-12-14
我看到很多同学都有这个错误,完全跟七月老师代码一样,却总是在点击的时候报错,求解答,谢谢各位
Cannot create property '0' on string '';at "pages/posts/post-detail/post-detail" page onCollectionTap function
TypeError: Cannot create property '0' on string ''
谢谢,非常感谢!!!
6回答
-
先分析下报错原因,报错是发生在onColletionTap function中,可以先打一下断点测试一下,崩溃在了wx.setStorageSync('posts_collected', postsCollected),说明是postsCollected有问题,我们与这个相关的地方,一个是在onLoad方法中,声明这个对象。先去缓存中找有没有postsCollected,打断点发现没有,那么再看下一个与postsCollected有关的地方,是if else判断语句中,忽略了postsCollected不存在的情况。(我代码报错就在这,所以先假设你问题与我相似)。然后我们回过头,看为什么会这么报错,我们在if上打个断点,会发现系统默认postsCollected为"",这也是报错的原因:Cannot create property '0' on string '',string指的不是别的,正是postsCollected。所以补充好else逻辑部分,应该就OK了。
742020-10-04 -
小小祭司
2017-12-21
你好,请不要把23行的获取缓存postsCollected设置为{}。
如果设置为{},默认postsCollected是存在,然而此时postsCollected并没有赋值。因为你在23行将var postsCollected = {};所以只会进入到if判断语句中, postsCollected[postId]拿不到数据,postCollected会是undefined,代码会崩溃在this.setData中。
23行代码var postsCollected = wx.getStorageSync('posts_collected'),目的是获取本地的缓存,如果设置为var postsCollected = {};岂不是等于放弃获取本地缓存了?
微信开发工具上面有个清缓存,先清除数据缓存再调试一下,会直观的发现问题。假设你没有清除之前的缓存,此时onload加载数据,会发现setData也没有执行到,可以在调试器中AppData中查看,没有collected这一项。只是Console没有警告而已(这个地方挺好奇的,如果有缓存,即便this.setData不执行也没警告)。而清除数据缓存后,如果23行是postsCollected = {},则会直接警告。
接下来我放下测试图片(这也是为什么在这回复的原因,因为回答可以上图片,直接回复没办法发测试图。)
var postsCollected = wx.getStorageSync('posts_collected')情况下收藏以后,onLoad执行if中this.setData结果:
假设先执行var postsCollected = wx.getStorageSync('posts_collected'存在了数据缓存以后,改为postsCollected = {}情况下,onLoad执行完this.setData结果:
即便存在缓存,收藏图片也没有反应过来,因为设置postsCollected = {},获取到的postCollected不存在,所以初始化是默认的不收藏。虽然this.setData没报错,但是AppData中没有collected,说明并没有成功。
而这一切,都发生在unLoad中,也就是页面加载才会调用的方法。
80 -
华灯初上丶
提问者
2017-12-21
#错误原因:if else判断语句中,忽略了postsCollected不存在的情况
#解决方法:完善if else中的针对postsCollected的逻辑部分
在if else代码中插入一段:
if (postsCollected === undefined){
var postsCollected = {};
postsCollected[postId] = false;
wx.setStorageSync('posts_collected', postsCollected);
}
具体判断对象是否为空的语句有很多
网址如下,各位可以瞧一瞧,我大部分都看不懂O_o.....
http://www.jb51.net/article/44726.htm
#看到了好多朋友跟我一样的错误,本人大二新手,实在是对这些了解的不多,感谢群里面的各位大神还有帮我回答问题的大神。我觉得这课程真滴蛮有用的,对知识体系的讲解很到位,同时谢谢七月老师。
欢迎各位指点和补充QAQ
312018-05-06 -
降维
2021-02-15
终于搞定,postsCollected空对象的判断处理逻辑
onCollect(event){
var postsCollected = this.data._postsCollected
//判断postsCollected的空对象去做的事情
if(postsCollected == ''){
const postsCollected = {}
postsCollected[this.data._pid] = !this.data.collected
this.setData({
collected:!this.data.collected
})
wx.setStorageSync('posts_collected', postsCollected)
}else{
const postsCollected = this.data._postsCollected
postsCollected[this.data._pid] = !this.data.collected
this.setData({
collected:!this.data.collected
})
wx.setStorageSync('posts_collected', postsCollected)
}
},
212024-12-11 -
华灯初上丶
提问者
2017-12-20
各位朋友注意一下,这个地方如果出错,请将23行的老师给的代码替换为24行的代码。原因就是楼上那个大佬说的,postsCollected在23行其实不存在于缓存,所以系统默认为string类型字符串而不是对象,这样你后面对一个字符组赋值数组肯定不对,所以在这一行就将他设置为空对象即可。再次感谢楼上大佬哈!
232017-12-21 -
粽糕里咖
2018-01-21
我也遇到了这个问题.云里雾里.看了2位精彩解答给个赞
原因是因为之前的缓存没有删除,遇到了0,1以外的情况,所以出现了undefined
00
相似问题