[javascript] 물결표가 표현식 앞에있을 때 어떤 역할을합니까?

var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
           ? 'value'
           : 'innerHTML'

나는 그것을 대답으로 보았으며 전에 본 적이 없다.

무슨 뜻인가요?



답변

~A는 비트 연산자 피연산자의 모든 비트를 플립.

예를 들어 숫자가 1인 경우 IEEE 754 float 의 이진 표현 (JavaScript에서 숫자를 처리하는 방법)은 다음과 같습니다.

0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

따라서 ~피연산자를 32 비트 정수로 변환합니다 (JavaScript의 비트 연산자는 그렇게합니다) …

0000 0000 0000 0000 0000 0000 0000 0001

음수이면 2의 보수로 저장됩니다. 모든 비트를 반전시키고 1을 더하십시오.

… 그리고 모든 비트를 뒤집습니다 …

1111 1111 1111 1111 1111 1111 1111 1110

그렇다면 어떻게 사용합니까? 언제 사용할 수 있습니까?

꽤 많은 용도가 있습니다. 저수준의 물건을 쓰고 있다면 편리합니다. 응용 프로그램을 프로파일 링하고 병목 현상을 발견 한 경우 비트 단위의 트릭을 사용하여 성능을 향상시킬 수 있습니다 ( 훨씬 더 큰 가방에서 하나의 가능한 도구로).

그것은 또한 (일반적으로) 불분명 트릭indexOf()s의 ‘ 발견 에 반환 값 truthy을 (하는 동안 발견되지falsy ) 사람들이 자주 배로 32 비트 숫자를 절단 (및 소수 자릿수를 떨어 뜨리는 측면 효과를 사용, 실제로 Math.floor()양수 와 동일 ).

내가 말할 불분명 는이에 사용되는 즉시 분명 무엇 아니기 때문에. 일반적으로 코드를 읽는 다른 사람들과 명확하게 통신하기를 원합니다. 사용하는 것이 멋지게 보일~ 수 있지만 일반적으로 자신의 이익을 위해 너무 영리합니다. 🙂

그것은 자바 스크립트가 가지고있는 이제 덜 관련이 Array.prototype.includes()String.prototype.includes(). 부울 값을 반환합니다. 대상 플랫폼에서 지원하는 경우 문자열 또는 배열에 값이 있는지 테스트하기 위해이를 선호해야합니다.


답변

indexOf()식 앞에 효과적으로 사용하면 직접 반환되는 숫자 인덱스 대신 사실 / 거짓 결과가 나타납니다.

리턴 값이있는 경우 -1, 다음 ~-1이다 0때문에 -1모든 1 비트의 문자열이다. 0보다 크거나 같은 값은 0이 아닌 결과를 제공합니다. 그러므로,

if (~someString.indexOf(something)) {
}

원인 것 if“뭔가” “someString”에있을 때 실행하는 코드를. .indexOf()부울로 직접 사용하려고하면 때로는 0을 반환하기 때문에 작동하지 않습니다 ( “뭔가”가 문자열의 시작 부분에있을 때).

물론 이것은 작동합니다.

if (someString.indexOf(something) >= 0) {
}

그리고 훨씬 덜 신비 롭습니다.

때때로 당신은 또한 이것을 볼 것입니다 :

var i = ~~something;

~연산자를 두 번 사용하면 문자열을 32 비트 정수로 빠르게 변환 할 수 있습니다. 첫 번째 ~는 변환을 수행하고 두 번째 ~는 비트를 뒤집습니다. 물론 연산자를 숫자로 변환 할 수없는 것에 적용 NaN하면 결과적으로 얻을 수 있습니다. ( 편집 — 실제로 두 번째 ~로 적용되지만 아이디어가 나옵니다.)


답변

~것입니다 비트 NOT 연산자 , ~x과 거의 동일합니다 -(x+1). 이해하기가 더 쉽습니다. 그래서:

~2;    // -(2+1) ==> -3

고려하십시오 -(x+1). -1해당 작업을 수행하여을 생성 할 수 있습니다 0.

다시 말해, ~숫자 값 범위와 함께 사용 하면 입력 값에 대해서만 잘못된 값 ( false에서 시작으로 0) 을 생성하고 -1그렇지 않으면 다른 값을 생성합니다.

아시다시피, -1일반적으로 센티넬 값 이라고 합니다 . C 언어에서 성공실패 에 대한 >= 0값을 리턴하는 많은 함수에 사용 됩니다. JavaScript에서 동일한 반환 값 규칙이 있습니다.-1indexOf()

이런 식으로 다른 문자열에서 하위 문자열의 존재 유무를 확인하는 것이 일반적입니다.

var a = "Hello Baby";

if (a.indexOf("Ba") >= 0) {
    // found it
}
if (a.indexOf("Ba") != -1) {
    // found it
}

if (a.indexOf("aB") < 0) {
    // not found
}
if (a.indexOf( "aB" ) == -1) {
    // not found
}

그러나 ~다음과 같이 쉽게 수행 할 수 있습니다

var a = "Hello Baby";

~a.indexOf("Ba");         // -7   -> truthy
if (~a.indexOf("Ba")) {   // true
    // found it
}

~a.indexOf("aB");         // 0    -> falsy
!~a.indexOf("aB");        // true
if (!~a.indexOf( "aB" )) {  // true
    // not found
}

JS : Types & Grammar 작성자 : Kyle Simpson


답변

~indexOf(item) 꽤 자주 나오고 여기에 대한 답변은 훌륭하지만 일부 사람들은 그것을 사용하는 방법을 알고 이론을 “건너 뛸”것만 필요할 수도 있습니다.

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }


답변

물결표 트릭을 사용 하여 결과 에서 진실한 값 을 만드는 것을 고려하는 사람들에게는 indexOf보다 명시 적이며 대신에 includes방법을String 사용하는 마술이 적습니다 .

'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false

ES 2015부터는 새로운 표준 방법이므로 이전 브라우저에서는 작동하지 않습니다. 중요한 경우 String.prototype.includes polyfill 사용을 고려하십시오 .

이 기능은 동일한 구문을 사용하는 배열에도 사용할 수 있습니다 .

['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false

구형 브라우저 지원이 필요한 경우 Array.prototype.includes polyfill 은 다음과 같습니다 .


답변