ProgramingTip

JavaScript >>> 연산자는 무엇이며 어떻게 사용합니까?

bestdevel 2021. 1. 8. 23:05
반응형

JavaScript >>> 연산자는 무엇이며 어떻게 사용합니까?


나는 배열에 필터 메소드를 추가하는 Mozilla의 코드를보고 있었는데 그것은 나를 혼란스럽게하는 코드를 가지고 있었다.

var len = this.length >>> 0;

나는 전에 JavaScript에서 사용 된 >>>를 본 적이 없습니다.
그것은 무엇입니까?


숫자가 아닌 숫자를 숫자로 변환하는 것이 아니라 32 비트 부호없는 정수로 표현할 수있는 숫자로 변환합니다.

자바 스크립트의 숫자가 배정 밀도 수레 (*)는 비트 연산자이지만 ( <<, >>, &, |~)는 32 비트 정수에 대한 운영의 관점에서 정의된다 . 비트 연산을 수행하면 숫자가 부호있는 32 비트 정수로 변환되어 계산을 수행 한 다음 다시 숫자로 변환하기 32보다 높은 자리 비트와 분수가되기 전에.

따라서 0 비트의 오른쪽 시프트와 같이 실제 효과가없는 비트 연산을 수행하는 >>0것은 숫자를 반올림하고 32 비트 int 범위에 있는지 확인하는 빠른 방법입니다. 또한 트리플 >>>연산자는 부호 없는 연산을 수행 한 후 계산 결과를 부호있는 정수가 아닌 부호없는 정수로 숫자로 변환하는 음수를 32 비트 2의 보수로 변환하는 데 사용할 수 있습니다. 큰 숫자로 버전. 를 사용 >>>0하면 0에서 0xFFFFFFFF 사이의 정수를 얻을 수 있습니다.

이 경우 ECMAScript는 32 비트 부호없는 정수로 배열 설계를 정의하기 때문에 유용합니다. 따라서 array.filter인 ECMAScript 5 판이 말하는 것과 표준 정확히 동일한 방식 으로 구현하려는 경우 숫자를 이와 같이 32 비트 부호없는 INT로 캐스팅합니다.

(는 거의 실제 실제로적인 필요성이 거기의 희망 사람들이 설정 될 수 없습니다 등 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를 사용하고 있습니다. 놀라지 않을 것입니다. 그러나 그것은 당신이 구현 한 세부 사항입니다. )


없는 오른쪽 시프트 부호 연산자는 속성이 부호없는 32 정수 비트 인지 확인하기 위해 모질라 모든 배열 추가 메서드 구현 에서 사용됩니다 .length

length배열 속성은 사양에 다음과 같이 설명 되어 있습니다.

모든 Array 배열에는 값이 항상 2 32 개의 음이 아닌 정수인 길이 속성이 있습니다.

이 연산자는 이것이 달성하는 가장 짧은 방법이며 내부적으로 배열 메소드는 작업을 사용하는 해당 메소드는 액세스 할 수있는 구현 목적으로 사양에 존재합니다.ToUint32

Mozilla 배열 추가 구현은 ECMAScript 5와 호환 되도록 시도 합니다. Array.prototype.indexOf메서드 설명을 참조하십시오 (§ 15.4.4.14).

1. O를이 값을 전달하는 ToObject 호출의 결과라고합니다. 
   인수로.
2. lenValue를 O의 [[Get]] 내부 메서드를 다음과 같이 호출 한 결과라고합니다. 
   인수 "길이".
3. len을 ToUint32 (lenValue)로 .
....

보시다시피, 그들은

ToUint32ES3 구현에서 ES5을 준수하기 사양 위해 메서드 의 동작을 재현 하기를 원하며 이전에 말했듯이 서명되지 않은 오른쪽 시프트 연산자 가 추론 쉬운 방법입니다.


이것이 부호없는 오른쪽 비트 시프트 연산자입니다. 연산자부호있는 오른쪽 비트 시프트 연산자 의 차이점 부호없는 오른쪽 비트 시프트 연산자 ( >>> )가 왼쪽에서 0으로 채워지고 부호있는 오른쪽 비트 시프트 연산자 ( >> )가 부호 비트로 의미다는 것입니다. 숫자 때 숫자 값의 부호를 유지합니다.


Driis 는 운영자가 무엇이며 무엇을하는지 충분히 설명했습니다. 그이면의 의미 / 사용 된 이유는 다음과 가변됩니다.

-way 으로든 이동 어떤 0하면 원래 숫자가 반환되고로 캐스팅 null됩니다 0. 예제 코드 계신보고 는 정의되어 있지 않아도 숫자 this.length >>> 0인지 확인하기 위해 사용 하는 을 구석으로 같습니다 .lenthis.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; 

>>>는 IS 부호 오른쪽 시프트 연산자 ( 페이지. 자바 펼쳐 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

따라서 여기서 수행하려는 것은 "cabbage"예에 따라 길이를 가져 오거나 길이가 정의되지 않았거나 정수가 아닌 경우 0을 가져 오는 것 입니다. 나는이 경우에 그것이 this.length결코 없을 것이라고 가정하는 것이 안전하다고 생각 한다 < 0. 그럼에도 불구하고 나는 두 가지 이유로이 예제가 끔찍한 해킹 이라고 주장합니다 .

  1. <<<음수 사용할 때 의 동작은 위의 예에서 의도하지 않은 (또는 발생할 가능성이있는) 부작용 일 수 있습니다.

  2. 이 질문의 존재가 확인하는 것처럼 코드의 의도는 명확하지 않습니다 .

성능이 절대적으로 중요하지 않는 한 더 읽기 쉬운 것을 사용하는 것이 가장 좋습니다.

isNaN(parseInt(foo)) ? 0 : parseInt(foo)

두 가지 이유 :

  1. >>>의 결과는 "적분"입니다.

  2. 정의되지 않음 >>> 0 = 0 (JS가 LFS를 숫자 컨텍스트로 강제 변환하기 때문에 "foo">>> 0 등에서도 작동합니다.)

JS의 숫자는 내부적으로 double을 나타냅니다. 길이에 대한 기본 입력 온전한 "빠른"방법 일뿐입니다.

그러나 , -1 >>> 0 (원하는 길이가 아닐 가능성이 높습니다!)


아래의 샘플 Java 코드가 잘 설명되어 있습니다.

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/3081987/what-good-does-zero-fill-bit-shifting-by-0-do-a-0

반응형