2015-04-08 40 views
7

Thời gian qua tôi đã kiểm tra, hai dòng sau trở true:Tại sao localStorage ["..."] không xác định, nhưng localStorage.getItem ("...") là null?

null == localStorage["foo"]; 
null == localStorage.getItem("foo"); 

Tương tự áp dụng khi thay thế null với undefined. Vì vậy, câu hỏi đầu tiên là, tại sao có hai cách để giải quyết localStorage? Và tại sao

localStorage["foo"] 

trở undefined khi

localStorage.getItem("foo") 

lợi nhuận null?

Tôi có cần phải quan tâm đến điều đó khi phát triển JS không?

+0

Ah, niềm vui của Javascript. –

+1

@RobertHarvey ngôn ngữ là tốt, đó là các biến thể thực hiện mà giết nó: ( – Alnitak

+1

Đương nhiên, cho dù nó trả về 'undefined' hoặc' null', bạn sẽ vẫn phải đối phó với nó.Tại sao không chỉ kiểm tra cả hai? Xem thêm http://programmers.stackexchange.com/a/268125 –

Trả lời

5

Web Storage Specification requires rằng .getItem() trả lại null cho một khóa không xác định.

Lưu ý tuy nhiên đó .getItem().setItem() được định nghĩa cụ thể trong IDL như đang được các định gettersetter cho giao diện Storage, và do đó họ cũng đang hỗ trợ đầy đủ cách để truy cập vào các nội dung của lưu trữ.

Tuy nhiên cú pháp [] giống với cú pháp đối tượng bình thường và/hoặc thuộc tính mảng và giống như trả về undefined cho tên thuộc tính không xác định.

Lý do không sử dụng [] cú pháp là nó sẽ hoạt động trên tài sản đối tượng đầu tiên và sẽ khá vui vẻ cho phép bạn ghi đè lên các thuộc tính thực tế và phương pháp của localStorage đối tượng, cf:

> localStorage['getItem'] = function() { return 0 } 
> localStorage.getItem('getItem') 
0 
+0

Câu lệnh cuối cùng về việc ghi đè các thuộc tính localStorage "thực" có còn được áp dụng không? Tính đến hôm nay, tôi đã không thể tái tạo (trong phiên bản phát triển của Firefox). Việc thực thi mã của bạn cho tôi hàm '"() {return 0} "'. – jaySon

+0

@jaySon Trên Chrome hiện tại (51.0.2704.79), nó vẫn trả về 0. – Alnitak

+0

@jaySon và vẫn giữ nguyên với Chrome 55.0.2883.95 – Alnitak

2

localStorage["..."] là sử dụng không hợp lệ localstorage. Bạn đang cố truy cập các phương thức của đối tượng localstorage, thay vì truy cập cơ sở dữ liệu thực.

Bạn phải sử dụng

localStorage.getItem("...") 

localStorage.setItem("...") 

phương pháp để truy cập vào cơ sở dữ liệu lưu trữ.

+0

Ah, phải. Điều đó có ý nghĩa. –

+1

Nhưng bạn có thể "sử dụng chéo" cả hai cú pháp. Cài đặt một cái gì đó bằng cách sử dụng 'setItem()' và nhận nó bằng cách sử dụng '[]' hoạt động tốt như cách khác. – jaySon

+2

thực sự - trên Chrome của tôi (41?) Các phím hiện tại tất cả xuất hiện trong 'Object.keys (localStorage)'. '.getItem' rõ ràng là an toàn hơn, nhưng khó có thể cho rằng phương thức' [] 'là _invalid_. – Alnitak

1

Trong javascript bạn luôn nhận được giá trị undefined cho các khóa không tồn tại bên trong một đối tượng.

a = {}; //new object 
alert(a["test"]); // you get 'undefined' because "test" keys is not found 

Trong localStorage .getItem là một phương pháp ai làm phím kiểm tra bên trong đối tượng localStorage và trả null nếu không tìm thấy.

Đừng đổ lỗi cho javascript, đó chỉ là hành vi đối tượng localStorage

Các vấn đề liên quan