물결표가 표현식 앞에있을 때 어떤 역할을합니까?
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에서 동일한 반환 값 규칙이 있습니다.-1
indexOf()
이런 식으로 다른 문자열에서 하위 문자열의 존재 유무를 확인하는 것이 일반적입니다.
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)
comes up quite often, and the answers here are great, but maybe some people just need to know how to use it and "skip" the theory:
if (~list.indexOf(item)) {
// item in list
} else {
// item *not* in list
}
For those considering using the tilde trick to create a truthy value from an indexOf
result, it is more explicit and has less magic to instead use the includes
method on String
.
'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false
Note that this is a new standard method as of ES 2015 so it won't work on older browsers. In cases where that matters, consider using the String.prototype.includes polyfill.
This feature is also available for arrays using the same syntax:
['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false
Here is the Array.prototype.includes polyfill if you need older browser support.
참고URL : https://stackoverflow.com/questions/12299665/what-does-a-tilde-do-when-it-precedes-an-expression
'Programming' 카테고리의 다른 글
Rails 열 유형에 대한 설명서가 있습니까? (0) | 2020.05.20 |
---|---|
WPF 및 초기 초점 (0) | 2020.05.20 |
SQL Server 스키마는 무엇입니까? (0) | 2020.05.19 |
고정 값을 가진 JPA의 enum을 매핑 하시겠습니까? (0) | 2020.05.19 |
Python-초기 용량을 가진 목록 만들기 (0) | 2020.05.19 |