가정
질문에 따라이 기능에 대한 몇 가지 가정 / 요구 사항은 다음과 같습니다.
- 라이브러리 함수 로 사용 되므로 모든 코드베이스에 포함됩니다.
- 따라서 많은 다른 환경에서 작동 해야 합니다 . 즉, 레거시 JS 코드, 다양한 수준의 품질의 CMS 등으로 작업해야합니다.
- 다른 사람이 작성한 코드 및 / 또는 사용자가 제어하지 않는 코드와 상호 작용하기 위해이 함수 는 쿠키 이름 또는 값이 인코딩되는 방식을 가정해서는 안됩니다 . 문자열로 함수를 호출하면
"foo:bar[0]"
"foo : bar [0]"이라는 쿠키 (문자 그대로)가 반환됩니다.
- 새 쿠키는 페이지 수명 동안 언제든지 작성 하거나 기존 쿠키를 수정할 수 있습니다 .
이러한 가정 하에서, 그것은 분명하다 encodeURIComponent
/는 decodeURIComponent
사용할 수 없습니다 ; 그렇게하면 쿠키를 설정 한 코드도 이러한 기능을 사용하여 쿠키를 인코딩했다고 가정합니다.
쿠키 이름에 특수 문자가 포함될 수 있으면 정규식 접근 방식에 문제가 발생합니다. jQuery.cookie는 쿠키를 저장할 때 쿠키 이름 (실제 이름과 값 모두)을 인코딩하고 쿠키를 검색 할 때 이름을 디코딩하여이 문제를 해결합니다. 정규식 솔루션은 다음과 같습니다.
완전히 제어하는 쿠키 만 읽는 경우가 아니라면 다시 읽지 않고 캐시가 유효하지 않은지 알 수있는 방법이 없으므로 쿠키를 document.cookie
직접 읽고 결과를 캐시하지 않는 것이 좋습니다 document.cookie
.
(액세스 및 파싱 document.cookies
은 캐시를 사용하는 것보다 약간 느리지 만 쿠키는 DOM / 렌더 트리에서 역할을하지 않기 때문에 DOM의 다른 부분을 읽는 것만 큼 느리지 않습니다.)
루프 기반 기능
다음은 PPK (루프 기반) 기능을 기반으로 한 코드 골프 답변입니다.
function readCookie(name) {
name += '=';
for (var ca = document.cookie.split(/;\s*/), i = ca.length - 1; i >= 0; i--)
if (!ca[i].indexOf(name))
return ca[i].replace(name, '');
}
축소하면 128 자 (기능 이름을 세지 않음)가됩니다.
function readCookie(n){n+='=';for(var a=document.cookie.split(/;\s*/),i=a.length-1;i>=0;i--)if(!a[i].indexOf(n))return a[i].replace(n,'');}
정규식 기반 함수
업데이트 : 정규식 솔루션을 정말로 원한다면 :
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
이것은 RegExp 객체를 생성하기 전에 쿠키 이름의 특수 문자를 이스케이프 합니다. 축소 된 기능은 134 자 (함수 이름을 세지 않음)입니다.
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Rudu와 cwolves가 주석에서 지적했듯이 정규 표현식 이스케이프 정규 표현식은 몇 문자로 단축 될 수 있습니다. 나는 이스케이프 정규 표현식을 일관되게 유지하는 것이 좋을 것이라고 생각하지만 (다른 곳에서 사용하고있을 수도 있음) 그들의 제안은 고려할 가치가 있습니다.
노트
이러한 기능을 모두 처리하지 않습니다 null
또는 undefined
"널 (null)"라는 이름의 쿠키가있는 경우, 즉 readCookie(null)
그 값을 반환합니다. 이 경우를 처리해야하는 경우 코드를 적절하게 조정하십시오.