求各位大佬解答一下 thirdScriptError TypeError: Cannot create property '0' on string ''

来源:19-7 使用缓存实现文章收藏功能

华灯初上丶

2017-12-14

我看到很多同学都有这个错误,完全跟七月老师代码一样,却总是在点击的时候报错,求解答,谢谢各位

http://img.mukewang.com/szimg/5a32470e0001016706600191.jpg

http://img.mukewang.com/szimg/5a32470e0001e31711230313.jpg

Cannot create property '0' on string '';at "pages/posts/post-detail/post-detail" page onCollectionTap function 

TypeError: Cannot create property '0' on string ''


谢谢,非常感谢!!!

写回答

6回答

小小祭司

2017-12-19

先分析下报错原因,报错是发生在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了。


7
4
黑子的一生
你要学会打断点,如果缓存中没有post-collects对象的话 ,那么你拿到的post-collects就是一个空的字符串'',你给一个空字符串添加动态属性数字,就报这个错误了,老师讲的时候没有出现这种情况,所以我们还需要多加一个判断,这是我的代码: onCollect() { //取消收藏 const postCollect = this.data._postCollect; //如果缓存中postCollect对象没有值,那么是'',所以要考虑这种情况 if (postCollect == '') { const postCollect = {}; //新建一个空对象 postCollect[this.data._postId] = true; wx.setStorageSync('post-collects', postCollect) this.setData({ collected: true }) } else { //判断当前文章有没有被收藏 const collected = postCollect[this.data._postId]; //直接取反,不要傻乎乎的if else。。。。 postCollect[this.data._postId] = !collected; wx.setStorageSync('post-collects', postCollect) this.setData({ collected: !collected }) } },
2020-10-04
共4条回复

小小祭司

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结果:

    //img.mukewang.com/szimg/5a3b235c0001f9e004340300.jpg

  • 假设先执行var postsCollected = wx.getStorageSync('posts_collected'存在了数据缓存以后,改为postsCollected = {}情况下,onLoad执行完this.setData结果:

    //img.mukewang.com/szimg/5a3b245b0001c99105870133.jpg

  • 即便存在缓存,收藏图片也没有反应过来,因为设置postsCollected = {},获取到的postCollected不存在,所以初始化是默认的不收藏。虽然this.setData没报错,但是AppData中没有collected,说明并没有成功。

    //img.mukewang.com/szimg/5a3b235c0001c65506220328.jpg

  •  而这一切,都发生在unLoad中,也就是页面加载才会调用的方法。


8
0

华灯初上丶

提问者

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

3
1
Allen_Anker
同学想问一下你这个是怎么插入ifelse段里的,我发现了好多问题
2018-05-06
共1条回复

降维

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)

}

},


2
1
黑領針灬紳仕
感谢大佬,你这个else逻辑补足很好用,把collect动作的反选情况考虑进去了
2024-12-11
共1条回复

华灯初上丶

提问者

2017-12-20

各位朋友注意一下,这个地方如果出错,请将23行的老师给的代码替换为24行的代码。原因就是楼上那个大佬说的,postsCollected在23行其实不存在于缓存,所以系统默认为string类型字符串而不是对象,这样你后面对一个字符组赋值数组肯定不对,所以在这一行就将他设置为空对象即可。再次感谢楼上大佬哈!//img.mukewang.com/szimg/5a3a382b00015afa06090289.jpg

2
3
小小祭司
回复
华灯初上丶
不用客气的,大家互相学习,一起加油!
2017-12-21
共3条回复

粽糕里咖

2018-01-21

我也遇到了这个问题.云里雾里.看了2位精彩解答给个赞

原因是因为之前的缓存没有删除,遇到了0,1以外的情况,所以出现了undefined

0
0

微信小程序入门与实战(全新版) 超20000人学习的好课

4年同步微信官方迭代,累计20000+人学习, 比微信官方更火爆!

23960 学习 · 6930 问题

查看课程