0.-5가 -5로 평가되는 이유는 무엇입니까?


84

내가 쓰는 가정 0.5으로 0.-5예상치 못한 방법으로,하지만 여전히 실행할 수 있습니다. 계속 실행되고 -5로 평가되기 위해 0.in 0.-5은 무엇을 합니까?

나는 또한 시도 alert(0.-5+1)인쇄 -4, 자바 스크립트를 무시 않는 0.에서 0.-5?


55
0.입니다 0.0. 아니면 그냥 0.
Ry-

61
그것이 0.-5"예기치 않은 방법" 이라고 생각하게 만드는 이유는 무엇입니까 ?
Nico Haase 2019

15
@NicoHaase : OP가 "예기치 않은 방법"을 사용하여 "내가 그것을 쓸 의도가 없었고 / 예상하지 않았지만 어떻게 든 그랬습니다"를 의미한다고 확신합니다.
Filip Milovanović 2019

15
이것은 다른 많은 언어에서도 작동합니다 (예 : Python). 나는 개인적으로 그것을 전혀 좋아하지 않는다. 차라리 0.-5구문 오류가 있고 후행 마침표가있는 부동 소수점 리터럴을 허용하지 않지만 사람들 .0이 끝에 작성하도록 강요 합니다.
Giacomo Alzetta 2019

9
숫자로 끝나는 .것을 허용 하면 123.toString(16)(일반적인 트릭 123..toString(16)은 실제로 사용 하는 것입니다. (123.).toString(16))
12Me21

답변:


191

a 뒤의 후행 숫자 .는 선택 사항입니다.

console.log(0. === 0); // true

그래서

0.-5

평가하다

0 - 5

그것은 단지 -5입니다. 비슷하게,

0.-5+1

이다

0 - 5 + 1

그것은

-5 + 1

또는 -4.


16
선행 숫자도 선택 사항이므로 .0-5도 유효합니다
icenac

48

0.-5성공적으로 파싱 할 수있다 0.[1] , -5. 다음은 AST 탐색기에서 생성 된 표현식의 추상 구문 트리입니다.

AST 탐색기에서 생성 한 구문 분석 트리

이것은 (예기치 않은 방식으로) 유효한 JavaScript이며 -5.


[1] 숫자 리터럴의 문법에 따르면 십진수와 지수 부분은 선택 사항입니다.

NumericLiteral ::
  DecimalLiteral
  [...]

DecimalLiteral ::
  DecimalIntegerLiteral. DecimalDigits opt ExponentPart opt


AST를 어떻게 추출 했습니까?
Κωλζαρ 19-02

8
astexplorer.net으로 이동하여 언어와 파서를 선택하고 코드를 붙여넣고 JSON 출력을 선택하거나 스크린 샷을 찍습니다.
Salman A

39

JS에서는 선택적 소수점으로 숫자를 표현할 수 있습니다.

x = 5.;    //5
x = 5. + 6.   //11

그리고 Tvde1의 의견에 따라 모든 Number 메서드도 적용 할 수 있습니다.

5..toString()

이 구문을 사용하면 괄호없이 숫자 함수를 실행할 수 있습니다.

5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome

이유를 알아 보려면 질문을 참조하십시오 .


4
당신은 할 수 있습니다 5..toString().
Tvde1

2
사실이라면 메서드를 호출하기 위해 5..toString ()을 수행해야합니다. 그렇지 않으면 괄호를 사용해야합니다. (5) .toString ()
jo_va

3
@PeterMortensen Ruby, 하나입니다. 또한 ALGOL 68. Common Lisp에서는 이상하게 1.0도 부동 소수점이지만 1.정수입니다.
Sneftel

2
@FlorianF 그렇게하지 않을 것입니다. 그렇다고해서 파서가이를 거부하기 위해 특수한 경우를해야한다는 의미는 아닙니다. float에는 메서드 5.가 있으며 float.
chepner

2
@MasonWheeler 합법적 인 다른 언어 가 적절하게 구문 분석 하는 것을 금지 하는 경우는 확실히 아닙니다 . 구문 분석에 대한 가장 전통적인 접근 방식 (리터럴을 포함한 토큰의 욕심 많은 어휘 후 구문 분석)은 Javascript 동작을 생성합니다. (1).toMethod()(1.)
Sneftel

7

진짜 답은 소수점이 아니라 마이너스 부호에 관한 것이라고 생각합니다. 앞에 숫자처럼 보이는 것이 있으면 연산자로 해석되지 않습니까?


1
그런 다음보기의 어느 시점에서 적어도, 아직 입니다 빼기 기호 것 없다 "숫자처럼 보이는"선행 그렇지 않으면 무엇을, 소수점은 숫자 리터럴의 일부로 해석 것에 대해.
Pac0

5

console.log(0. - 5)      // -5
console.log(0 - 5)       // -5
console.log('0.' - 5)    // -5
console.log('0' - 5)     // -5
console.log(0.-5 === -5) // true

'0.' 또는 '0'은 유형이 숫자에 대해 고유하기 때문에 JavaScript에서 동일합니다. 빼기 연산자는 숫자 사이에 있으므로 항상 전달하는 것을 숫자로 변환하십시오. Python에서는 여러 유형이 있기 때문에 첫 번째는 Float이고 두 번째는 Integer입니다.


이 문제는 유형과 관련이 없습니다. 구문과 만 관련이 있습니다.
user4642212
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.