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

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



답변

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


(출처 : no.gd )

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

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

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

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

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

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

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

입력 된 언어와 달리 :

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

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

또한보십시오:


답변

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

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

    "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라고 주장하는 경우 실제 적용이 아니라 학문적 이론을위한 것입니다.


답변

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

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

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


답변

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


답변

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

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의 유형이 지정되지 않은 변형과 마찬가지로)와 혼동되는 것이라고 생각합니다 .


답변

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

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


답변

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

주어진:

  var a = "5";

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

  var b = a + 10;

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

  var c = a + "Hello World";

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