programing

!!~ (tilde/bang bang tilde가 아님) 'contains/included' Array 메서드 호출의 결과를 어떻게 변경합니까?

easyjava 2023. 9. 11. 22:25
반응형

!!~ (tilde/bang bang tilde가 아님) 'contains/included' Array 메서드 호출의 결과를 어떻게 변경합니까?

jQuery 에서 .inArray여기에 흥미로운 선언문이 있습니다.

!!~jQuery.inArray(elm, arr) 

, 는 를 으로 이라고 가 이라고 으로 는 를 가 boolean이 , 를 의 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

저는 이곳의 틸트의 목적을 이해할 수 없습니다.누가 설명을 해주시거나 자료를 알려주실 수 있습니까?

이 가끔 될 가 있습니다~한 앞에 $.inArray.

기본적으로.

~$.inArray("foo", bar)

하는게 더 짧은 방법입니다.

$.inArray("foo", bar) !== -1

$.inArray첫 번째 인수가 발견되면 배열에 있는 항목의 인덱스를 반환하고, 발견되지 않으면 -1을 반환합니다.이는 "이것이 배열에 있는 값입니까?"의 부울을 찾는다면 -1이 참값이므로 부울 비교를 할 수 없으며 $.inArray가 0(거짓 값)을 반환하면 배열의 첫 번째 요소에서 실제로 발견됨을 의미합니다.

하기 적용하기~트자인즈인자를 발생시킵니다.-1가 되다0 0 '-1'이 되게 .따라서 배열에서 값을 찾지 못하고 bitwise NOT를 적용하면 위변조 값 (0)이 발생하고, 다른 값들은 모두 0이 아닌 숫자를 반환하며, 참된 결과를 나타냅니다.

if (~$.inArray("foo", ["foo",2,3])) {
    // Will run
}

그리고 의도대로 될 겁니다.

!!~expr 평가합니다.falseexpr이다 ㅇ-1그렇지 않으면true.
.expr != -1 부서졌다 뿐*


자바스크립트 비트 와이즈 연산은 피연산자를 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됩니다 를 적용합니다. 반전하면 truth 값이 생성됩니다. 적용됩니다.! 값은 true를 합니다. truth에두번가울를 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.

tild 연산자는 실제로 jQuery의 일부가 아닙니다. 자바스크립트 자체에서는 약간 현명한 연산자가 아닙니다.

틸데의 위대한 신비(~) 참조.

당신이 실험에서 이상한 숫자를 얻게 된 것은 정수에 대해 약간의 논리적 연산을 수행하기 때문입니다. (내가 아는 한, 두 개의 보어 같은 것으로 저장될 수도 있습니다.)

2의 보어는 숫자를 이진법으로 표현하는 방법을 설명합니다.제가 옳았던 것 같아요.

~foo.indexOf(bar)는인다다을 나타내는 .foo.contains(bar)그 이유는contains함수가 존재하지 않습니다.

일반적으로 자바스크립트의 "falsey" 값 개념 때문에 cast to boolean은 불필요합니다.은 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ,true아니면false.

jQuery.inArray()-1found"의("not found"우그,어의 ()~)는 )입니다0.따라서,~jQuery.inArray()값을 ey을합니다()0를 "찾을 수 없음"으로 지정하고 "찾을 수 있음"을 나타내는 진리값(음의 정수).!! boolean위을면제 /로다할l할eln로/en을l위false/true.그렇게,!!~jQuery.inArray()줄을 줄 true" 및 "found"에 대한false"Not found"(찾지 않음)의 경우.

~4바이트 모두에 대해int 공식과 같음과음이음과s-(N+1)

그렇게

~0   = -(0+1)   // -1
~35  = -(35+1)  // -36 
~-35 = -(-35+1) //34 

Tilde는 비트 단위가 아닙니다. 값의 각 비트를 반전시킵니다.으로 ①을 ~숫자에서 기호가 반전되고, 그 다음에 1이 차감됩니다.

그래서 당신이 할 때~0을 반전하면 -1π π(0π π -0, π 1π -1)를.

이것은 본질적으로 항상 부울(Boolean)인 값을 얻기 위한 정교한 초미세 최적화 방식입니다.

~연산자는 비트 와이즈 상보 연산자입니다.수의 정수 결과는inArray()는 원소를 찾을 수 없을 때 -1이거나 음이 아닌 정수입니다.0.-1수의로시트위로)다는시0든e로트(수1o위로tetfet1-(d .음이 아닌 정수의 비트 단위 상보는 항상 0이 아닙니다.

따라서,!!~i될 것이다true이 아닌 "i"이닌일때고가,때고rn일이false"i"히 -1때일 때

:~는 항상 피연산자를 정수로 강제합니다. 즉, 정수가 아닌 부동 소수점 값을 정수로 강제합니다.

맞아.이코드는반환됩니다반환됩니다를 반환합니다.false그 때에indexOf반환하며, 않으면은 -1을 반환합니다. 그렇지 않으면true.

당신의 말대로, 다음과 같은 것을 사용하는 것이 훨씬 더 현명할 것입니다.

return this.modifiedPaths.indexOf(path) !== -1;

~연산자는 비트와이즈 NOT 연산자입니다.이것이 의미하는 것은 그것이 이진 형태의 숫자를 취하고 모든 0을 1로 그리고 1을 0으로 바꾼다는 것입니다.

를 들어,은 를 에서 0 0000000은 , -1 인 11111111은. 로 1은00000001는 2π -2π입니다.11111110.

제 추측으로는 그것이 몇 글자 더 짧기 때문인 것 같습니다(도서관 저자들이 항상 추구하는).또한 네이티브 코드로 컴파일할 때 몇 개의 기계 사이클만 걸리는 연산을 사용합니다(숫자와 비교하는 것과는 반대로).

오버킬이라는 또 다른 답변에 동의하지만, 결과적으로 엄격한 루프에서 이해가 될 수도 있습니다(성능 향상 추정이 필요하지만 그렇지 않을 경우 조기 최적화로 판명될 수도 있습니다).

나는 그것이 약간 현명한 연산이기 때문에 경로가 수정된 경로에 나타나는지를 확인하는 가장 빠른 (계산적으로 저렴한) 방법이라고 생각합니다.

~하듯이(~(-1)) === 0, 그래서:

!!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false

언급URL : https://stackoverflow.com/questions/9316612/how-does-not-not-tilde-bang-bang-tilde-alter-the-result-of-a-contains-inc

반응형