Làm cách nào để kiểm tra xem mục Lưu trữ có được đặt không?


288

Làm thế nào tôi có thể kiểm tra nếu một mục được thiết lập localStorage? Hiện tại tôi đang sử dụng

if (!(localStorage.getItem("infiniteScrollEnabled") == true || localStorage.getItem("infiniteScrollEnabled") == false)) {
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}

2
dường như, bạn sẽ gặp vấn đề nếu không có mutex lưu trữ
4esn0k

Câu trả lời:


506

Các getItemphương pháp trong đặc tả WebStorage, dứt khoát trả nullnếu mục không tồn tại:

... Nếu khóa đã cho không tồn tại trong danh sách được liên kết với đối tượng thì phương thức này phải trả về null. ...

Vì vậy, bạn có thể:

if (localStorage.getItem("infiniteScrollEnabled") === null) {
  //...
}

Xem câu hỏi liên quan này:


1
Bạn có thể thêm phương pháp của riêng bạn localStorageđể đóng gói bài kiểm tra nhỏ này không? Ví dụ localStorage.hasItem("infiniteScrollEnabled")?
Paul D. Chờ

4
@Paul: Có, bạn thậm chí có thể tăng Storage.prototypeđối tượng, nhưng theo nguyên tắc thông thường, tôi luôn khuyên bạn không nên sửa đổi các đối tượng bạn không sở hữu , các đối tượng lưu trữ đặc biệt.
CMS

ooh yeah, điểm tốt trong đó. Xuất phát từ nền tảng CSS, ý tưởng rằng tôi có thể tự khắc phục các sự cố của trình duyệt rất thú vị, nhưng tôi có thể thấy cách thức lén lút với các đối tượng của trình duyệt có thể gây nhầm lẫn.
Paul D. Chờ

5
Ghi chú không chính xác - phiên bản hiện tại của Storagegiao diện nói cụ thể rằng các giá trị là loại DOMString. w3.org/TR/webst Storage /
Alnitak

1
Lưu ý loại bỏ. Cảm ơn @TimothyZorn và Alnitak
CMS

45

Bạn có thể sử dụng hasOwnPropertyphương pháp để kiểm tra điều này

> localStorage.setItem('foo', 123)
undefined
> localStorage.hasOwnProperty('foo')
true
> localStorage.hasOwnProperty('bar')
false

Hoạt động trong các phiên bản hiện tại của Chrome (Mac), Firefox (Mac) và Safari.


2
Nó nên là câu trả lời được chấp nhận. Người được chấp nhận sẽ coi giá trị "null" được lưu trữ là không được đặt, điều này là sai.
Flavien Volken

9
@FlavienVolken Bạn không thể có một nullgiá trị được lưu trữ mặc dù. Bạn có thể có "null", nhưng mã ở đó sẽ không hoạt động sai trên nó, trong khi mã này sẽ bị lỗi trên lengthkhóa.
Kaiido

1
@Kaiido bạn nói đúng, tôi đã có hành vi này vì tôi đã trực tiếp phân tích cú pháp dữ liệu được lưu trữ và vì JSON.parse("null") === JSON.parse(null)tôi đã va chạm.
Flavien Volken

3
Đã gặp lỗi ESLint sau: "Không truy cập phương thức Object.prototype 'hasOwnProperty' từ đối tượng đích.eslint (không có nguyên mẫu-dựng sẵn)"
rfdc

Điều này sẽ không hoạt động nếu foo không được đặt khi tải trang và bạn muốn làm gì đó với foo. Tôi nghĩ đó là những gì người hỏi đang nhận được, bạn muốn kiểm tra xem khóa foocó tồn tại không, nếu foo có giá trị. Tôi gặp tình huống này, trong đó một sự kiện nhấp chuột kích hoạt .setitemlogic dựa trên getItem, nhưng nó sẽ không hoạt động cho đến khi tôi đặtItem và tôi không thể thiết lập cho đến khi tôi biết trạng thái của foo (value1 hoặc value2). Nói cách khác, kiểm tra foo exits sau đó đặt nó thành value1 nếu nó không vô tình ghi đè value2.
Rin và Len

