วิธีการตรวจสอบว่ามีการตั้งค่ารายการที่จัดเก็บ?


288

ฉันจะตรวจสอบว่ารายการถูกตั้งค่าได้localStorageอย่างไร? ขณะนี้ฉันกำลังใช้

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

2
ดูเหมือนว่าคุณจะมีปัญหาโดยไม่มีการเก็บข้อมูล mutex
4esn0k

คำตอบ:


509

getItemวิธีการในสเปค WebStorage ที่ชัดเจนส่งกลับnullถ้ารายการไม่มีอยู่:

... หากคีย์ที่ระบุไม่มีอยู่ในรายการที่เกี่ยวข้องกับวัตถุวิธีการนี้จะต้องส่งคืน null ...

คุณสามารถ:

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

ดูคำถามที่เกี่ยวข้องนี้:


1
คุณสามารถเพิ่มวิธีการของคุณเองlocalStorageเพื่อห่อหุ้มการทดสอบเล็กน้อยนี้ได้หรือไม่? เช่นlocalStorage.hasItem("infiniteScrollEnabled")?
Paul D. Waite

4
@ พอล: ใช่คุณสามารถเพิ่มStorage.prototypeวัตถุได้ แต่ตามกฎทั่วไปฉันขอแนะนำเสมอว่าอย่าแก้ไขวัตถุที่คุณไม่ได้เป็นเจ้าของโดยเฉพาะโฮสต์วัตถุ
CMS

โอ้ใช่แล้วคะแนนที่ดีอยู่ในนั้น มาจากพื้นหลัง CSS ความคิดที่ว่าฉันสามารถแก้ไขปัญหาเกี่ยวกับเบราว์เซอร์ของตัวเองได้นั้นเป็นเรื่องที่น่าตื่นเต้น แต่ฉันเห็นได้ว่าการล้อเล่นกับวัตถุของเบราว์เซอร์อาจสร้างความสับสนได้อย่างไร
Paul D. Waite

5
หมายเหตุไม่ถูกต้อง - รุ่นปัจจุบันของอินเตอร์เฟซกล่าวว่าเฉพาะค่าเป็นประเภท Storage w3.org/TR/webstorage/#the-storage-interfaceDOMString
Alnitak

1
ลบโน้ตแล้ว ขอบคุณ @TimothyZorn และ Alnitak
CMS

46

คุณสามารถใช้hasOwnPropertyวิธีการตรวจสอบนี้

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

ใช้งานได้ใน Chrome รุ่นปัจจุบัน (Mac), Firefox (Mac) และ Safari


2
ควรเป็นคำตอบที่ยอมรับได้ หนึ่งที่ยอมรับจะพิจารณาค่า "โมฆะ" ที่เก็บไว้เป็นไม่ได้ตั้งค่าซึ่งเป็นสิ่งที่ผิด
Flavien Volken

9
@FlavienVolken คุณไม่สามารถมีnullค่าที่เก็บไว้ได้ คุณสามารถมี"null"แต่รหัสที่นั่นจะไม่ทำงานผิดปกติในขณะที่รหัสนี้จะล้มเหลวในlengthคีย์
Kaiido

1
@Kaiido คุณพูดถูกฉันมีพฤติกรรมนี้เพราะฉันแยกวิเคราะห์ข้อมูลที่เก็บไว้โดยตรงและเนื่องจากJSON.parse("null") === JSON.parse(null)มีการชนกัน
Flavien Volken

3
มีข้อผิดพลาด ESLint ต่อไปนี้: "อย่าเข้าถึงวิธี Object.prototype 'hasOwnProperty' จากเป้าหมาย object.eslint (ไม่มีตัวต้นแบบต้นแบบ)"
rfdc

