localStorage.getItem ( 'item')이 localStorage.item 또는 localStorage [ 'item']보다 나은가요?


84

최근 에 LocalStorage에 대한 질문을했습니다 . 사용 JSON.parse(localStorage.item)JSON.parse(localStorage['item'])반환하기 위해 노력하지 않은 NULL항목이 아직 설정되지 않은 경우.

그러나 JSON.parse(localStorage.getItem('item')작동했습니다. 그리고 그것은 JSON.parse(localStorage.testObject || null)또한 작동합니다.

의견 중 하나는 기본적으로 다음 localStorage.getItem()과 같이 localStorage.setItem()항상 선호해야한다고 말했습니다 .

getter 및 setter는 LS api와 함께 작동하는 일관되고 표준화 된 브라우저 간 호환 방법을 제공하며 항상 다른 방법보다 선호되어야합니다. - 크리스토프

나는 localStorage에 대한 축약 형 점 및 대괄호 표기법을 사용하는 것을 좋아하게되었지만 다른 사람들이 이것을 취하는 것을 알고 싶습니다. localStorage.getItem ( 'item')이 localStorage.item 또는 localStorage [ 'item']보다 낫거나 작동하는 한 속기 표기법이 괜찮습니까?


나는 Christoph가 그의 추론을 아주 분명하게 만들었다 고 믿습니다. getItemsetItem있는 표준화 된 일을하는 방법입니다.
Fabrício Matté 2012 년

1
내가 참조. 이러한 권장 사항을 훑어보기에는 너무 졸리지만이 웹 스토리지 API는 비교적 새롭기 때문에 개인적으로 적절하게 문서화 된 getItem/ setItem방법을 고수 합니다. 나중에 사양을 다시 읽 겠지만, 질문에 대한 유일한 실패 방지 방법은 모든 주요 브라우저에서 테스트를 진행하는 것입니다.
Fabrício Matté 2012 년

4
사양에는 "스토리지 개체에서 지원되는 속성 이름은 현재 개체와 관련된 목록에있는 각 키 / 값 쌍의 키입니다."라고되어 있습니다. localStorage.item그것도 표준화 되지 않습니까?
Barmar

2
@Barmar 조금 늦게 답변했지만이 질문에 대한 속임수를 많이보고 여기로 돌아온 후에는 당신이 절대적으로 옳다고 답할 것입니다. 그러나 이러한 메서드는 개체의 기존 속성과 충돌하지 않으므로 getItem/를 다시 사용하는 것이 좋습니다 . 예 : 작동하지만 localStorage의 메서드를 덮어 씁니다 . jsfiddle.net/DrquYsetItemlocalStoragelocalStorage.setItem('getItem', 'blah'); console.log(localStorage.getItem('getItem'));localStorage.getItem = 'blah';getItem
Fabrício Matté 2013 년

1
나는 여전히 나를 이겼 던 접근 방식을 찬성하는 논쟁을 보지 못했습니다. 하나는 항상 그랬던 것처럼 이름 / 값 쌍을 수행합니다. 다른 하나는 get / set 메서드를 사용할 때 null을 제공합니다. 선택적 값에 대해 null이있는 다른 값 목록과 비교하는 경우 하나는 다른 값보다 더 의미가 있지만 둘 다 사양에있을 때 '선호'한다고 말하는 것은 IMO입니다. 두 가지 접근 방식 모두 이유가 있습니다.
Erik Reppen 2014

답변:


83

직접 속성 액세스 ( localStorage.item또는 localStorage['item'])와 기능 인터페이스 ( localStorage.getItem('item')) 사용 모두 잘 작동합니다. 둘 다 표준이며 브라우저 간 호환됩니다. * 에 따르면 사양 :

Storage 개체에서 지원되는 속성 이름은 키가 저장 영역에 마지막으로 추가 된 순서대로 개체와 연결된 목록에 현재있는 각 키 / 값 쌍의 키입니다.

요청 된 이름을 가진 키 / 값 쌍을 찾을 수없는 경우에만 다르게 작동합니다. 키는 예를 들어, 'item'존재하지 않는 var a = localStorage.item;초래할 것 aundefined동안 var a = localStorage.getItem('item');발생한다 a값을 갖는 null. 당신이 발견 한 것처럼 undefinednull자바 스크립트 / ECMA 스크립트에서 서로 호환되지 않습니다. :)

