JavaScript는 유형이 지정되지 않은 언어입니까?


104

어떤 사람들은 자바 스크립트를 "동적으로, 약한 유형의"언어라고 부르지 만 어떤 사람들은 "유형이 지정되지 않은"언어라고도합니다. 그것은 정말로 무엇입니까?

답변:


133

JavaScript 유형 지정되지 않았습니다.


(출처 : no.gd )

Brendan Eich도 그렇게 말합니다. 트위터에서 그는이 질문에 링크 된 스레드에 답장했습니다.

... 학문적 유형은 "정적 유형 없음"을 의미하기 위해 "유형 없음"을 사용합니다 ...

그래서 문제는 untyped에 대한 몇 가지 다른 정의가 있다는 것입니다. 입니다.

위의 답변 중 하나에서 하나의 정의에 대해 이야기했습니다. 런타임은 값에 태그를 지정하지 않고 각 값을 비트로 취급합니다. 자바 스크립트 태그 값을 수행하며 해당 태그에 따라 다른 동작을합니다. 따라서 JavaScript는 분명히이 범주에 맞지 않습니다.

다른 정의는 프로그래밍 언어 이론 (Brendan이 언급 한 학문적 내용 )에서 가져온 것입니다. 이 도메인에서 untyped모든 것이 단일 유형에 속함을 의미 합니다 .

왜? 언어는 유형이 일치한다는 것을 증명할 수있을 때만 프로그램을 생성하기 때문입니다 (일명 Curry-Howard 대응 , 유형은 정리, 프로그램은 증명). 이것은 유형이 지정되지 않은 언어를 의미합니다.

  1. 프로그램은 항상 생성됩니다.
  2. 따라서 유형은 항상 일치합니다.
  3. 따라서 하나의 유형 만 있어야합니다.

입력 된 언어와 달리 :

  1. 프로그램 생성 되지 않을 수 있습니다.
  2. 유형 일치 하지 않을 수 있기 때문에
  3. 프로그램은 여러 유형을 포함 수 있기 때문에

따라서 PLT에서 untyped동적으로 입력 됨을 의미 하고 typed정적으로 입력 됨을 의미합니다. 합니다. JavaScript는 확실히이 범주에서 유형이 지정되지 않았습니다.

또한보십시오:


6
그리고 물론, "정적 유형 없음"은 "유형 선언 없음"과 동일하지 않습니다.
Andreas Rossberg 2012

+1. 아마도 당신의 대답에 이것을 연결해야 할 것 입니다. 이 "약하게 입력 된"bs는 너무 널리 퍼져 있습니다.
missingfaktor

2
프로그래밍 언어 이론이 정확합니다. 거대한 스크린 샷이 잘못되었습니다.
Alex W

2
이 답변이 Harper의 블로그 게시물을 참조한 것을보고 기뻤지 만 PLT 커뮤니티가 "untyped"를 선호하여 "untyped"를 삭제하면 좋을 것입니다. "단지 비트"를 의미하는 "유형 없음"의 정의는 실제로 의미가 있습니다. 형식 사양에서 "유형"이라는 단어를 사용하고 7 가지 유형 (Undefined, Null, Number, String, Boolean, Symbol 및 Object)이 있다고 말하는 언어를 설명하기 위해 "untyped"를 사용하는 것은 정말 혼란 스럽습니다. 대부분의 사람들은이 유형의 개념을 PLT 정의와 구별하기를 원하지 않습니다.
Ray Toal 2015-06-15

4
1. 2. 3.유형이 지정되지 않은 언어에 대한 귀하의 언어가 JavaScript와 일치하지 않습니다. 유형이 하나만있는 것이 아니라 약 4-5 개가 있습니다. 그러면 JavaScript가 유형이 지정되지 않음을 어떻게 보여줄까요?
Don Cheadle 2015

82

강함 / 약함 해당되는 경우 컴파일러가 입력을 처리하는 방법과 관련하여 생각할 있습니다.

  • 약한 유형 은 해당하는 경우 컴파일러가 올바른 유형을 적용하지 않음을 의미합니다. 암시 적 컴파일러 인터 젝션이 없으면 명령은 런타임 중에 오류가 발생합니다.

    "12345" * 1 === 12345  // string * number => number

    강력한 형식 은 컴파일러가 있음을 의미하며 string 에서 integer 로의 명시 적 캐스트를 원합니다.

    (int) "12345" * 1 === 12345

    어떤 경우 든 일부 컴파일러의 기능은 컴파일 시간 동안 명령을 암시 적으로 변경하여 변환을 수행 할 수 있습니다.

    지금까지 JavaScript는 Not-Strongly-Typed로 분류 할 수 있습니다. 그것은 약한 유형이거나 유형이 없다는 것을 의미합니다.