สิ่งนี้จะไม่ทำงานหากไม่ได้ตั้งค่า foo ให้กับการโหลดหน้าเว็บและคุณต้องการทำบางสิ่งกับ foo ฉันคิดว่านั่นเป็นสิ่งที่ผู้ถามถามคุณต้องการตรวจสอบว่ามีกุญแจfooอยู่หรือไม่ถ้า foo มีค่า ฉันมีสถานการณ์นี้ที่เหตุการณ์การคลิกทริกเกอร์.setitemด้วยตรรกะที่อยู่รอบ ๆ getItem แต่มันจะไม่ทำงานจนกว่าฉันจะตั้งค่าและฉันไม่สามารถ setItem จนกว่าฉันจะรู้สถานะของ foo (ค่า 1 หรือค่า 2) กล่าวอีกนัยหนึ่งให้ตรวจสอบ foo จากนั้นตั้งค่าเป็น value1 หากไม่ได้โดยไม่ตั้งใจเขียนทับค่า 2
Rin และ Len

22

วิธีที่สั้นที่สุดคือการใช้ค่าเริ่มต้นหากคีย์ไม่ได้อยู่ในที่เก็บข้อมูล:

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

4

คุณสามารถลองทำสิ่งนี้ได้หากต้องการตรวจสอบ undefined:

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

getItem เป็นวิธีการส่งคืนค่า null หากไม่พบค่า


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

หรือ

var secret =  localStorage.hash || 42;

JavaScript ส่งคืนค่าแรกที่ไม่ใช่ค่า null หรือค่าบวกตัวอย่าง: [null || "abc"] จะกลับมา "abc" [2 || 5] จะกลับมา 2 [0 || 5] จะส่งคืน 5 [1 || 5] จะส่งคืน 1 เป็นต้นดังนั้นโค้ดด้านบนจึงใช้งานได้
Deepak Thomas

2

สำหรับ TRUE

localStorage.infiniteScrollEnabled = 1;

สำหรับเท็จ

localStorage.removeItem("infiniteScrollEnabled")

ตรวจสอบการดำรงอยู่

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

1

คุณควรตรวจสอบประเภทของรายการใน 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

หนึ่งจะทดสอบการมีอยู่ของรายการได้localStorageอย่างไร? วิธีนี้ใช้ได้กับ internet explorer

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

2
ไม่ควรแน่นอน; getItem ส่งคืนค่า null สำหรับคีย์ที่ไม่มีอยู่
EricLaw

ฉันมีปัญหาเดียวกันกับ IE และนี่คือการแก้ไขสำหรับมัน ++
edencorbin

คุณควรtry | catchแยกวิเคราะห์รายการอย่างแน่นอน
Abdul Sadik Yalcin

0
localStorage['root2']=null;

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

อาจดีกว่าที่จะสแกนแผนหรือไม่

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

0

วิธีที่ดีที่สุดและปลอดภัยที่สุดที่ฉันสามารถแนะนำคือ

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

สิ่งนี้ผ่านno-prototype-builtinsกฎของ ESLint


0

ฉันใช้ในโครงการและทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

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

วิธีที่ง่ายขึ้นคือ

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

มันทำงานอย่างไร

เมื่อคุณเรียกใช้ localStorage.test ในครั้งแรกมันจะไม่มีที่เก็บใด ๆ ลงในอ็อบเจ็กต์ localStorage ดังนั้นมันจะส่งกลับทริกเกอร์เงื่อนไขที่ไม่ได้กำหนดไว้ หลังจากนั้นฉันก็เรียกใช้การตั้งค่าตัวแปรใหม่และตรวจสอบอีกครั้งว่ามีข้อมูลดังนั้นมันจึงส่งกลับข้อมูลที่มีจริงในถ้าเงื่อนไข


-2

ลองรหัสนี้

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

} else {

}

ทำหรือไม่ทำ ไม่มี "ลอง" คำตอบที่ดีมักจะมีคำอธิบายของสิ่งที่ทำและทำไมมันก็ทำในลักษณะดังกล่าวไม่เพียง แต่สำหรับ OP แต่สำหรับผู้เข้าชมในอนาคตที่จะ SO
Jay Blanchard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.