편집 : Christoph가 답변 에서 지적했듯이 기능 인터페이스는의 사전 정의 된 속성과 동일한 키 아래에서 값을 안정적으로 저장하고 검색하는 유일한 방법입니다 localStorage. (이 여섯이있다 : length, key, setItem, getItem, removeItem,와 clear.) 그래서, 예를 들어, 다음는 항상 일 :

localStorage.setItem('length', 2);
console.log(localStorage.getItem('length'));

특히 첫 번째 문은 속성에 영향을주지 않습니다 localStorage.length( 'length'이미에 키가없는 경우 증가시키는 경우 제외 localStorage). 이 점에서 사양은 내부적으로 일치하지 않는 것 같습니다.

그러나 다음은 원하는 작업을 수행하지 못할 수 있습니다.

localStorage.length = 2;
console.log(localStorage.length);

흥미롭게도 첫 번째는 Chrome에서 작동하지 않지만 Firefox의 기능 호출과 동의어입니다. 두 번째는 항상에있는 키의 수를 기록합니다 localStorage.

* 이것은 처음에 웹 스토리지를 지원하는 브라우저에 해당됩니다. (여기에는 거의 모든 최신 데스크톱 및 모바일 브라우저가 포함됩니다.) 쿠키 또는 기타 기술을 사용하여 로컬 저장소를 시뮬레이션하는 환경의 경우 동작은 사용되는 shim에 따라 다릅니다. 에 대한 여러 polyfill은 여기localStorage 에서 찾을 수 있습니다 .


11

질문은 이미 꽤 오래되었지만 질문에 인용되었으므로 내 진술에 대해 두 단어를 말해야 할 것 같습니다.

저장소 개체는 다소 특별하며 키 / 값 쌍 목록에 대한 액세스를 제공하는 개체입니다. 따라서 일반 객체 나 배열이 아닙니다.

예를 들어, 배열 길이 속성과 달리 읽기 전용이고 스토리지의 키 수를 리턴하는 길이 속성이 있습니다.

어레이를 사용하면 다음을 수행 할 수 있습니다.

var a = [1,2,3,4];
a.length // => 4
a.length = 2;
a // => [1,2]

여기에 게터 / 세터를 사용하는 첫 번째 이유가 있습니다. 라는 항목을 설정하려면 어떻게해야 length합니까?

localStorage.length = "foo";
localStorage.length  // => 0
localStorage.setItem("length","foo");
// the "length" key is now only accessable via the getter method:
localStorage.length  // => 1
localStorage.getItem("length") // => "foo"

Storage 개체의 다른 구성원은 쓰기 가능하고 실수로 .NET과 같은 메서드를 덮어 쓸 수 있기 때문에 훨씬 더 중요 getItem합니다. API 메서드를 사용하면 이러한 가능한 문제를 방지하고 일관된 인터페이스를 제공합니다.

또한 흥미로운 점은 사양의 다음 단락입니다 (제가 강조).

setItem () 및 removeItem () 메서드는 실패와 관련하여 원자 적이어야합니다. 실패한 경우 메서드는 아무 작업도 수행하지 않습니다. 즉, 데이터 저장 영역에 대한 변경이 성공하거나 데이터 저장 영역이 전혀 변경되지 않아야합니다.

이론적으로는 게터 / 세터와 []액세스 사이에 차이가 없어야합니다 .


