LocalStorage에서 부울 값을 설정할 수 없습니까?
부울 값을 설정할 수 없음을 발견했습니다.localStorage
?
localStorage.setItem("item1", true);
alert(localStorage.getItem("item1") + " | " + (localStorage.getItem("item1") == true));
항상 알림true | false
내가 시험하려 할 때localStorage.getItem("item1") == "true"
그것은 진실을 알려줍니다...항목을 설정하려면 어떻게 해야 합니까?localStorage
사실입니까?
끈이더라도 난 생각만 했어요.===
유형을 확인하겠습니까?
그렇게
alert("true" == true); // should be true?
현재로서는 Safari, WebKit, Chrome, Firefox 및 IE의 모든 구현이 스토리지 항목의 값이 문자열일 수밖에 없는 WebStorage 표준의 최신 버전을 따르고 있습니다.
옵션은 JSON을 사용하는 것입니다.parse
그리고.stringify
얼마 전 다른 질문에서 제안했듯이 데이터를 직렬화 및 역직렬화하는 방법, 예를 들어:
var value = "true";
console.log(JSON.parse(value) === true); // true
Firefox의 스토리지 구현은 문자열만 저장할 수 있지만, 2009년 9월 W3C는 어떠한 데이터도 수용할 수 있도록 초안을 수정했습니다.구현이 아직 완료되지 않았습니다(아래 편집 참조).
그래서 당신의 경우 부울은 문자열로 변환됩니다.
왜인지는"true" != true
, MDC*의 Equal()==
설명에 기재된 바와 같이:
두 피연산자가 동일한 유형이 아닌 경우, 자바스크립트는 피연산자를 변환한 다음 엄격한 비교를 적용합니다.피연산자가 숫자이거나 부울이면 피연산자는 가능하면 숫자로 변환되고, 가능하면 피연산자가 문자열이면 다른 피연산자는 문자열로 변환됩니다.
문자열은 부울 대신 숫자로 변환됩니다.부터"true"
숫자로 환산하면 다음과 같습니다.NaN
, 그것은 어떤 것과도 동등하지 않을 것입니다.false
반환됩니다.
(*: 실제 표준은 ECMA-262 §11.9.3 "추상적 동등성 비교 알고리즘" 참조)
편집: ThesetItem
인터페이스는 2011년 9월 1일 초안에서 기존 구현의 동작과 일치하도록 허용 문자열로 되돌아갔습니다. 공급업체 중 아무도 문자열이 아닌 저장을 지원하는 데 관심이 없기 때문입니다.자세한 내용은 https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 을 참조하십시오.
내 솔루션:
function tytPreGetBool(pre) {
return localStorage.getItem(pre) === 'true';
}
객체 내부에 일반 부울 값을 랩핑한 다음 사용하는 것이 좀 더 쉬울 수 있음을 지적하고 싶습니다.JSON.stringify
로컬 스토리지 컨텐츠 및 기타 방법을 생성할 수 있습니다.JSON.parse
검색하기:
let storeMe = {
myBool: true
}
localStorage.setItem('test', JSON.stringify(storeMe))
let result = JSON.parse(localStorage.getItem('test'))
이것은 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
제가 주로 하는 일은 LocalStore에 값을 부울(Boolean)로 저장한 다음 파싱(parsing) 방법으로 검색하여 모든 브라우저에 대해 확인하는 것입니다.아래의 제 방법은 제 비즈니스 논리에 맞게 맞춤화 되어 있습니다.때때로 저는 smth를 '아니오'로 저장할 수도 있지만 여전히 필요합니다.false
답례로
function toBoolean(str) {
if (typeof str === 'undefined' || str === null) {
return false;
} else if (typeof str === 'string') {
switch (str.toLowerCase()) {
case 'false':
case 'no':
case '0':
case "":
return false;
default:
return true;
}
} else if (typeof str === 'number') {
return str !== 0
}
else {return true;}
}
LocalStorage가 부울 값을 저장할 수 있는지는 모르겠지만, 당신이 저장할 때 알려줄 수 있습니다.alert("true" == true);
문자열을 부울과 암시적으로 비교하기 때문에 결코 true로 평가되지 않습니다.그래서 사용하는 부울 값을 설정해야 합니다.true
대신에"true"
.
eval
또한 경우에 따라 신중하게 사용할 수 있습니다.
console.log(eval("true") === true) //true
플래그를 저장해야 할 때 주로 다음 작업을 수행합니다.
localStorage.f_active = true
(stored 값은 'true'이며 괜찮습니다)
if localStorage.f_active
— 패스들
플래그를 해제하는 방법
delete localStorage.f_active
if localStorage.f_active
— 전달되지 않음(returned 값이 정의되지 않음)
언급URL : https://stackoverflow.com/questions/3263161/cannot-set-boolean-values-in-localstorage
'programing' 카테고리의 다른 글
Android ndk/jni와 함께 C++ 사용 (0) | 2023.10.31 |
---|---|
코디네이터 레이아웃의 도구 모음 아래에 보기 추가 (0) | 2023.10.31 |
ID에 대괄호가 포함된 경우 ID로 DOM 요소를 찾으십니까? (0) | 2023.10.26 |
응용프로그램별 링커 스크립트에 정의된 접근 기호 (0) | 2023.10.26 |
"중복 키 업데이트 시"를 사용할 때 행이 삽입 또는 업데이트되었는지 어떻게 알 수 있습니까? (0) | 2023.10.26 |