자바스크립트 >> 연산자는 무엇이고 어떻게 사용합니까?
배열에 필터 방식을 추가한 Mozilla의 코드를 보고 있었는데 코드 라인이 있어서 혼란스러웠습니다.
var len = this.length >>> 0;
자바스크립트에서 >>>이 사용되는 것을 본 적이 없습니다.
그것은 무엇이고 무슨 일을 합니까?
단순히 숫자가 아닌 숫자를 숫자로 변환하는 것이 아니라 32비트 부호 없는 int로 표현할 수 있는 숫자로 변환합니다.
의 Number (*) 이지만(<<
,>>
,&
,|
그리고.~
는 는 32 됩니다.비트 와이즈 연산을 수행하면 계산을 수행하기 전에 숫자를 32비트 부호화된 int로 변환하여 분수와 32보다 높은 자리 비트를 손실하고 다시 숫자로 변환합니다.
0 합니다와합니다.>>0
하고 32 에 있는지 입니다.으로,,>>>
연산자는 부호가 없는 연산을 수행한 후 계산 결과를 부호가 없는 정수로 변환하므로, 음수를 큰 숫자로 32비트-2의 보완 버전으로 변환하는 데 사용할 수 있습니다.으로.>>>0
~ 과 0xFFFFFFF합니다 사이의 정수를 .
이 경우 ECMAscript는 32비트 부호 없는 int로 배열 인덱스를 정의하기 때문에 유용합니다.그래서 array.filter
ECMAscript Fifth Edition 표준이 말하는 것을 정확히 복제하는 방식으로, 당신은 32비트 비부호 인트에 숫자를 이렇게 캐스팅할 것입니다.
이 를 없습니다.array.length
.0.5
,-1
,1e21
아니면'LEMONS'
.
요약:.
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*: 음, 그들은 부유물처럼 행동하는 것으로 정의됩니다.일부 자바스크립트 엔진이 성능상의 이유로 실제로 int를 사용한다고 해도 놀랄 일은 아닙니다.하지만 이는 어떤 이점도 활용할 수 없는 구현 세부사항이 될 것입니다.)
서명되지 않은 오른쪽 시프트 연산자는 모질라의 모든 어레이 엑스트라의 메소드 구현에 사용되어 다음을 보장합니다.length
property는 부호 없는 32비트 정수입니다.
length
어레이 개체의 속성은 규격에서 다음과 같이 설명됩니다.
모든 배열 개체는 값이 항상 2보다32 작은 음이 아닌 정수인 길이 속성을 가집니다.
이 연산자는 이를 달성하기 위한 가장 짧은 방법이며, 내부 배열 방법은 연산을 사용하지만 이 방법은 액세스할 수 없으며 구현 목적으로 규격에 존재합니다.
Mozilla 어레이 추가 구현은 ECMAscript 5를 준수하려고 합니다. 에 대한 설명을 보십시오.Array.prototype.indexOf
법§ 15.4.4.14):
1. O를 ToObject 호출이 이 값을 전달한 결과라고 합니다.의론으로는 2. lenValue를 O의 [Get] 내부 메서드를 호출한 결과라고 합니다.length라는 논법 3. ToUint32(lenValue)라고 합니다.....
, 은 단지 ToUint32
ES3 구현에서 ES5 사양을 준수하는 방법이며, 앞서 언급했듯이 서명되지 않은 오른쪽 시프트 연산자가 가장 쉬운 방법입니다.
부호 없는 오른쪽 비트 시프트 연산자입니다.이것과 부호화된 우비트 쉬프트 연산자의 차이점은 부호화되지 않은 우비트 쉬프트 연산자(>>)는 왼쪽부터 0으로 채워지고 부호화된 우비트 쉬프트 연산자(>)는 부호 비트로 채워짐으로써 쉬프트시 수치의 부호가 유지된다는 것입니다.
Driis는 운영자가 무엇이고 무엇을 하는지에 대해 충분히 설명했습니다.그 뒤에 숨겨진 의미는 다음과 같습니다./사용된 이유는 다음과 같습니다.
을 통해 방향 0
다를 합니다.null
.0
코드가 사용하고 것 . .this.length >>> 0
하기 len
다이라도 입니다.this.length
정의되지 않았습니다.
많은 사람들에게 비트와이즈 작업은 명확하지 않습니다(그리고 Douglas Crockford/jslint는 이러한 것을 사용하지 말 것을 제안합니다).그것이 잘못되었다는 것을 의미하는 것이 아니라, 코드를 더 읽기 쉽게 만들기 위해 더 유리하고 친숙한 방법들이 존재합니다.은 다음과 같습니다.len
이다.0
는 다음 두 가지 방법 중 하나입니다.
// Cast this.length to a number
var len = +this.length;
아니면
// Cast this.length to a number, or use 0 if this.length is
// NaN/undefined (evaluates to false)
var len = +this.length || 0;
>>>
는 서명되지 않은 오른쪽 시프트 연산자입니다(JavaScript 1.5 사양의 페이지 76 참조).>>
, 서명된 우측 교대 연산자
>>>
에서는 이동할 때 부호 비트를 보존하지 않으므로 음수 이동 결과를 변경합니다.이로 인한 결과는 해석자를 통해 예를 들어 이해할 수 있습니다.
$ 1 >> 0
1
$ 0 >> 0
0
$ -1 >> 0
-1
$ 1 >>> 0
1
$ 0 >>> 0
0
$ -1 >>> 0
4294967295
$(-1 >>> 0).toString(16)
"ffffffff"
$ "cabbage" >>> 0
0
은 0 입니다에 가 정의되지 경우 하는 입니다."cabbage"
위의 예문이 경우에는 다음과 같이 추정하는 것이 안전하다고 생각합니다.this.length
절대로 없을 것입니다< 0
. 그럼에도 불구하고, 저는 이 예가 고약한 해킹이라고 주장하고 싶습니다. 두 가지 이유가 있습니다.
의 .
<<<
음수를 사용하는 경우 위의 예제에서 부작용이 의도하지 않았거나 발생할 가능성이 있습니다.이 질문의 존재가 증명하듯이 코드의 의도는 명확하지 않습니다.
성능이 절대적으로 중요하지 않은 한 보다 판독 가능한 것을 사용하는 것이 가장 좋은 방법일 것입니다.
isNaN(parseInt(foo)) ? 0 : parseInt(foo)
두 가지 이유:
>>의 결과는 "적분"입니다.
undefined >> 0 = 0 (JS는 LFS를 숫자 컨텍스트로 강제하려고 시도하므로, 이것은 "foo" >> 0 등에도 적용됩니다.)
JS에서 숫자는 내적으로 두 배를 나타낸다는 것을 기억하세요.이것은 단지 길이에 대한 기본적인 입력 제정신의 "빠른" 방법일 뿐입니다.
단, -1 >>> 0 (아, 원하는 길이가 아닐 가능성이 높습니다!)
아래의 샘플 자바 코드는 다음을 잘 설명해 줍니다.
int x = 64;
System.out.println("x >>> 3 = " + (x >>> 3));
System.out.println("x >> 3 = " + (x >> 3));
System.out.println(Integer.toBinaryString(x >>> 3));
System.out.println(Integer.toBinaryString(x >> 3));
출력은 다음과 같습니다.
x >>> 3 = 536870904
x >> 3 = -8
11111111111111111111111111000
11111111111111111111111111111000
언급URL : https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it
'programing' 카테고리의 다른 글
데이터베이스에서 행 선택(strlen) (0) | 2023.10.14 |
---|---|
False 열 값에 대한 필터링이 True로 반환됨 (0) | 2023.10.14 |
c에서 printf를 통해 char array를 인쇄하는 방법? (0) | 2023.10.09 |
StAX보다 SAX를 언제 선택해야 합니까? (0) | 2023.10.09 |
NOT(~) vs NEGATION(!) (0) | 2023.10.09 |