누가 이 '이중 부정' 속임수를 설명할 수 있나요?
저는 Javascript의 전문가는 아니지만 Mark Pilgrim의 "Dive into HTML5" 웹 페이지를 읽고 있는데, 그가 제가 좀 더 이해하고 싶은 것을 언급했습니다.
그는 다음과 같이 말한다.
마지막으로 이중 음의 트릭을 사용하여 결과를 부울 값(참 또는 거짓)으로 강제 설정합니다.
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
조금이라도 더 잘 설명해 주시면 감사하겠습니다!
논리 NOT 연산자!
는 논리값과 반대되는 부울값으로 값을 변환합니다.
두 번째!
는 이전 부울 결과를 원래 논리 값의 부울 표현으로 변환합니다.
단일 오퍼랜드를 true로 변환할 수 있으면 false를 반환하고 그렇지 않으면 true를 반환합니다.
그래서 만약에getContext
"허위" 값을 얻을 수 있습니다.!!
부울 값을 반환합니다.false
그렇지 않으면 다시 돌아옵니다.true
.
false 값은 다음과 같습니다.
false
NaN
undefined
null
""
(빈 문자열)0
Javascript에는 부울이 예상되는 컨텍스트에 배치되었을 때 "참"과 "거짓"으로 간주되는 것에 대한 혼란스러운 규칙 집합이 있습니다.하지만 논리적인 연산자는!
는 항상 적절한 부울값(상수 중 하나)을 생성합니다.true
그리고.false
그 중 두 개를 쇠사슬로 묶음으로써 사자성어는!!expression
는, 원래의 식과 같은 진실성을 가지는 적절한 부울을 생성합니다.
왜 귀찮게 해?왜냐하면 당신이 보여주는 것과 같은 기능을 더 쉽게 예측할 수 있게 해주기 때문입니다.만약 거기에 이중 음성이 없다면, 다시 돌아올지도 몰라undefined
,aFunction
사물, 또는 완전히 다르지 않은 것Function
물건.이 함수의 호출자가 반환값에 대해 이상한 행동을 하면 코드 전체가 잘못될 수 있습니다(여기서 "이상한"은 "부울 컨텍스트를 강제하는 작업 이외의 모든 작업"을 의미합니다).이중부정어법이 이를 막는다.
javascript에서 "bang" 연산자(!)를 사용하면 지정된 값이 true이면 true, 1, null 등이 반환됩니다.값이 정의되지 않은 경우 null, 0 또는 빈 문자열이 false를 반환합니다.
따라서 bang 연산자는 항상 부울 값을 반환하지만 처음에 입력한 값과 반대되는 값을 나타냅니다.그 조작의 결과를 다시 「Bang」하면, 다시 되돌릴 수 있습니다만, 부울(정의되어 있지 않은, 늘 등)이 됩니다.
값, null plain bang으로 수 .false
, "참" 1, "참"이라고 true
.
코드는 다음과 같이 작성되었을 수 있습니다.
var context = document.createElement('canvas').getContext;
var contextDoesNotExist = !context;
var contextExists = !contextDoesNotExist;
return contextExists;
!!변수를 사용하면 타입캐스트에서 부울을 보증할 수 있습니다.
간단한 예를 들어 보겠습니다.
"" == false (is true)
"" === false (is false)
!!"" == false (is true)
!!"" === false (is true)
그러나 다음과 같은 작업을 수행하는 경우 사용하는 것은 의미가 없습니다.
var a = ""; // or a = null; or a = undefined ...
if(!!a){
...
if는 부울에 캐스트하기 때문에 암묵적인 이중 네거티브캐스트를 할 필요가 없습니다.
!
에 "무엇"/"무엇"을 주조하다boolean
.
!!
이 하게 현재합니다).
번째 ★★★★★★★★★★★★★★.!
는 변수를 부울 타입으로 강제하여 반전시킵니다. 번째 두 the the!
는 이 값을 다시 반전시킵니다(체크 중인 항목에 대한 원래(올바른) 부울 값을 제공합니다).
알기 쉽게 하기 위해서는
return Boolean(....);
document.createElement('canvas').getContext
쪽인가로 할 수 .undefined
츠요시 !undefined
율율true
,![some_object]
율율false
이게 우리가 필요한 거의 전부야, 그냥 뒤집힌 거지. ★★★★★★★★★★★★★★★★★.!!
undefined
로로 합니다.false
는 " " "true
.
자바스크립트 document.createElement('canvas').getContext
는 함수 객체입니다.의 「」를 으로써,!
부울식으로 평가하여 답변을 플립합니다. 더 !
서는,, 회회회됩됩됩됩결과적으로 함수는 그것을 부울식으로 평가하지만 함수 객체 자체가 아닌 실제 부울 결과를 반환합니다. ''!!
는 표현식을 부울타입으로 타입캐스트하는 빠르고 더러운 방법입니다.
ifdocument.createElement('canvas').getContext
그래undefined
★★★★★★★★★★★★★★★★★」null
true
않으면 다시 false
.
언급URL : https://stackoverflow.com/questions/4686583/can-someone-explain-this-double-negative-trick
'programing' 카테고리의 다른 글
내장된 Python 함수의 소스 코드를 찾으십니까? (0) | 2023.01.02 |
---|---|
libmariadbclient-dev 설치 오류:의존: libmariadbclient18 (0) | 2023.01.02 |
Vue.js에서 @keyup 핸들러를 지연시키는 방법 (0) | 2023.01.02 |
moment.js가 웹 팩으로 로케일을 로드하지 않도록 하는 방법 (0) | 2023.01.02 |
JavaScript의 Date 컨스트럭터에서 month 인수의 범위는 왜0 ~ 11 인가요? (0) | 2023.01.02 |