첫 번째로 JavaScript의 거의 모든 것이 쓰기 가능하며 localStorage API에는 내가 아는 세 가지 속성 만 있습니다. 두 번째로 점 또는 대괄호 표기법을 사용하면 설정 방법에 관계없이 값이 문자열로 자동 변환되므로 동일한 보호 장치를 사용할 수 있기 때문에 일종의 기본 setter 구현에 도달하고 있습니다. 나는 실제로 이전에 클라이언트 측 브라우저 시나리오에서 지속적인 값이 손상되는 것을 들어 본 적이 없습니다. 바닐라 접근 자조차도 일반적으로 일종의 보호 장치가 있다고 생각합니다.
Erik Reppen 2014

이름 충돌에 대한 요점은 훌륭합니다. length속성 (크롬과 파이어 폭스에서 적어도 [*])는 호출하는 경우 변경되지 않습니다 localStorage.setItem("length", something);,하지만 당신은 검색 할 수 있습니다 somethinglocalStorage.getItem("length");. 흥미롭게도 localStorage.length = something;Chrome 에서 할당하는 것은 작동하지 않지만 Firefox something에서는 키 아래에 저장 됩니다 "length"(그런 다음 기능 인터페이스를 사용해서 만 검색 할 수 있음). [*] 사실, Firefox에서는 length"length"가 아직에없는 경우 속성이 변경됩니다 localStorage.
테드 Hopp

@ErikReppen -에 따르면 사양 , localStorage여섯 개 미리 정의 된 특성을 가지고 : length, key, getItem, setItem, removeItem,와 clear.
테드 Hopp

1

나는 그것이 오래된 게시물이라는 것을 알고 있지만 실제로 성능을 언급 한 사람은 아무도 없기 때문에 일부 JsPerf 테스트를 설정하여 벤치마킹하고 일관된 인터페이스가 getItem되었으며 setItem점 표기법이나 대괄호를 사용하는 것보다 지속적으로 빠르며 읽기가 훨씬 쉽습니다.

JsPerf에 대한 내 테스트는 다음과 같습니다.


ur jsPerf는 테스트에 대괄호를 포함하지 않았습니다. 나는 그들을 추가하고 몇 가지 테스트를 실행했으며 성능은 브라우저 기반입니다. 크롬과 파이어 폭스에 모두, getItemsetItem점은 크롬에서 가장 빠른있는 브래킷 파이어 폭스에서 가장 빠른 되 고, 각 카테고리에서 가장 느린했다. 나는 또한 '훨씬 더 읽기 쉽다'는 것은 전적으로 주관적이라고 생각합니다 ... 예, 그 기능을 설명하지만 객체 또는 배열 변수로 작업 한 적이있는 사람은 점 / 대괄호에서 일어나는 일을 0.5 초 만에 알 수 있습니다.
PlantTheIdea

당신 말이 맞습니다. 그 테스트를 작성하는 시점에서 게터와 세터는 점 표기법보다 일관되게 빠릅니다. 더 이상 그렇지 않습니다. 5 분이되면 돌아와서이 답변을 업데이트하겠습니다. 지적 해 주셔서 감사합니다.
Dave Mackintosh 2013

0

언급했듯이 존재하지 않는 키를 제외하고는 거의 차이가 없습니다. 성능 차이는 변화 하는 브라우저 / OS는 사용중인에 따라 달라집니다. 그러나 그것은 실제로 그렇게 다르지 않습니다.

권장되는 사용 방법이기 때문에 표준 인터페이스를 사용하는 것이 좋습니다.


"표준 인터페이스 사용을 권장합니다" -두 인터페이스 모두 표준에 지정되어 있습니다.
Ted Hopp 2014

@TedHopp 나는 setItem과 getItem 만 표준에 지정되어 있다고 생각합니다 .
Salvador Dali

2
반대로. 표준 : "스토리지 개체에서 지원되는 속성 이름은 키가 스토리지 영역에 마지막으로 추가 된 순서대로 개체와 관련된 목록에 현재 존재하는 각 키 / 값 쌍의 키입니다."
Ted Hopp 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.