동적 / 정적 언어 명령이 유형을 조작하는 방법과 관련하여 생각할 있습니다.

  • 동적 유형 의 유형이 적용됨을 의미하지만 변수는 단순히 모든 유형의 값을 나타냅니다.

    x = 12345;    // number
    x = "string"; // string
    x = { key: "value" }; // object
    y = 123 + x; // error or implicit conversion must take place.

    정적 유형 변수 유형이 강력하게 적용되고 값 유형이 덜 적용됨을 의미합니다.

    int x = 12345; // binds x to the type int
    x = "string";  // too late, x is an integer - error
    string y = 123; // error or implicit conversion must take place.

    지금까지 JavaScript는 Not-Statically-Typed로 분류 할 수 있습니다. 또한 입력하면 동적으로 입력 된 것처럼 보입니다. 따라서 타이핑이 무엇을 의미하는지 알아야합니다.

Typed 는 언어가 string , number , boolean , object , array , null , undefined 등과 같은 다른 유형을 구분한다는 것을 의미합니다. 또한 각 작업은 특정 유형에 바인딩됩니다. 따라서 정수 문자열로 나눌 수 없습니다.

    2 / "blah"  // produces NaN

형식화되지 않은 수단은 분할 작업 정수 스트링 의 처음 4 바이트를 처리 초래 문자열 정수 . 이는 유형화되지 않은 연산이 비트에서 직접 발생하기 때문에 관찰 할 유형이 없기 때문입니다. 결과는 예상치 못한 결과가 될 것입니다.

    2 / "blah"  // will be treated as  2 / 1500275048

JavaScript는 Typed 정의에 따라 동작하므로 반드시 그래야합니다. 따라서 동적으로 형식화되고 약한 형식이어야합니다.

누구든지 JavaScript가 Untyped라고 주장하는 경우 실제 적용이 아니라 학문적 이론을위한 것입니다.


1
그러나 나는 마지막 진술에 모순이 있다고 생각합니다. JavaScript에서 정수 또는 문자열의 모든 값에 대해 정수 문자열 분할의 결과가 잘 정의되어 있습니다. 그다지 유용하지 않습니다!
Deniz Dogan

더 나은 정의 / 설명이 있으면 자유롭게 편집하십시오. 그래서 커뮤니티 위키를 만들었습니다.
Gumbo

@skurpur : 동적 및 약한 타이핑의 의미를 완전히 바꿔서 수정했습니다.
Rene Saarsoo

아, 죄송합니다. 내가 편집 중이 어서 변경 사항을 덮어 썼습니다.
Rene Saarsoo

3
-1. 이것을 읽어야 합니다 .
missingfaktor

48

JavaScript는 약한 유형 입니다. 확실히 "untyped"는 아니지만 약한 유형의 특성은 암시 적 변환 측면에서 많은 유연성을 허용합니다.

JavaScript도 동적으로 입력됩니다. 이 타이핑 방법은 "오리 타이핑"으로 알려진 것을 허용합니다 .

비교를 위해 JavaScript는 강력한 형식이 아니며 정적으로 형식지정 되지 않았습니다 . 때로는 무언가 가 아닌 것을 이해 하면 그것이 무엇인지 더 잘 볼 수 있습니다.


2
-1. 이것을 읽어야 합니다 .
missingfaktor

3
이 답변은 가장 많이 득표 한 답변보다 훨씬 낫고 훨씬 정확합니다.
Alex W

3
@JimboJonny : 맞지 않습니다. 어셈블리 개발자가 있지 않는 한 모든 언어가 입력되었다고 말하는 것이 너무 정확하지 않습니다. Untyped는 유일한 작업이 비트 조작에 직접 적용된다는 것을 의미합니다. 그러나 Javascript에는 toString () 및 parseInt () 메서드가 있습니다. 그보다 더 많이 입력하지 마십시오.
Suamere 2015

