意外的标记:u JSON.parse()问题

18

我在网上读到意外的令牌“u”问题可能是由于使用JSON.parse()造成的。我的iPhone 5没有问题,但我的Nexus 7上出现了一系列错误:

enter image description here 查看大图

我意识到这是重复的问题,但我不确定如何解决我的具体问题。以下是我实现JSON.parse()的地方。

 $scope.fav = []; 

if ($scope.fav !== 'undefined') {
   $scope.fav = JSON.parse(localStorage["fav"]);
}

1
我认为一个好的第一步是 console.log(localStorage["fav"]),然后看看在 Nexus 上它给了你什么。 - ivarni
2
你能在 JSON.parse 之前展示一下 console.log(typeof localStorage["fav"]);console.log(typeof JSON.stringify($scope.fav)); 的输出吗?它们不应该是 undefined,但可能存在 localStorage(例如数据过大)或 JSON.stringify 的问题。Unexpected token u 表示它是 undefined - t.niese
addToFav函数只有在按钮点击时才会被调用。这些按钮不会出现在Nexus上,只会出现在iPhone上。我应该在那里看到输出吗? - benjipelletier
由于您的Nexus上没有调用addToFav,因此错误很可能发生在另一个地方,您确定您发布的代码是出错的代码吗?或者我误解了您的评论?如果那里没有错误,显示iPhone的输出将没有意义。 - t.niese
@t.niese 抱歉,问题出现的地方不对。我已经更新了问题,并附上了在设备加载时调用的代码。现在回想起来,我相信主要问题是由于JSON.parse(localStorage["fav"])没有任何值,因为这是我在这个Nexus上第一次加载应用程序。在此之前,数据始终存储在iPhone上。我认为术语“未定义”在这里是不正确的,因为它在前一行中被定义了。 - benjipelletier
4个回答

20

根据您更新后的问题,if条件并没有意义,因为您在之前将$scope.fav设置为[],所以它永远不可能是"undefined"

最有可能的情况是您想这样测试:

if (typeof localStorage["fav"] !== "undefined") {
  $scope.fav = JSON.parse(localStorage["fav"]);
}

因为我不知道localStorage["fav"]是否可能包含字符串"undefined",所以你可能也需要测试这种情况。

if (typeof localStorage["fav"] !== "undefined"
    && localStorage["fav"] !== "undefined") {
  $scope.fav = JSON.parse(localStorage["fav"]);
}

嗨,谢谢。那就是我一直在寻找的解决方案。我只是进行这个测试,以确保如果 fav 中有先前的值,则它们会在每次加载时保留在那里。 - benjipelletier
我刚刚发现我的代码也有类似的错误。检查typeof "undefined"和字符串"undefined"都是我的解决方案。确定"undefined"是如何设置的又是另一个错误 :) 谢谢t.niese! - jjwdesign

12

避免该错误的一种方法(并非真正修复它,但至少不会破坏):

$scope.fav = JSON.parse(localStorage["fav"] || '[]');

你之所以会得到这个错误,是因为localStorage["fav"]的值是undefined

试一下这个方法,你就可以自己理解:

var a = undefined;
JSON.parse(a);

如果给定的代码中 $scope.fav 从未为 "undefined",那么 if ($scope.fav !== 'undefined') 就是无用的。因此,要么将其删除并仅使用 localStorage["fav"] || '{}',要么将测试移动到 if 条件中。 - t.niese
好的,我只是修复了一个出错的代码行,而不是他的整个代码 :) - avetisk
但是你说得对,我应该提供一个干净的代码作为例子。更改已完成 :) - avetisk

5

Unexpected token: u 几乎总是由于尝试解析一个值为 undefined 的情况而产生。

您可以使用以下方式防范:

if (localStorage['fav']) {
  $scope.fav = JSON.parse(localStorage['fav'];
}

0
在我的情况下,问题是我获取的值为localStorage.getItem[key],而应该是localStorage.getItem(key)
其余通常遇到的问题已经被上面的答案更好地解释了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接