Javascript Array.push不适用于本地存储

Javascript Array.push不适用于本地存储,javascript,jquery,arrays,Javascript,Jquery,Arrays,我正在创建一个购物车,用户可以在其中添加项目到购物车。用户单击addtocart按钮后,我想将产品id、名称、价格和数量保存到本地存储,然后在购物车页面上检索它们。所以我试过这个 var cart = new Array; if (cart != []) { cart = JSON.parse(localStorage["cart"]); } $('#addtocart').on('click', function(e) { var qty = do

我正在创建一个购物车,用户可以在其中添加项目到购物车。用户单击addtocart按钮后,我想将产品id、名称、价格和数量保存到本地存储,然后在购物车页面上检索它们。所以我试过这个

  var cart = new Array;

    if (cart != []) {
        cart = JSON.parse(localStorage["cart"]);
    }

  $('#addtocart').on('click', function(e) {

var qty = document.getElementById("p-qty").value;
var li = $(this).parent();


var product = {};
product.id = productid;
product.name = document.getElementById("nomenclature").innerHTML;
product.price = document.getElementById("productprice").innerHTML;
product.quantity = qty;

addToCart(product);
});


 function addToCart(product) {
// Retrieve the cart object from local storage
if (localStorage) {
    var cart = JSON.parse(localStorage['cart']);            

    cart.push(product);

    localStorage.setItem('cart', JSON.stringify(cart));
}

// window.location = "html/cart.html"   
}
但我总是犯这个错误

未捕获类型错误:cart.push不是函数


我做错了什么?我该如何修复它?

现在,对于您的编辑,这里的问题是,这毫无意义。首先,将数组设置为空,因此它将始终为空。第二个问题是[]永远不会等于新数组,所以它将始终进入if语句。而且,由于您可能从未将localStorage[cart]设置为任何内容,因此它将无效

var cart = new Array;  // <-- you define an array?
if (cart != []) {  // <- than you check the array you just created? How would it have a value if this check would actually work?
    cart = JSON.parse(localStorage["cart"]);
}
或者另一种方式可能是

var cart = JSON.parse(localStorage['cart'] || '[]');   

现在你的编辑,你这里的问题是,这是没有意义的。首先,将数组设置为空,因此它将始终为空。第二个问题是[]永远不会等于新数组,所以它将始终进入if语句。而且,由于您可能从未将localStorage[cart]设置为任何内容,因此它将无效

var cart = new Array;  // <-- you define an array?
if (cart != []) {  // <- than you check the array you just created? How would it have a value if this check would actually work?
    cart = JSON.parse(localStorage["cart"]);
}
或者另一种方式可能是

var cart = JSON.parse(localStorage['cart'] || '[]');   

您不检查是否定义了localStorage['cart'],也不检查反序列化变量是否为数组。我建议这样做:

function addToCart(product) {
    if (localStorage) {
        var cart;
        if (!localStorage['cart']) cart = [];
        else cart = JSON.parse(localStorage['cart']);            
        if (!(cart instanceof Array)) cart = [];
        cart.push(product);

        localStorage.setItem('cart', JSON.stringify(cart));
    } 
}

但是,请注意,如果在localStorage['cart']中有一个序列化对象或其他非数组变量,它将被此方法覆盖。

您不检查localStorage['cart']是否已定义,也不检查反序列化变量是否为数组。我建议这样做:

function addToCart(product) {
    if (localStorage) {
        var cart;
        if (!localStorage['cart']) cart = [];
        else cart = JSON.parse(localStorage['cart']);            
        if (!(cart instanceof Array)) cart = [];
        cart.push(product);

        localStorage.setItem('cart', JSON.stringify(cart));
    } 
}
但是请注意,如果您在localStorage['cart']中有一个序列化对象或其他非数组变量,它将被此方法覆盖。

HTML5中的localStorage是对象,您可以使用.setItem和.getItem设置项

演示使用localStorage获取旧值、推送新值和保存值


    var Values = [];

    //get olds values
    Values = JSON.parse(localStorage.getItem('Storage')); 

    //push new value
    Values.push(item);

    //saved values
    localStorage.setItem('Storage', JSON.stringify(Values));
HTML5中的localStorage是对象,您可以使用.setItem和.getItem设置项

演示使用localStorage获取旧值、推送新值和保存值


    var Values = [];

    //get olds values
    Values = JSON.parse(localStorage.getItem('Storage')); 

    //push new value
    Values.push(item);

    //saved values
    localStorage.setItem('Storage', JSON.stringify(Values));

cart是一个对象还是一个数组?@OmarEinea我希望它是一个数组,这样我就可以将其他数组推到它身上。我希望它是一个数组,你想要的和它实际是什么是两个不同的东西。让我们从它是什么开始,然后看看我们是否可以帮助你使它成为你想要的。那么现在的购物车是什么类型的呢?如果您不确定,只需将localStorage['cart']的内容粘贴到您的问题中,我们将为您解决。只需执行console.loglocalStorage['cart'],然后将其复制并粘贴到问题中。那么,首先在何处使用数组创建localstorage键呢?或者你认为Suminigit会知道这是一个数组吗?@chris但他使用了JSON.stringify和JSON.parse,不是吗?对不起,我没有明白你的意思。cart是一个对象还是一个数组?@OmarEinea我希望它是一个数组,这样我就可以把其他数组推到它身上。我希望它是一个数组,你想要的和它实际上是两个不同的东西。让我们从它是什么开始,然后看看我们是否可以帮助你使它成为你想要的。那么现在的购物车是什么类型的呢?如果您不确定,只需将localStorage['cart']的内容粘贴到您的问题中,我们将为您解决。只需执行console.loglocalStorage['cart'],然后将其复制并粘贴到问题中。那么,首先在何处使用数组创建localstorage键呢?或者你认为Suminigit会知道这是一个数组吗?@chris但他使用了JSON.stringify和JSON.parse,不是吗?对不起,我没有领会你的意思。这不是问题的答案/解决办法。这只是另一种做事的方式。我不知道为什么投票率会上升。您还可以执行localStorage.Storage=test;var test=localStorage.Storage;。我觉得这样更好;。你的答案与OPs代码的问题完全相同。这不是问题的答案/解决方案。这只是另一种做事的方式。我不知道为什么投票率会上升。您还可以执行localStorage.Storage=test;var test=localStorage.Storage;。我觉得这样更好;。你的答案和OPs密码的问题是一样的。我更新了我的答案,答案是正确的。。。。你的逻辑被改变了。我更新了我的答案,这是正确的猜测。。。。你的逻辑被改变了。