2
@Suamere-여기 O'Reilly 의 "Javascript : The Definitive Guide" 의 인용문이 있습니다 . "JavaScript와 Java 및 C와 같은 언어의 중요한 차이점은 JavaScript가 유형이 없다는 것입니다. 이것은 부분적으로 자바 또는 C 변수가 선언 된 특정 유형의 데이터 만 보유 할 수있는 Java 또는 C 변수와 달리 JavaScript 변수가 모든 데이터 유형의 값을 보유 할 수 있음을 의미합니다.”
Jimbo Jonny 2015

3
따라서 일부 친구가 학계 사람들이 "동적으로 입력 된"을 의미하기 위해 "유형 없음"이라는 단어를 의도적으로 사용한다고 주장하는 BS를 구입하는 경우. 그렇다면 네, JavaScript는 모든 증명에서 유형이 지정되지 않습니다. 그러나 "untyped"가 실제로 "동적으로 입력 된"언어를 나타내는 데 잘못 사용 되었다는 것을 알고 있다면 dang 언어를 "동적으로 입력 된"이라고 부르십시오. tinyurl.com/czhcv54
Suamere 2015

8

저자의 관점에서 JavaScript는 다음과 같이 분류됩니다. Dynamically typed . Wiki에 따르면 동적 유형 언어는 컴파일러 대신 런타임에 유형 검사를 수행하는 반면 Weakly Typed는 코드 내에서 즉시 유형을 변경하는 기능을 나타냅니다. 예, 동적으로 입력되고 약하게 입력됩니다.


6

많은 프로그래머를 혼란스럽게하는 문제는 이와 같은 정의가 어딘가에서 표준화되지 않았다는 것입니다. 형식화되지 않은 프로그래밍 언어 라는 용어 는 모호합니다. 데이터 유형 이없는 언어 또는 유형지정되지 않은 람다 미적분 변형 인 언어를 참조합니까? ?

JavaScript / ECMAScript에는 유형 시스템이 있으며 모든 함수의 도메인은 모든 참조 사양 유형을 허용합니다. 즉, 실제로 JavaScript에는 단일 데이터 유형이 있습니다. 이것은 매우 진보 된 JavaScript 프로그래머에게 더 중요한 구현 문제입니다. 일반적인 자바 스크립트 프로그래머는 초록 에만 관심이 있습니다. 는 ECMAScript에서 지정한 언어 데이터 유형 이 있습니다.

연구 자나 이론적 컴퓨터 과학자가 아닌 일상적인 프로그래머의 맥락에서, 대부분의 사람들이 람다 미적분을하지 않기 때문에 untyped 라는 용어 는 잘못된 이름입니다. 따라서이 용어는 대중을 혼동하고 JavaScript에 단순히 사실이 아닌 데이터 유형이 없다고 선언하는 것처럼 보입니다. 지금까지 사용해 본 사람이라면 누구나 typeofJavaScript에 고유 한 언어 데이터 유형이 있다는 것을 알고 있습니다.

var test = "this is text";
typeof(test);

수확량

"끈"

ECMAScript를이 언어에 대해 다음과 같은 유형의 정의 : undefined, null, string, boolean, number,object

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

JavaScript에 대한보다 정확한 지정은 암시 적으로 형식화되거나, 동적으로 형식화되거나, 약하게 / 느슨하게 형식화되거나 (또는 ​​이들의 일부 조합) JavaScript가 명시 적으로 지정할 필요가 없기 때문에 형식을 암시 적으로 만드는 경우에 따라 형식 강제 를 사용한다는 점 에서 변수 유형. float와 integer 등을 구분하는 일부 언어와 달리 하나의 number유형을 사용 하여 모든 숫자를 포함하고 앞서 언급 한 유형 강제 변환 [ECMAScript Spec의 섹션 9] 을 사용 하기 때문에 약한 유형 에 해당 합니다. 매우 특정한 데이터 유형을 갖는 강력한 유형의 언어 (즉 int,float ).

정적 및 동적 유형 언어의 정의는 표준화되지 않았지만 컴퓨터가 진화하기 시작했을 때 바이트 크기도 아니 었습니다. 정적 및 동적 타이핑은 대부분 특정 언어 기능의 존재를 나타냅니다. 그중 하나는 런타임시 유형 검사 또는 동적 유형 검사 라고 합니다. JavaScript를 사용한 적이있는 경우 유형을 확인하기 위해 런타임까지 확실히 기다린다는 것을 이미 알고 있으므로 TypeError코드 실행 중에 예외가 발생합니다. 여기에 예

