나는 모든 실제 주장을 실제 사용 사례에 근거하고 있습니다. 실제적이고 완전하며 흥미롭고 유용한 응용 프로그램에서 사용하는 예제로 백업 할 수없는 반론은 유효하지 않습니다. 다른 사람들이 가진 "언어 데모"를 보았습니다. 프로토 타입과 동적 타이핑이 C #에서보다 몇 줄 더 짧은 예제를 만드는 방법을 자세히 설명하는 블로그 게시물을 보았습니다. 당신이 실제 쓰기 문제에
마이크로 데모와 장난감보다는 코드 . 그래서 여기 JS에 대한 그립이 있습니다.
a) 마술 'this'. 이것이 아닌 경우를 제외하고 이것은 이것입니다. JavaScript는 항상 'this'변수에 대한 적절한 컨텍스트를 잃어 버리는 것을 제외하고는 모든 곳에서 익명 함수를 사용하도록 강요하므로 "var _this = this"와 같은 구피 코드가있는 곳에서 사용합니다. 콜백 또는 다른 함수 내부. 언젠가 나는 이름을 바꾼 'this'를 사용하지 않는 내가 작성하려고하는 함수의 수가 실제로하는 것보다 작다는 것을 맹세합니다.
b) 1 + "1"-1 = 10. 또한 "1"+ 0 = "10". 그렇습니다. 실제로 다른 응용 프로그램의 버그로 인해 숫자로 예상되는 데이터가 문자열로 JSON 파일에서로드 된 결과가 좋지 않은 응용 프로그램에 버그가 발생했습니다. 모든 로딩 코드를 업데이트하여 모든 유형의 변환을 추가해야했습니다. 숫자가되어야 할 때 문자열이나 객체가 아닌 숫자 또는 null이 아닌 숫자가되기를 정말로 기이합니다. 대부분의 측면에서 JavaScript와 매우 유사한 Lua는 추가 및 문자열 연결에 동일한 연산자를 사용할만큼 지연되지 않으므로이 문제를 해결했습니다.
c) 기본적으로 전역 변수. 따라서 변수 선언에 대해 생각할 필요가 없기 때문에 동적 타이핑이 "더 쉬워진다"는 주장을하더라도 JavaScript는 새 식별자 앞에 'var'을 넣어서 해당 인수를 창 밖으로 내 보냅니다. . 그리고 잊어 버리면 조용히 조여줍니다.
d) 수업 대신 시제품. 대규모 응용 프로그램 아키텍처에서 프로토 타입의 고유 한 쓸모없는 문제를 해결하기 위해 자체 클래스 시스템을 연결하지 않는 대규모 실제 JavaScript 응용 프로그램은 거의 없습니다. 동일한 앱은 기본 JavaScript 유형을 확장하기 위해 프로토 타입을 최소한으로 사용합니다. JS는 디자인이 잘못되어 있기 때문에 두 가지 흥미로운 내장 유형조차도 기대했던 기능의 절반이 부족합니다.
e) 가치 별 유형을 만들 수 없음. 이것은 실제로 C ++ / D를 제외한 거의 모든 언어에서 빈번한 문제입니다. JavaScript를 사용하여 WebGL 앱을 작성하는 사람들은 JavaScript에 대한 모든 선형 대수 라이브러리를 살펴보십시오. 3D 앱에서는 스칼라보다 벡터를 거의 더 자주 사용합니다. 앱의 모든 정수가 참조로 전달되어 "a = 1; b = a; b ++"가 a와 b를 모두 2로 만들었다 고 상상해보십시오. 세 개의 작은 구성 요소 벡터는 모두 완전한 객체입니다. 그것들은 참조로 전달됩니다 (사실 WebGL 게임에서 버그의 거의 절반의 원인). 그것들은 대량으로 존재하고 힙 할당되며 가비지 수집되어 GC에 많은 압력을 가하여 간단한 WebGL 게임에서도 GC 일시 중지를 유발할 수 있습니다. 개발자가 어리석게 복잡한 후프를 뛰어 넘어 새 벡터를 만드는 것이 논리적 인 모든 곳에서 새 벡터를 만드는 것을 피하지 않는 한. 연산자 오버로드를 가질 수 없으므로 기본 작업을 수행하기 위해 매우 크고 못생긴식이 있습니다. 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까? 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까? 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까?
f) 내장 기능이 필요하지 않습니다. 진심으로, 여전히. 타사 라이브러리가 존재하지만 거의 모든 라이브러리에는 일종의 버그가 있습니다. 최소한 Chrome에서 실제 개발을 수행하는 데 어려움을 겪는 캐싱 문제는 적어도 엉덩이에 어려움을 겪습니다.
g) 동적 타이핑. 네, 그 주장을 기꺼이 시작하겠습니다. 작은 웹 응용 프로그램이나 웹 페이지 작성을 멈추고 마우스를 한 번만 클릭하거나 요청 / 응답주기보다 오래 지속되는 데이터가있는 큰 응용 프로그램을 작성하기 시작하면 가장 큰 사실을 알기 시작합니다. 나중에 실수로 처리하고 누락 된 메소드 또는 멤버가 실제 실수와 완전히 다른 코드 비트로 인해 충돌이 발생합니다. 즐거운 시간. 예, Java는 정적 입력을 악의적으로 보이게 만듭니다. 아니요, Java / C # / C ++는 정적 타이핑을 수행하는 유일한 방법이 아닙니다. 타입 추론, 암시 적 인터페이스 바인딩 등은 모든 버그없이 다이나믹 한 타이핑의 "처리하기 쉽고 많은 키 입력이 필요없는"이점을 제공합니다. 두 번째로 많이 사용되는 웹 언어 인 ActionScript 3은 실제로 JS / ECMAScript와 동일하지만 정적으로 입력됩니다. 따로, C / C ++ 앱보다 Fedora 데스크톱의 Python 앱에서 더 많은 충돌이 발생합니다 (실제로 데스크톱 크래시의 C / C ++ 앱은 전혀 생각하지 않습니다). 누락 된 멤버 예외 == 앱 개발 및 유지 관리가 훨씬 쉬워졌습니다.
h) 속도. 예, 한 명의 대학생 주니어가 몇 가지로 작성할 수있는 저급 C 컴파일러보다 JS를 거의 절반으로 빠르게 만들기 위해 언어 런타임에 투입된 수많은 수 많은 나쁜 엉덩이 개발자들이 엄청나게 엄청난 노력을 기울였습니다. 개월. LuaJIT은 기본 언어 제한 측면에서 JS와 동일한 보트에 있지만 어쨌든 모든 JavaScript 구현보다 더 잘 수행합니다. V8의 모든 JS 최적화가 실제로 무엇인지 이해하지 못하는 사람들 할JS가 놀라운 속도로 놀라운 일을 할 수 있다고 주장하고 싶지만 현실은 모든 최적화가 기본적으로 변수의 유형을 파악하기 위해 코드를 분석하는 데 매우 열심히 노력하고 약간 지연된 정적 인 유형으로 컴파일하는 것입니다 언어의 컴파일러가 그렇게 할 것입니다. " 아, 그리고 추적이 있지만 정적 형식의 언어에서도 추적이 작동합니다 (생성 된 기계 코드에서 유형 가드가 필요 없기 때문에 더 잘 작동합니다). 실제로 이러한 whizbang 최적화 중 하나가 JS에 의해 또는 JS를 위해 개발 된 것은 아닙니다. 대부분은 연구용 JVM (Java는 악의입니다!) 또는 고전적인 OOP 언어 (시제품은 대단합니다!)에서 가져 왔습니다.
i) IntelliSense도 가능하지 않습니다. 텍스트 편집기에서 foo.js의 187 행에있는 해당 변수에 어떤 메소드가 있는지 알고 싶습니까? 너무 나쁘다. 코드가 초기화 된 위치를 파악할 때까지 코드를 추적 한 다음 코드를 추적하여 프로토 타입의 내용을 찾으십시오. 그런 다음 프로토 타입을 동적으로 변경하는 코드가 없기를 바랍니다. 사실, 다른 방법으로 값에 대한 유용한 정보를 찾는 것이 JavaScript apologists가 JavaScript의 편리함과 단순성을 영화 롭게하기 위해 사용하는 toy_web_app.html 사이트보다 큰 코드베이스에서는 기본적으로 불가능하기 때문에 브라우저에서 실행하고 중단 점을 설정하십시오. 일부 코드 편집기는 실제로 더 잘하기 위해 열심히 노력하며, 때로는 간단한 경우에 한 번 성공하는 경우도 있습니다.
j) 장점이 없다. JavaScript는 다른 동적 형식 언어와 비교할 때 특별하지 않습니다. Lua, Python, Ruby 등으로는 불가능한 일을 전혀 할 수 없다 언어. JS는 일반적으로 사용 가능한 다른 언어와 비교하여 장점이 없습니다. 플러그인없이 웹 브라우저에서 기본적으로 실행되는 것을 제외하고는. 이것이 세상에서 유일하게 인기가있는 이유입니다. 사실, 그것이 이벤트 인 유일한 이유입니다 가 존재. "10 년 전에 누군가가"잘 설계되고 잘 정립 된 기존 언어를 브라우저에 드롭하고 다른 사람들이 NetScape이 제안한이 구미스러운 작은 hackjob을 사용하도록하는 대신 동일한 작업을하도록하겠습니다. ""오늘날 웹의 모습이 훨씬 달라졌습니다. Chrome에서 지원되는 언어로 Python을 Chrome에 넣은 경우 미래를 상상해보십시오. 또는 실제로 다음과 같이 상상해보십시오. Google은 C / C ++를 지원되는 언어 (http://code.google.com/p/nativeclient/)로 Chrome에 드롭합니다.