[javascript] LocalStorage에서 부울 값을 설정할 수 없습니까?

에서 부울 값을 설정할 수 없다는 것을 알았습니다 localStorage.

localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));

true | false테스트하려고 할 때 항상 경고 가 localStorage.getItem("item1") == "true"true로 표시됩니다. 항목 localStorage을 true로 설정하려면 어떻게 해야합니까?

문자열 이어도 ===타입 만 체크 할 줄 알았는데 ?

그래서

alert("true" == true); // should be true? 



답변

Firefox의 저장소 구현은 문자열 만 저장할 수 있지만 2009 년 9 월 W3C는 모든 데이터를 수용하도록 초안을 수정했습니다.(여전히) 구현이 아직 잡히지 않았습니다.( 아래 편집 참조 ).

따라서 귀하의 경우 부울은 문자열로 변환됩니다.

이유 는 MDC 의 Equal ( ) 설명에"true" != true 쓰여진대로 * :==

두 피연산자가 동일한 유형이 아닌 경우 JavaScript는 피연산자를 변환 한 다음 엄격한 비교를 적용합니다. 피연산자가 숫자 또는 부울이면 피연산자는 가능한 경우 숫자 로 변환됩니다 . 그렇지 않으면 피연산자 중 하나가 문자열이면 다른 피연산자는 가능한 경우 문자열로 변환됩니다.

문자열은 부울 대신 숫자 로 변환됩니다 . 이후 의 숫자입니다 변환 , 그렇게 아무것도 동일하지 않습니다 반환됩니다."true"NaNfalse

(* : 실제 표준은 ECMA-262 §11.9.3“The Abstract Equality Comparison Algorithm”참조)


편집 :setItem 인터페이스 만에 문자열을 받아 복귀 한 2011 9 월 1 차 초안을 업체 중 어느 것도 저장되지 않은 문자열을 지원에 관심이없는 한, 기존의 구현의 동작을 일치하도록. 자세한 내용은 https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 을 참조 하십시오 .


답변

현재 Safari , WebKit, Chrome, FirefoxIE의 모든 구현 은 이전 버전 의 WebStorage 표준을 따르고 있으며 저장소 항목의 값은 문자열 일 수 있습니다.

옵션은 JSON parsestringify메서드 를 사용 하여 데이터 를 직렬화역 직렬화 하는 것 입니다. 예를 들어 다음 과 같이 얼마 전에 다른 질문 에서 제안했습니다 .

var value = "true";
JSON.parse(value) === true; // true


답변

내 솔루션 :

function tytPreGetBool(pre) {
    return localStorage.getItem(pre) === 'true';
}


답변

이것은 CMS의 답변과 관련이 있습니다.

다음은이 문제의 구문 분석 부분을 처리하기 위해 사용했던 작은 함수입니다 (브라우저 구현이 사양을 따라 잡은 후에도 함수는 계속 올바른 작업을 수행하므로 나중에 코드를 변경하는 것을 기억할 필요가 없습니다).

function parse(type) {
   return typeof type == 'string' ? JSON.parse(type) : type;
}


답변

store.js 사용 :

localStorage.setItem('isUser', true)
localStorage.getItem('isUser') === "true" //true
npm i -D store

store.get('isUser')  //true


답변

LocalStorage가 부울 값을 저장할 수 있는지 확실하지 않지만 alert("true" == true);문자열을 부울과 암시 적으로 비교하기 때문에 그렇게 할 때 true로 평가되지 않는다고 말할 수 있습니다 . 그렇기 때문에 true대신 사용 하는 부울 값을 설정해야합니다 "true".


답변

eval경우에 따라 신중하게 사용할 수도 있습니다 .

console.log(eval("true") === true) //true