여기 jQuery inArray
페이지 의 주석을 읽으면 흥미로운 선언이 있습니다.
!!~jQuery.inArray(elm, arr)
이제 이중 느낌표가 결과를 boolean
값이있는 type으로 변환 할 것이라고 믿습니다 true
. 내가 이해하지 못하는 것은이 모든 것에서 물결표 ( ~
) 연산자를 사용하는 것입니다.
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
if
진술 리팩토링 :
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
고장:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
또한 물결표를 앞에 넣으면 결과가 -2
.
~!!~jQuery.inArray("one", arr) // -2
여기서 물결표의 목적을 이해하지 못합니다. 누군가가 그것을 설명하거나 리소스를 가리킬 수 있습니까?
답변
물결표 연산자는 실제로 jQuery의 일부가 아닙니다. JavaScript 자체에서 비트 NOT 연산자입니다.
The Great Mystery of the Tilde (~)를 참조하십시오 .
정수에 대해 비트 논리 연산을 수행하고 있기 때문에 실험에서 이상한 숫자를 얻습니다 (내가 아는 한 2의 보수 또는 이와 비슷한 것으로 저장 될 수 있습니다 …)
2의 보수 는 숫자를 이진수로 표현하는 방법을 설명합니다. 내가 옳았다 고 생각합니다.
답변
.NET Framework ~
앞에 적용될 수있는 특별한 이유가 있습니다 $.inArray
.
원래,
~$.inArray("foo", bar)
할 수있는 더 짧은 방법입니다
$.inArray("foo", bar) !== -1
$.inArray
첫 번째 인수가 발견되면 배열에있는 항목의 인덱스를 반환하고 발견되지 않으면 -1을 반환합니다. 즉, “이 값이 배열에 있습니까?”라는 부울을 찾는 경우 -1이 진실 값이고 $ .inArray가 0 (잘못된 값)을 반환 할 때 부울 비교를 수행 할 수 없습니다. ), 그것은 배열의 첫 번째 요소에서 실제로 발견되었음을 의미합니다.
적용 ~
비트 연산자하는 원인이 -1
되기 위해 0
, 그리고`가 0 원인 -1. 따라서 배열에서 값을 찾지 못하고 비트 NOT을 적용하면 잘못된 값 (0)이 발생하고 다른 모든 값은 0이 아닌 숫자를 반환하고 진실한 결과를 나타냅니다.
if (~$.inArray("foo", ["foo",2,3])) {
// Will run
}
그리고 의도 한대로 작동합니다.
답변
!!~expr
그렇지 않은 false
경우 expr
로 평가됩니다 .
와 동일하지만 깨짐 *-1
true
expr != -1
JavaScript 비트 연산 은 피연산자를 2의 보수 형식으로 부호있는 32 비트 정수로 변환 하기 때문에 작동 합니다. 따라서 !!~-1
다음과 같이 평가됩니다.
-1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1
~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits)
!0 = true // ! is logical not (true for falsy)
!true = false // duh
이외의 값 -1
은 하나 이상의 비트를 0으로 설정합니다. 반전하면 진실한 가치가 생성됩니다. !
진실 값에 연산자를 두 번 적용하면 부울 true가 반환됩니다.
와 함께 사용할 때 .indexOf()
결과가 다음 -1
과 같은지 확인하고 싶습니다 .
!!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false
!!~"abc".indexOf("a") // indexOf() returns 0, the expression evaluates to true
!!~"abc".indexOf("b") // indexOf() returns 1, the expression evaluates to true
* !!~8589934591
거짓으로 평가되므로질색을 (를) 테스트하는 데 안정적으로 사용할 수 없습니다 -1
.
답변
~foo.indexOf(bar)
함수가 존재하지 않기 foo.contains(bar)
때문에 표현하는 일반적인 속기 contains
입니다.
일반적으로 “거짓”값이라는 JavaScript의 개념으로 인해 부울로 캐스트 할 필요가 없습니다. 이 경우 함수의 출력을 true
또는 로 강제하는 데 사용됩니다 false
.
답변
jQuery.inArray()
-1
보수 ( ~
)가 인 “찾을 수 없음”을 반환 합니다 0
. 따라서 “찾을 수 없음”에 대해서는 ~jQuery.inArray()
거짓 값 ( 0
)을 반환하고 “발견됨”에 대해서는 진실 값 (음의 정수)을 반환합니다. !!
그런 다음 거짓 / 진정한 것을 실제 부울 false
/ 로 공식화합니다 true
. 따라서 “발견됨”및 “찾을 수 없음”에 대해 !!~jQuery.inArray()
제공 true
합니다 false
.
답변
~
4 바이트는 int
이 수식 같다-(N+1)
그래서
~0 = -(0+1) // -1
~35 = -(35+1) // -36
~-35 = -(-35+1) //34
답변
~
연산자는 비트 보수 연산자입니다. 의 정수 결과 inArray()
는 요소를 찾을 수없는 경우 -1이거나 음이 아닌 정수입니다. -1의 비트 보수 (2 진수로 모두 1 비트로 표시)는 0입니다. 음이 아닌 정수의 비트 보수는 항상 0이 아닙니다.
따라서 !!~i
것 true
정수 “I”는 음이 아닌 정수이고, 경우 false
에 “i”정확히 언제 -1.
참고 ~
항상 정수 피연산자를 강제 변환; 즉, 정수가 아닌 부동 소수점 값을 숫자가 아닌 값뿐만 아니라 정수로 강제 적용합니다.