가장 많이 뽑은 대답은 JavaScript 함수의 다형성Association Fallacy 인 문자 그대로 모든 것을 허용하는 함수 (Lambda Calculus의 유형이 지정되지 않은 변형과 마찬가지로)와 혼동되는 것이라고 생각합니다 .


잘못된 이름은 아니지만 문맥이 중요합니다. stackoverflow.com/questions/9154388/을
Andreas Rossberg 2014-06-08

@AndreasRossberg 그것은 절대적 이다 잘못된 이름. 뻔뻔스럽게 자기 홍보 링크 에서 당신이 언급하는 것은 타입 시스템입니다. 용어가 잘못된 이름 인 이유는 모호하기 때문입니다. 대부분의 프로그래머 는 형식화되지 않은 언어 에 대해들을 때 데이터 형식형식 시스템이 아니라고 생각 합니다 . 나는 Konrad Rudoph의 말이이 점을 고향으로 이끌 것이라고 생각 합니다.
Alex W

여기에서 반복하는 대신 이전 답변을 참조하는 것이 "부끄럽지"않은 이유를 모르겠습니다. 또한 맥락이 중요하다고 분명히 말했습니다. K. Rudolph의 불만과는 대조적으로, 문학에서 "유형 체계"에 대한 완벽하게 일관되고 널리 받아 들여지는 정의가 있는데, 나는 하나를 인용했습니다. 물론, 당신의 맥락에서 그들이 혼란스러워 할 수는 있지만 그것이 "잘못 명기"가되는 것은 아닙니다.
Andreas Rossberg 2014 년

@AndreasRossberg 컨텍스트는 여기서 매우 중요합니다. 가장 많이 득표 한 답변은 "untyped = no type declarations"라고 말하며 이는 명백히 잘못된 것입니다. 내가 말하는 것은이 맥락에서 그것이 잘못된 이름이라는 것입니다. 여기에서 람다 미적분을 언급 한 사람은 아무도 없으며 이렇게하는 것은이 간단한 경우에 다소 허식 적입니다.
Alex W

1

JavaScript를 사용하면은 무엇인지 물어보고 typeof(your_variable)유형을 비교할 수 있습니다 : 5==="5"returns false. 따라서 나는 당신이 그것을 무형이라고 부를 수 있다고 생각하지 않습니다.

동적이며 약한 유형으로 추정됩니다. 덕 타이핑 (andrew의 링크 참조)을 사용하고 클래스와 상속 대신 프로토 타이핑을 통해 OOP를 제공한다는 것을 알고 싶을 수 있습니다 .


변수를 입력하는 것은 값의 캐스팅과 관련이 없습니다. 변수 유형 선언과 관련이 있습니다. 자바 스크립트는 이것에 대한 구조를 전혀 가지고 있지 않습니다. 그래서 자바 스크립트 작성자가 너무 적기 때문에 그 개념을 이해하는 사람도 거의 없으며, 많은 사람들이 변수 유형을 비교하거나 캐스팅하는 것과 관련하여 변수 유형을 잘못 해석하는 이유입니다. JS에서는 선언 할 수 없습니다 String a = "blah";또는 var a:String = 'blah';AT ALL (즉, 변수를 입력). 그것이 유형이 지정되지 않은 이유입니다.
Jimbo Jonny

0

입력하는 동안 ( "typeof someVar"를 물어보고 특정 유형을 배울 수 있지만 매우 약합니다.

주어진:

  var a = "5";

a가 문자열이라고 말할 수 있습니다. 그러나 다음과 같이 작성하면 :

  var b = a + 10;

b는 15와 같은 정수이므로 a는 정수처럼 작동합니다. 물론 다음과 같이 작성할 수 있습니다.

  var c = a + "Hello World";

c는 "5Hello World"와 같으므로 a는 다시 문자열처럼 작동합니다.


1) 값 캐스팅! = 변수 입력 2) 약하지 않고 존재하지 않습니다. 자바 스크립트에서는 변수를 입력 할 수 없습니다.
Jimbo Jonny

이 답변이 왜 두 개의 반대표를 받았는지 궁금합니다. 내가 약한 타이핑에서 찾은 정의는 정확히 다음과 같이 말합니다. 값의 유형은 사용 방법에 따라 결정됩니다.
aioobe

그래도 정확합니까? 내가 얻을 b같음 510: ideone.com/BRcSW7
aioobe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.