22

Cách ngắn nhất là sử dụng giá trị mặc định, nếu khóa không có trong bộ lưu trữ:

var sValue = localStorage['my.token'] || ''; /* for strings */
var iValue = localStorage['my.token'] || 0; /* for integers */

4

Bạn cũng có thể thử điều này nếu bạn muốn kiểm tra không xác định:

if (localStorage.user === undefined) {
    localStorage.user = "username";
}

getItem là một phương thức trả về null nếu không tìm thấy giá trị.


3
if(!localStorage.hash) localStorage.hash = "thinkdj";

Hoặc là

var secret =  localStorage.hash || 42;

JavaScript trả về giá trị dương hoặc giá trị dương đầu tiên Ví dụ: [null || "abc"] sẽ trả về "abc" [2 || 5] sẽ trả về 2 [0 || 5] sẽ trả lại 5 [1 || 5] sẽ trả về 1, do đó đoạn mã trên hoạt động.
Deepak Thomas

2

ĐÚNG

localStorage.infiniteScrollEnabled = 1;

CHO SAU

localStorage.removeItem("infiniteScrollEnabled")

KIỂM TRA KIỂM TRA

if (localStorage[""infiniteScrollEnabled""]) {
  //CODE IF ENABLED
}

1

Bạn nên kiểm tra loại vật phẩm trong localStorage

if(localStorage.token !== null) {
   // this will only work if the token is set in the localStorage
}

if(typeof localStorage.token !== 'undefined') {
  // do something with token
}

if(typeof localStorage.token === 'undefined') {
  // token doesn't exist in the localStorage, maybe set it?
}

1

Làm thế nào có thể kiểm tra sự tồn tại của một mặt hàng trong localStorage? phương pháp này hoạt động trong internet explorer.

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>

2
Nó chắc chắn không nên; getItem chỉ trả về null cho các khóa không tồn tại.
EricLaw

Tôi đã gặp vấn đề tương tự với IE và đây là cách khắc phục, ++
edencorbin

Bạn chắc chắn nên try | catchphân tích các mục.
Abdul Sadik Yalcin

0
localStorage['root2']=null;

localStorage.getItem("root2") === null //false

Có lẽ tốt hơn để làm một kế hoạch quét?

localStorage['root1']=187;
187
'root1' in localStorage
true

0

Cách tốt nhất và an toàn nhất tôi có thể đề xuất là đây,

if(Object.prototype.hasOwnProperty.call(localStorage, 'infiniteScrollEnabled')){
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}

Điều này thông qua no-prototype-builtinsquy tắc của ESLint .


0

Tôi đã sử dụng trong dự án của tôi và làm việc hoàn hảo cho tôi

var returnObjName= JSON.parse(localStorage.getItem('ObjName'));
if(returnObjName && Object.keys(returnObjName).length > 0){
   //Exist data in local storage
}else{
  //Non Exist data block
}

0

cách dễ dàng là

if(localStorage.test){
console.log("now defined");
}
else{
console.log("undefined");
localStorage.test="defined;"
}

Làm thế nào nó hoạt động

khi bạn gọi localStorage.test lần đầu tiên, nó không chứa bất kỳ cửa hàng nào vào đối tượng localStorage để nó trả về các kích hoạt điều kiện khác không xác định. Sau khi kích hoạt, tôi đặt biến mới và kiểm tra lại nó có chứa dữ liệu để nó trả về dữ liệu với true trong điều kiện if


-2

Hãy thử mã này

if (localStorage.getItem("infiniteScrollEnabled") === null) {

} else {

}

Làm hoặc làm không. Không có "thử". Một câu trả lời hay sẽ luôn có lời giải thích về những gì đã được thực hiện và tại sao nó được thực hiện theo cách như vậy, không chỉ cho OP mà còn cho những khách truy cập tương lai đến SO.
Jay Blanchard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.