请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

https://img1.sycdn.imooc.com//szimg/5a32470e0001016706600191.jpg

https://img1.sycdn.imooc.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 ''


谢谢,非常感谢!!!

18202
收起

正在回答

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了。


7 回复 有任何疑惑可以回复我~
  • 提问者 华灯初上丶 #1
    大哥太厉害了,完美解决。看到这一大段字眼泪都下来了,太感动啦,谢谢!
    回复 有任何疑惑可以回复我~ 2017-12-20 17:45:54
  • 提问者 华灯初上丶 #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-12-20 17:56:40
  • 您看看我改的else逻辑对不对呢?
      if (postsCollected) {
          var postCollected = postsCollected[postId];
          this.setData({
            collected: postCollected
          })
        }
        else {
          var postsCollected = {};
          postsCollected[postId] = false;
          wx.setStorageSync('posts_collected', postCollected);
        }
    回复 有任何疑惑可以回复我~ 2018-05-06 22:26:15
小小祭司 2017-12-21 11:03:46

你好,请不要把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结果:

    https://img1.sycdn.imooc.com//szimg/5a3b235c0001f9e004340300.jpg

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

    https://img1.sycdn.imooc.com//szimg/5a3b245b0001c99105870133.jpg

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

    https://img1.sycdn.imooc.com//szimg/5a3b235c0001c65506220328.jpg

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


8 回复 有任何疑惑可以回复我~
提问者 华灯初上丶 2017-12-21 16:50:06

#错误原因: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 回复 有任何疑惑可以回复我~
  • 同学想问一下你这个是怎么插入ifelse段里的,我发现了好多问题
    回复 有任何疑惑可以回复我~ 2018-05-06 22:43:11
降维 2021-02-15 05:08:41

终于搞定,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 回复 有任何疑惑可以回复我~
  • 感谢大佬,你这个else逻辑补足很好用,把collect动作的反选情况考虑进去了
    回复 有任何疑惑可以回复我~ 6天前
提问者 华灯初上丶 2017-12-20 18:15:11

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

2 回复 有任何疑惑可以回复我~
  • 你好,请看下后续补充回答哈。不请自来,勿怪哈哈哈哈哈~
    回复 有任何疑惑可以回复我~ 2017-12-21 11:06:01
  • 提问者 华灯初上丶 #2
    谢谢指点,我是新手,起初不太理解,只想着程序正常运行就好没有想太多,看了老哥回答以后真的汗颜,没想到老哥想得这么透彻,暂时还不能完全看懂,但会一直慢慢琢磨,在这种课程里面碰到这么多热心大神,幸甚!
    回复 有任何疑惑可以回复我~ 2017-12-21 11:45:26
  • 小小祭司 回复 提问者 华灯初上丶 #3
    不用客气的,大家互相学习,一起加油!
    回复 有任何疑惑可以回复我~ 2017-12-21 12:41:17
粽糕里咖 2018-01-21 23:32:24

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

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信