자바스크립트
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
자바스크립트는 웹 페이지의 동적 요소 구현을 위해 1995년 넷스케이프 커뮤니케이션스에서 개발된 스크립트 언어이다. HTML, CSS와 함께 웹의 핵심 기술로, 웹사이트의 99% 이상에서 사용된다. 초기에는 넷스케이프 내비게이터에서 "라이브스크립트"로 시작하여 "자바스크립트"로 변경되었으며, 마이크로소프트의 J스크립트와 표준화 과정을 거쳐 ECMAScript 표준을 따르고 있다. 현재는 웹 프론트엔드, 백엔드, 데스크톱 및 모바일 애플리케이션 개발 등 다양한 분야에서 활용되며, Node.js와 같은 기술을 통해 웹 브라우저 밖에서도 사용된다. 자바스크립트는 프로토타입 기반 객체 지향, 함수형 프로그래밍을 지원하며, 동적 타이핑과 약한 타이핑을 특징으로 한다. 웹 브라우저, 개발 도구, 보안 기술 등 다양한 관련 기술과 함께 발전해왔으며, 크로스 사이트 스크립팅(XSS)과 사이트 간 요청 위조(CSRF)와 같은 보안 문제에 대한 대비가 필요하다.
더 읽어볼만한 페이지
- 1995년 개발된 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. - 1995년 개발된 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 객체 기반 프로그래밍 언어 - 비주얼 베이직
비주얼 베이직은 1991년 마이크로소프트에서 출시된 GUI 기반 응용 프로그램 개발에 강점을 가진 프로그래밍 언어이며, 윈도우용 응용 프로그램 및 데이터베이스 조작 프로그램 개발에 주로 사용되었고, 2005년 표준 지원이 중단되었다. - 객체 기반 프로그래밍 언어 - 타입스크립트
타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다. - 웹 프로그래밍 - 블레이저 (웹 프레임워크)
블레이저는 마이크로소프트가 개발한 웹 프레임워크로, .NET을 사용하여 웹 애플리케이션을 구축하며, C#과 Razor 구문을 사용해 컴포넌트를 만들고, 서버 측 및 클라이언트 측 렌더링을 모두 지원한다. - 웹 프로그래밍 - 웹 컴포넌트
웹 컴포넌트는 재사용 가능한 웹 UI 요소를 만들기 위한 웹 표준 기술로, 커스텀 요소, 섀도 DOM, HTML 템플릿을 핵심 요소로 하며, 스타일과 동작을 캡슐화하고 다양한 프레임워크와의 상호 운용성을 제공하며 웹 접근성 향상에 기여한다.
자바스크립트 - [IT 관련 정보]에 관한 문서 | |
---|---|
일반 정보 | |
![]() | |
패러다임 | 멀티 패러다임: 이벤트 기반 프로그래밍, 함수형 프로그래밍, 명령형 프로그래밍, 절차적 프로그래밍, 객체 지향 프로그래밍 |
설계자 | 브렌던 아이크 (초기 넷스케이프) 및 ECMAScript 표준에 기여한 다른 사람들 |
개발자 | 넷스케이프 커뮤니케이션즈, Mozilla Foundation |
형식 | 동적 타이핑, 약한 타이핑, 덕 타이핑 |
메모리 관리 | 가비지 컬렉션 |
구현체 | V8, JavaScriptCore, SpiderMonkey, Chakra, KJS, Nitro, Rhino |
영향을 받은 언어 | 액션스크립트, ArkTS, AssemblyScript, 커피스크립트, Dart, Haxe, JS++, Opa, TypeScript |
영향을 준 언어 | Dart, , Google Apps Script, TypeScript |
발표 연도 | 1995년 12월 4일 |
파일 확장자 | .js, .cjs, .mjs |
웹사이트 | ECMAScript 표준 |
기술 정보 | |
최신 버전 출시일 | }} |
최신 미리보기 출시일 | }} |
언어적 영향 | |
영향 받은 언어 | Java Scheme Self AWK HyperTalk |
2. 역사
1993년, 일리노이 대학교 어배너-섐페인의 NCSA는 최초의 대중적인 그래픽 웹 브라우저인 NCSA 모자이크를 출시하였다.[9] 1994년, 모자이크 커뮤니케이션스는 모자이크 넷스케이프를 만들기 위해 오리지널 NCSA 모자이크 개발자들을 고용하였으나, NCSA 모자이크와 코드는 의도적으로 공유하지 않았다. 이 기업 브라우저의 내부 코드명은 모질라였으며, 첫 버전인 모자이크 넷스케이프 0.9는 1994년 말에 출시되어 4개월 후 브라우저 시장의 3/4를 잠식하며 1990년대에 주된 웹 브라우저가 되었다.[136] NCSA의 상표 소유권 문제를 회피하고자 브라우저는 "넷스케이프 내비게이터"로, 기업은 "넷스케이프 커뮤니케이션스"로 이름을 변경하였다.[10] 넷스케이프 커뮤니케이션스는 웹이 더 동적으로 변화할 필요가 있었음을 실감했고, 설립자 Marc Andreessen은 HTML에 코드를 웹 페이지 마크업으로 직접 작성하면서 웹 디자이너들과 파트타입 프로그래머들이 이미지, 플러그인 등의 요소를 쉽게 조합할 수 있는 글루 언어(glue language)가 필요하다고 믿었다.[11]
1995년, 넷스케이프 커뮤니케이션스는 스킴 프로그래밍 언어를 넷스케이프 내비게이터에 임베디드하기 위해 브렌던 아이크를 영입하였다.[137] 넷스케이프는 썬 마이크로시스템즈와 협력하여 넷스케이프 내비게이터에 자바를 포함시키기로 했으며, 자신들이 만들 스크립트 언어가 자바를 보완하고 비슷한 문법을 채용하는 것이 좋겠다고 생각했다.[138] 펄, 파이썬, Tcl 등은 배제되었다. 경쟁적인 제안에 대항하여 자바스크립트 개념을 방어하기 위해 프로토타입이 필요했고, 아이크는 1995년 5월 10일 안에 이를 작성했다.
원래 '''모카'''(Mocha)라는 이름으로 개발되었으나, 공식적으로 라이브스크립트(LiveScript)로 불렸으며 1995년 9월 넷스케이프 내비게이터 2.0 베타 릴리스 때 공개되었다.[139] 이후 12월 넷스케이프 내비게이터 2.0 베타 3에서 '''자바스크립트'''로 이름이 변경되었다.[140] 이는 넷스케이프가 당시 인기있는 웹 프로그래밍 언어로서 자바스크립트를 내밀기 위한 마케팅 전략이었다.[141]
마이크로소프트는 웹 페이지 향상 언어로서 자바스크립트의 성공에 자극받아 J스크립트로 알려진 호환 언어를 개발하게 되었다.[16] J스크립트는 1996년 8월에 출시된 인터넷 익스플로러 브라우저 3.0부터 지원되기 시작했다. IE 브라우저에서의 자바스크립트 사용은 실제로는 J스크립트의 사용을 의미하는 것이었다. 1995년 인터넷 익스플로러를 처음 선보인 마이크로소프트는 넷스케이프와의 브라우저 전쟁에서 자바스크립트에 대응하기 위해 자체 인터프리터인 JScript를 만들었다.[16]
1996년 마이크로소프트는 JScript를 처음 출시하면서 CSS에 대한 초기 지원과 HTML에 대한 확장을 함께 제공했다. 그러나 이러한 구현은 넷스케이프 내비게이터의 해당 기능과 눈에 띄는 차이를 보였다.[17][18] 이 때문에 개발자들은 두 브라우저 모두에서 웹사이트가 제대로 작동하도록 만드는 데 어려움을 겪었고, 수년 동안 "넷스케이프에서 최적화됨" 및 "인터넷 익스플로러에서 최적화됨" 로고가 널리 사용되었다.[17][19]
넷스케이프는 자바스크립트의 표준화를 위해 ECMA 인터내셔널에 자바스크립트를 제출했으며, 1997년에 최초의 ECMAScript 표준(ECMA-262)이 발표되었다.[149] 표준화 과정은 계속되었으나, 마이크로소프트의 소극적인 참여로 인해 ECMAScript 4는 보류되었다.
2000년대 초 인터넷 익스플로러가 지배하던 시기에는 클라이언트 측 스크립팅이 정체되어 있었으나, 2004년 모질라가 파이어폭스 브라우저를 출시하면서 변화가 시작되었다. 파이어폭스는 많은 사람들로부터 호평을 받으며 인터넷 익스플로러로부터 상당한 시장 점유율을 차지했다.[21]
2005년, 모질라는 ECMA 인터내셔널에 가입했고, E4X 표준에 대한 작업이 시작되었다. 모질라는 매크로미디어(후에 어도비 시스템즈에 인수됨)와 공동 작업을 진행했는데, 매크로미디어는 ECMAScript 4 초안을 기반으로 하는 ActionScript 3 언어에 E4X를 구현하고 있었다. 목표는 ActionScript 3을 새로운 ECMAScript 4로 표준화하는 것이었다. 어도비 시스템즈는 타마린 구현을 오픈 소스 프로젝트로 공개했지만, 타마린과 ActionScript 3는 기존의 클라이언트 측 스크립팅과 너무 달랐고, 마이크로소프트의 협력이 없었기에 ECMAScript 4는 결실을 맺지 못했다.
한편, ECMA 작업과 관련 없는 오픈 소스 커뮤니티에서 2005년 제시 제임스 가렛이 Ajax라는 용어를 만들고, 자바스크립트를 핵심으로 하는 일련의 기술들을 설명하는 백서를 발표하여, 전체 페이지를 다시 로드할 필요 없이 데이터를 백그라운드에서 로드할 수 있는 웹 애플리케이션을 만들 수 있게 했다. 이는 오픈 소스 라이브러리와 그들을 중심으로 형성된 커뮤니티를 주도로 자바스크립트의 부흥기를 촉발했다. jQuery, Prototype, 도조 툴킷, 그리고 무툴스를 포함한 많은 새로운 라이브러리가 만들어졌다.
구글은 2008년에 경쟁사보다 빠른 V8 자바스크립트 엔진을 탑재한 크롬 브라우저를 출시했다.[22][23] 핵심 혁신은 JIT 컴파일이었고,[24] 다른 브라우저 벤더들은 JIT를 위해 자체 엔진을 개편해야 했다.[25]
2008년 7월, 여러 관계자들이 오슬로에서 컨퍼런스를 개최했고, 2009년 초 모든 관련 작업을 통합하고 언어를 발전시키기로 합의하여 2009년 12월에 ECMAScript 5 표준이 발표되었다.
차세대 자바스크립트로서 "JavaScript 2.0"을 만들려는 움직임이 두 번 있었지만, 모두 성사되지 못했다. 첫 번째는 ECMAScript 3가 완성된 후 2000년부터 2003년에 걸쳐 발생했지만, 넷스케이프와 마이크로소프트의 대립으로 인해 결론을 맺지 못했다. 당시 넷스케이프가 제안했던 안은 어도비의 ActionScript 2.0으로 이어졌고, 마이크로소프트의 안은 JScript .NET으로 계승되었다.
그 후에도 넷스케이프 및 모질라 재단은 ECMAScript의 제정과 병행하여 자바스크립트를 확장하며 JavaScript 1.x 계열로 버전업을 거듭했다. ECMAScript 측에서는 ECMAScript 4의 제정이 1999년 이후 진행되었으며[118], 2006년 시점에서 모질라 재단은 이를 기반으로 JavaScript 2.0을 만들 것을 표명했다. 모질라는 ECMAScript 4의 제정에 따라 파이썬의 문법을 일부 도입한 안을 제안했으며, 자체적으로 이를 구현했다[119]。
그러나 이후 ECMAScript의 표준화 작업이 모질라, 어도비, 오페라, 구글 등이 지지하는 ECMAScript 4와 마이크로소프트, 야후! 등이 지지하는 ECMAScript 3.1로 사실상 분열된 영향으로 인해 2008년 8월에 큰 방향 전환이 있었고, ECMAScript 4는 폐기되었으며 후자가 ECMAScript 5로 2009년에 표준화되었다. ECMAScript 4에 포함될 예정이었던 기능은 새로 발족한 "'''ECMAScript Harmony'''"로 연기되었다[120]。이는 후에 ECMAScript 2015로 표준화가 완료되었다. 한편, ECMAScript 5가 표준화된 이후, 모질라의 자바스크립트 구현은 ECMAScript 준수를 표방하게 되었고[121], 버전 번호에 의한 호칭은 이루어지지 않게 되었고, JavaScript 2.0은 사실상 사어가 되었다.
2000년대 초 인터넷 익스플로러가 지배하던 시기에는 클라이언트 측 스크립팅이 정체되어 있었다.[21] 2004년 넷스케이프의 후계자인 모질라가 파이어폭스 브라우저를 출시하면서 경쟁이 다시 시작되었고, 파이어폭스는 많은 사람들로부터 호평을 받으며 인터넷 익스플로러로부터 상당한 시장 점유율을 차지했다.[21]
2005년, 제시 제임스 가렛은 Ajax라는 용어를 만들고, 자바스크립트를 핵심으로 하는 일련의 기술들을 설명하는 백서를 발표했다. 이를 통해 전체 페이지를 다시 로드할 필요 없이 데이터를 백그라운드에서 로드할 수 있는 웹 애플리케이션을 만들 수 있게 되었다. 이는 jQuery, Prototype, 도조 툴킷, 무툴스를 포함한 많은 새로운 라이브러리가 만들어지는 등 자바스크립트의 부흥기를 촉발했다.
구글은 2008년에 경쟁사보다 빠른 V8 자바스크립트 엔진을 탑재한 크롬 브라우저를 출시했다.[22][23] 핵심 혁신은 JIT 컴파일이었고,[24] 다른 브라우저 벤더들은 JIT를 위해 자체 엔진을 개편해야 했다.[25] 이러한 각 웹 브라우저 벤더들의 속도 향상 경쟁은 현재도 진행형이다.
2009년 12월에 발표된 ECMAScript 5 표준은 모든 관련 작업을 통합하고 언어를 발전시키기로 한 2008년 7월 오슬로 컨퍼런스에서의 합의에 따른 결과였다. 2015년에 발표된 ECMAScript 6 (ECMAScript 2015)에서는 클래스, 모듈, 화살표 함수 등 현대적인 기능들이 추가되었다.[26]
라이언 달이 2009년에 Node.js를 개발하면서 웹 브라우저 밖에서 자바스크립트 사용이 크게 증가했다. Node는 V8 엔진, 이벤트 루프, I/O API를 결합하여 독립 실행형 자바스크립트 런타임 시스템을 제공한다.[27][28]
2009년 라이언 달이 개발한 Node.js는 자바스크립트를 웹 브라우저 밖에서도 사용할 수 있게 만들었다.[117] Node.js는 서버 측 개발, 데스크톱 애플리케이션 개발 등 다양한 분야에서 자바스크립트의 활용 범위를 넓혔다. Node.js에는 파일 시스템에 접근하기 위한 `fs` API(모듈)나 실행 프로세스와 상호 작용하는 `process` API 등이 정의되어 있다. 웹 브라우저가 갖는 강력한 샌드박스 요구 사항이 완화된 점이 Node.js API의 특징 중 하나이다. npm(Node Package Manager)은 자바스크립트 생태계를 더욱 풍부하게 만들었다.
ECMAScript 6가 2015년에 발표되면서 광범위한 추가 및 개선 사항들이 공식화되어 언어에 대한 야심찬 작업이 여러 해 동안 지속되었다.[26] 라이언 달이 2009년에 Node.js를 개발하면서 웹 브라우저 밖에서 자바스크립트 사용이 크게 증가했다. Node는 V8 엔진, 이벤트 루프, I/O API를 결합하여 독립 실행형 자바스크립트 런타임 시스템을 제공한다.[27][28] 2018년 기준으로 Node는 수백만 명의 개발자가 사용했으며,[29] npm은 전 세계 패키지 관리자 중 가장 많은 모듈을 보유하고 있었다.[30]
ECMAScript 초안 사양은 현재 깃허브에서 공개적으로 관리되며,[31] 매년 정기적으로 스냅샷을 통해 에디션이 생성된다.[31] 언어에 대한 잠재적인 개정 사항은 포괄적인 제안 과정을 통해 검토된다.[32][33] 이제 개발자는 에디션 번호 대신, 예정된 기능의 상태를 개별적으로 확인한다.[31]
현재 자바스크립트 생태계는 많은 라이브러리와 웹 프레임워크, 확립된 프로그래밍 관행, 웹 브라우저 밖에서의 상당한 자바스크립트 사용을 특징으로 한다.[14] 싱글 페이지 애플리케이션과 기타 자바스크립트 중심 웹사이트의 증가와 함께, 개발 프로세스를 지원하기 위해 여러 개의 트랜스파일러가 만들어졌다.[106] 2000년경, 브라우저 간의 호환성이 어느 정도 확립되면서, 구글이나 아마존 등 GAFAM도 자바스크립트를 적극적으로 활용하기 시작했다.
자바스크립트는 웹 브라우저의 확장 기능을 개발하기 위한 언어로도 사용되었다. 초기에는 확장 기능용 API가 통일되어 있지 않았지만, 호환성을 높이려는 움직임이 있다[117]。
초기에는 인터프리터 방식으로 실행되는 것이 일반적이었기 때문에 자바스크립트의 실행 속도가 그다지 빠르지 않았지만, 현재는 JIT 컴파일 등을 이용한 각종 최적화가 이루어지고 있으며, 각 웹 브라우저 벤더 모두 속도 향상을 위해 경쟁하고 있다. 더 나아가, 이러한 고속화를 바탕으로 서버 사이드에서도 Node.js처럼 자바스크립트를 사용하는 움직임이 나타났다.
버전 | 출시일 | 동등한 기술적 내용 | 넷스케이프 내비게이터 | 모질라 파이어폭스 | 인터넷 익스플로러 | 오페라 | 사파리 | 구글 크롬 |
---|---|---|---|---|---|---|---|---|
1996년 3월 | 2.0 | 3.0 | ||||||
1996년 8월 | 3.0 | |||||||
1997년 6월 | 4.0-4.05 | 3 | ||||||
1998년 10월 | ECMA-262 1st + 2nd edition | 4.06-4.7x | 4.0 | 5[149] | ||||
넷스케이프 서버 | 6 | |||||||
2000년 11월 | ECMA-262 3rd edition | 6.0 | 1.0 | 5.5 (JScript 5.5), 6 (JScript 5.6), 7 (JScript 5.7), 8 (JScript 5.8) | 7.0 | 3.0-5 | 1.0-10.0.666 | |
2005년 11월 | 1.5 + array extras + array and string generics + E4X | 1.5 | ||||||
2006년 10월 | 1.6 + [https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7?redirectlocale=en-US&redirectslug=New_in_JavaScript/1.7#Generators Pythonic generators] + iterators + let | 2.0 | 28.0.1500.95 | |||||
2008년 6월 | 1.7 + generator expressions + expression closures | 3.0 | 11.50 | |||||
1.8 + native JSON support + minor updates | 3.5 | |||||||
2009년 6월 22일 | 1.8.1 + minor updates | 3.6 | ||||||
2010년 7월 27일 | 1.8.2 + new features for ECMA-262 5th edition compliance | 4.0 |
2. 1. 넷스케이프에서의 시작
1993년, 일리노이 대학교 어배너-섐페인의 NCSA는 최초의 대중적인 그래픽 웹 브라우저인 NCSA 모자이크를 출시하였다.[9] 1994년, 모자이크 커뮤니케이션스는 모자이크 넷스케이프를 만들기 위해 오리지널 NCSA 모자이크 개발자들을 고용하였으나, NCSA 모자이크와 코드는 의도적으로 공유하지 않았다. 이 기업 브라우저의 내부 코드명은 모질라였으며, 첫 버전인 모자이크 넷스케이프 0.9는 1994년 말에 출시되어 4개월 후 브라우저 시장의 3/4를 잠식하며 1990년대에 주된 웹 브라우저가 되었다.[136] NCSA의 상표 소유권 문제를 회피하고자 브라우저는 "넷스케이프 내비게이터"로, 기업은 "넷스케이프 커뮤니케이션스"로 이름을 변경하였다.[10] 넷스케이프 커뮤니케이션스는 웹이 더 동적으로 변화할 필요가 있었음을 실감했고, 설립자 Marc Andreessen은 HTML에 코드를 웹 페이지 마크업으로 직접 작성하면서 웹 디자이너들과 파트타입 프로그래머들이 이미지, 플러그인 등의 요소를 쉽게 조합할 수 있는 글루 언어(glue language)가 필요하다고 믿었다.[11]1995년, 넷스케이프 커뮤니케이션스는 스킴 프로그래밍 언어를 넷스케이프 내비게이터에 임베디드하기 위해 브렌던 아이크를 영입하였다.[137] 넷스케이프는 썬 마이크로시스템즈와 협력하여 넷스케이프 내비게이터에 자바를 포함시키기로 했으며, 자신들이 만들 스크립트 언어가 자바를 보완하고 비슷한 문법을 채용하는 것이 좋겠다고 생각했다.[138] 펄, 파이썬, Tcl 등은 배제되었다. 경쟁적인 제안에 대항하여 자바스크립트 개념을 방어하기 위해 프로토타입이 필요했고, 아이크는 1995년 5월 10일 안에 이를 작성했다.
원래 '''모카'''(Mocha)라는 이름으로 개발되었으나, 공식적으로 라이브스크립트(LiveScript)로 불렸으며 1995년 9월 넷스케이프 내비게이터 2.0 베타 릴리스 때 공개되었다.[139] 이후 12월 넷스케이프 내비게이터 2.0 베타 3에서 '''자바스크립트'''로 이름이 변경되었다.[140] 이는 넷스케이프가 당시 인기있는 웹 프로그래밍 언어로서 자바스크립트를 내밀기 위한 마케팅 전략이었다.[141]
2. 2. 마이크로소프트의 채택과 J스크립트
마이크로소프트는 웹 페이지 향상 언어로서 자바스크립트의 성공에 자극받아 J스크립트로 알려진 호환 언어를 개발하게 되었다.[16] J스크립트는 1996년 8월에 출시된 인터넷 익스플로러 브라우저 3.0부터 지원되기 시작했다. IE 브라우저에서의 자바스크립트 사용은 실제로는 J스크립트의 사용을 의미하는 것이었다. 1995년 인터넷 익스플로러를 처음 선보인 마이크로소프트는 넷스케이프와의 브라우저 전쟁에서 자바스크립트에 대응하기 위해 자체 인터프리터인 JScript를 만들었다.[16]1996년 마이크로소프트는 JScript를 처음 출시하면서 CSS에 대한 초기 지원과 HTML에 대한 확장을 함께 제공했다. 그러나 이러한 구현은 넷스케이프 내비게이터의 해당 기능과 눈에 띄는 차이를 보였다.[17][18] 이 때문에 개발자들은 두 브라우저 모두에서 웹사이트가 제대로 작동하도록 만드는 데 어려움을 겪었고, 수년 동안 "넷스케이프에서 최적화됨" 및 "인터넷 익스플로러에서 최적화됨" 로고가 널리 사용되었다.[17][19]
2. 3. ECMAScript 표준화
넷스케이프는 자바스크립트의 표준화를 위해 ECMA 인터내셔널에 자바스크립트를 제출했으며, 1997년에 최초의 ECMAScript 표준(ECMA-262)이 발표되었다.[149] 표준화 과정은 계속되었으나, 마이크로소프트의 소극적인 참여로 인해 ECMAScript 4는 보류되었다.2000년대 초 인터넷 익스플로러가 지배하던 시기에는 클라이언트 측 스크립팅이 정체되어 있었으나, 2004년 모질라가 파이어폭스 브라우저를 출시하면서 변화가 시작되었다. 파이어폭스는 많은 사람들로부터 호평을 받으며 인터넷 익스플로러로부터 상당한 시장 점유율을 차지했다.[21]
2005년, 모질라는 ECMA 인터내셔널에 가입했고, E4X 표준에 대한 작업이 시작되었다. 모질라는 매크로미디어(후에 어도비 시스템즈에 인수됨)와 공동 작업을 진행했는데, 매크로미디어는 ECMAScript 4 초안을 기반으로 하는 ActionScript 3 언어에 E4X를 구현하고 있었다. 목표는 ActionScript 3을 새로운 ECMAScript 4로 표준화하는 것이었다. 어도비 시스템즈는 타마린 구현을 오픈 소스 프로젝트로 공개했지만, 타마린과 ActionScript 3는 기존의 클라이언트 측 스크립팅과 너무 달랐고, 마이크로소프트의 협력이 없었기에 ECMAScript 4는 결실을 맺지 못했다.
한편, ECMA 작업과 관련 없는 오픈 소스 커뮤니티에서 2005년 제시 제임스 가렛이 Ajax라는 용어를 만들고, 자바스크립트를 핵심으로 하는 일련의 기술들을 설명하는 백서를 발표하여, 전체 페이지를 다시 로드할 필요 없이 데이터를 백그라운드에서 로드할 수 있는 웹 애플리케이션을 만들 수 있게 했다. 이는 오픈 소스 라이브러리와 그들을 중심으로 형성된 커뮤니티를 주도로 자바스크립트의 부흥기를 촉발했다. jQuery, Prototype, 도조 툴킷, 그리고 무툴스를 포함한 많은 새로운 라이브러리가 만들어졌다.
구글은 2008년에 경쟁사보다 빠른 V8 자바스크립트 엔진을 탑재한 크롬 브라우저를 출시했다.[22][23] 핵심 혁신은 JIT 컴파일이었고,[24] 다른 브라우저 벤더들은 JIT를 위해 자체 엔진을 개편해야 했다.[25]
2008년 7월, 여러 관계자들이 오슬로에서 컨퍼런스를 개최했고, 2009년 초 모든 관련 작업을 통합하고 언어를 발전시키기로 합의하여 2009년 12월에 ECMAScript 5 표준이 발표되었다.
차세대 자바스크립트로서 "JavaScript 2.0"을 만들려는 움직임이 두 번 있었지만, 모두 성사되지 못했다. 첫 번째는 ECMAScript 3가 완성된 후 2000년부터 2003년에 걸쳐 발생했지만, 넷스케이프와 마이크로소프트의 대립으로 인해 결론을 맺지 못했다. 당시 넷스케이프가 제안했던 안은 어도비의 ActionScript 2.0으로 이어졌고, 마이크로소프트의 안은 JScript .NET으로 계승되었다.
그 후에도 넷스케이프 및 모질라 재단은 ECMAScript의 제정과 병행하여 자바스크립트를 확장하며 JavaScript 1.x 계열로 버전업을 거듭했다. ECMAScript 측에서는 ECMAScript 4의 제정이 1999년 이후 진행되었으며[118], 2006년 시점에서 모질라 재단은 이를 기반으로 JavaScript 2.0을 만들 것을 표명했다. 모질라는 ECMAScript 4의 제정에 따라 파이썬의 문법을 일부 도입한 안을 제안했으며, 자체적으로 이를 구현했다[119]。
그러나 이후 ECMAScript의 표준화 작업이 모질라, 어도비, 오페라, 구글 등이 지지하는 ECMAScript 4와 마이크로소프트, 야후! 등이 지지하는 ECMAScript 3.1로 사실상 분열된 영향으로 인해 2008년 8월에 큰 방향 전환이 있었고, ECMAScript 4는 폐기되었으며 후자가 ECMAScript 5로 2009년에 표준화되었다. ECMAScript 4에 포함될 예정이었던 기능은 새로 발족한 "'''ECMAScript Harmony'''"로 연기되었다[120]。이는 후에 ECMAScript 2015로 표준화가 완료되었다. 한편, ECMAScript 5가 표준화된 이후, 모질라의 자바스크립트 구현은 ECMAScript 준수를 표방하게 되었고[121], 버전 번호에 의한 호칭은 이루어지지 않게 되었고, JavaScript 2.0은 사실상 사어가 되었다.
2. 4. 성장과 발전
2000년대 초 인터넷 익스플로러가 지배하던 시기에는 클라이언트 측 스크립팅이 정체되어 있었다.[21] 2004년 넷스케이프의 후계자인 모질라가 파이어폭스 브라우저를 출시하면서 경쟁이 다시 시작되었고, 파이어폭스는 많은 사람들로부터 호평을 받으며 인터넷 익스플로러로부터 상당한 시장 점유율을 차지했다.[21]2005년, 제시 제임스 가렛은 Ajax라는 용어를 만들고, 자바스크립트를 핵심으로 하는 일련의 기술들을 설명하는 백서를 발표했다. 이를 통해 전체 페이지를 다시 로드할 필요 없이 데이터를 백그라운드에서 로드할 수 있는 웹 애플리케이션을 만들 수 있게 되었다. 이는 jQuery, Prototype, 도조 툴킷, 무툴스를 포함한 많은 새로운 라이브러리가 만들어지는 등 자바스크립트의 부흥기를 촉발했다.
구글은 2008년에 경쟁사보다 빠른 V8 자바스크립트 엔진을 탑재한 크롬 브라우저를 출시했다.[22][23] 핵심 혁신은 JIT 컴파일이었고,[24] 다른 브라우저 벤더들은 JIT를 위해 자체 엔진을 개편해야 했다.[25] 이러한 각 웹 브라우저 벤더들의 속도 향상 경쟁은 현재도 진행형이다.
2009년 12월에 발표된 ECMAScript 5 표준은 모든 관련 작업을 통합하고 언어를 발전시키기로 한 2008년 7월 오슬로 컨퍼런스에서의 합의에 따른 결과였다. 2015년에 발표된 ECMAScript 6 (ECMAScript 2015)에서는 클래스, 모듈, 화살표 함수 등 현대적인 기능들이 추가되었다.[26]
라이언 달이 2009년에 Node.js를 개발하면서 웹 브라우저 밖에서 자바스크립트 사용이 크게 증가했다. Node는 V8 엔진, 이벤트 루프, I/O API를 결합하여 독립 실행형 자바스크립트 런타임 시스템을 제공한다.[27][28]
현재 자바스크립트 생태계는 많은 라이브러리와 웹 프레임워크, 확립된 프로그래밍 관행, 웹 브라우저 밖에서의 상당한 자바스크립트 사용을 특징으로 한다.[14] 또한, 싱글 페이지 애플리케이션과 기타 자바스크립트 중심 웹사이트의 증가와 함께, 개발 프로세스를 지원하기 위해 여러 개의 트랜스파일러가 만들어졌다.[106]
2. 5. Node.js와 서버 측 자바스크립트
2009년 라이언 달이 개발한 Node.js는 자바스크립트를 웹 브라우저 밖에서도 사용할 수 있게 만들었다.[117] Node.js는 서버 측 개발, 데스크톱 애플리케이션 개발 등 다양한 분야에서 자바스크립트의 활용 범위를 넓혔다. Node.js에는 파일 시스템에 접근하기 위한 `fs` API(모듈)나 실행 프로세스와 상호 작용하는 `process` API 등이 정의되어 있다. 웹 브라우저가 갖는 강력한 샌드박스 요구 사항이 완화된 점이 Node.js API의 특징 중 하나이다. npm(Node Package Manager)은 자바스크립트 생태계를 더욱 풍부하게 만들었다.2. 6. 현재의 자바스크립트
ECMAScript 6가 2015년에 발표되면서 광범위한 추가 및 개선 사항들이 공식화되어 언어에 대한 야심찬 작업이 여러 해 동안 지속되었다.[26] 라이언 달이 2009년에 Node.js를 개발하면서 웹 브라우저 밖에서 자바스크립트 사용이 크게 증가했다. Node는 V8 엔진, 이벤트 루프, I/O API를 결합하여 독립 실행형 자바스크립트 런타임 시스템을 제공한다.[27][28] 2018년 기준으로 Node는 수백만 명의 개발자가 사용했으며,[29] npm은 전 세계 패키지 관리자 중 가장 많은 모듈을 보유하고 있었다.[30]ECMAScript 초안 사양은 현재 깃허브에서 공개적으로 관리되며,[31] 매년 정기적으로 스냅샷을 통해 에디션이 생성된다.[31] 언어에 대한 잠재적인 개정 사항은 포괄적인 제안 과정을 통해 검토된다.[32][33] 이제 개발자는 에디션 번호 대신, 예정된 기능의 상태를 개별적으로 확인한다.[31]
현재 자바스크립트 생태계는 많은 라이브러리와 웹 프레임워크, 확립된 프로그래밍 관행, 웹 브라우저 밖에서의 상당한 자바스크립트 사용을 특징으로 한다.[14] 싱글 페이지 애플리케이션과 기타 자바스크립트 중심 웹사이트의 증가와 함께, 개발 프로세스를 지원하기 위해 여러 개의 트랜스파일러가 만들어졌다.[106] 2000년경, 브라우저 간의 호환성이 어느 정도 확립되면서, 구글이나 아마존 등 GAFAM도 자바스크립트를 적극적으로 활용하기 시작했다.
자바스크립트는 웹 브라우저의 확장 기능을 개발하기 위한 언어로도 사용되었다. 초기에는 확장 기능용 API가 통일되어 있지 않았지만, 호환성을 높이려는 움직임이 있다[117]。
초기에는 인터프리터 방식으로 실행되는 것이 일반적이었기 때문에 자바스크립트의 실행 속도가 그다지 빠르지 않았지만, 현재는 JIT 컴파일 등을 이용한 각종 최적화가 이루어지고 있으며, 각 웹 브라우저 벤더 모두 속도 향상을 위해 경쟁하고 있다. 더 나아가, 이러한 고속화를 바탕으로 서버 사이드에서도 Node.js처럼 자바스크립트를 사용하는 움직임이 나타났다.
3. 특징
자바스크립트는 절차적 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍 등 다양한 스타일의 프로그래밍을 지원한다.[109] 객체 지향 프로그래밍 면에서는 클래스 기반이 아닌 프로토타입 기반으로 구현된다.[109] 더글러스 크락포드는 자바스크립트의 프로토타입 상속에 대해 "객체는 객체로부터 상속됩니다. 이보다 더 객체 지향적인 것이 있을까요?"라고 설명한다.[55] 함수형 프로그래밍 면에서는 일급 함수를 지원하여 함수를 일급 객체로 취급할 수 있다.[61] 함수는 객체로 간주되므로, `.call()` 및 `.bind()`와 같은 속성과 메서드를 가질 수 있다.[62]
자바스크립트는 `if` 문, `while` 루프, `switch` 문, `do while` 루프 등 C의 많은 구조적 프로그래밍 문법을 지원한다.[50] 다만, 원래 자바스크립트는 `var`를 사용한 함수 스코프만 가지고 있었으나, 블록 스코프는 ECMAScript 2015에서 `let` 및 `const` 키워드로 추가되었다. C와 마찬가지로 자바스크립트는 표현식과 문을 구분하며, 자동 세미콜론 삽입으로 인해 문장을 종료하는 세미콜론을 생략할 수 있다는 문법적 차이점이 있다.[50]
자바스크립트에서 객체는 프로토타입으로 보강된 연관 배열이며, 점 표기법( `obj.x = 10` )과 대괄호 표기법( `obj['x'] = 10` ) 두 가지 구문 방식으로 객체 속성의 이름을 지정할 수 있다. 런타임에 속성을 추가, 재바인딩 또는 삭제할 수 있으며, 객체의 대부분의 속성(그리고 객체의 프로토타입 상속 체인에 속하는 모든 속성)은 `for...in` 루프를 사용하여 열거할 수 있다.
Aptana, 이클립스(Eclipse), NetBeans, IntelliJ IDEA 등의 통합 개발 환경은 JavaScript를 지원하며, 대규모 개발이 가능해졌다. 또한 Ext JS 등의 본격적인 GUI 라이브러리의 등장으로, 데스크톱 애플리케이션과 다름없는 사용자 인터페이스 구축이 가능해졌다.
3. 1. 프로그래밍 스타일
자바스크립트는 절차적 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍 등 다양한 스타일의 프로그래밍을 지원한다.[109] 객체 지향 프로그래밍 면에서는 클래스 기반이 아닌 프로토타입 기반으로 구현된다.[109] 더글러스 크락포드는 자바스크립트의 프로토타입 상속에 대해 "객체는 객체로부터 상속됩니다. 이보다 더 객체 지향적인 것이 있을까요?"라고 설명한다.[55] 함수형 프로그래밍 면에서는 일급 함수를 지원하여 함수를 일급 객체로 취급할 수 있다.[61] 함수는 객체로 간주되므로, `.call()` 및 `.bind()`와 같은 속성과 메서드를 가질 수 있다.[62]자바스크립트는 `if` 문, `while` 루프, `switch` 문, `do while` 루프 등 C의 많은 구조적 프로그래밍 문법을 지원한다.[50] 다만, 원래 자바스크립트는 `var`를 사용한 함수 스코프만 가지고 있었으나, 블록 스코프는 ECMAScript 2015에서 `let` 및 `const` 키워드로 추가되었다. C와 마찬가지로 자바스크립트는 표현식과 문을 구분하며, 자동 세미콜론 삽입으로 인해 문장을 종료하는 세미콜론을 생략할 수 있다는 문법적 차이점이 있다.[50]
자바스크립트에서 객체는 프로토타입으로 보강된 연관 배열이며, 점 표기법( `obj.x = 10` )과 대괄호 표기법( `obj['x'] = 10` ) 두 가지 구문 방식으로 객체 속성의 이름을 지정할 수 있다. 런타임에 속성을 추가, 재바인딩 또는 삭제할 수 있으며, 객체의 대부분의 속성(그리고 객체의 프로토타입 상속 체인에 속하는 모든 속성)은 `for...in` 루프를 사용하여 열거할 수 있다.
Aptana, 이클립스(Eclipse), NetBeans, IntelliJ IDEA 등의 통합 개발 환경은 JavaScript를 지원하며, 대규모 개발이 가능해졌다. 또한 Ext JS 등의 본격적인 GUI 라이브러리의 등장으로, 데스크톱 애플리케이션과 다름없는 사용자 인터페이스 구축이 가능해졌다.
3. 2. 동적 타이핑과 약한 타이핑
자바스크립트는 약한 타입 언어로, 사용되는 연산에 따라 특정 타입이 암묵적으로 형변환된다.[51]- 이항 연산자 `+`는 두 피연산자가 숫자일 경우를 제외하고는 둘 다 문자열로 형변환한다. 이는 덧셈 연산자가 연결 연산자 역할도 하기 때문이다.
- 이항 연산자 `-`는 항상 두 피연산자를 숫자로 형변환한다.
- 두 단항 연산자(`+`, `-`)는 항상 피연산자를 숫자로 형변환한다. 그러나 `+`는 항상 binary64로 형변환하는 반면, `-`는 정수를 유지한다.[52]
값은 다음과 같이 문자열로 형변환된다.[51]
- 문자열은 변경 없이 그대로 유지된다.
- 숫자는 문자열 표현으로 변환된다.
- 배열은 각 요소가 문자열로 변환된 후 쉼표(`,`)로 연결된다.
- 다른 객체는 문자열 `[object Object]`로 변환되는데, 여기서 `Object`는 객체의 생성자 이름이다.
값은 문자열로 형변환된 다음, 문자열을 숫자로 형변환하여 숫자로 변환된다. 이러한 과정은 문자열 및 숫자 형변환을 위해 각각 `toString` 및 `valueOf` 함수를 프로토타입에 정의하여 수정할 수 있다.
자바스크립트는 이러한 변환을 구현하는 방식에 대해 비판을 받아 왔으며, 규칙의 복잡성으로 인해 일관성이 없는 것으로 오해받을 수 있다.[53][51] 예를 들어, 숫자를 문자열에 더할 때는 숫자가 문자열로 변환된 후 연결이 수행되지만, 문자열에서 숫자를 뺄 때는 문자열이 숫자로 변환된 후 뺄셈이 수행된다.
left operand | operator | right operand | result |
---|---|---|---|
`[]` (빈 배열) | `+` | `[]` (빈 배열) | `""` (빈 문자열) |
`[]` (빈 배열) | `+` | `{}` (빈 객체) | `"[object Object]"` (문자열) |
`false` (부울) | `+` | `[]` (빈 배열) | `"false"` (문자열) |
`"123"`(문자열) | `+` | `1` (숫자) | `"1231"` (문자열) |
`"123"` (문자열) | `-` | `1` (숫자) | `122` (숫자) |
`"123"` (문자열) | `-` | `"abc"` (문자열) | `NaN` (숫자) |
`{} + []`는 `0` (숫자)이 되는 경우가 있는데, 이는 `{} `가 빈 객체가 아닌 빈 코드 블록으로 해석되고, 빈 배열은 남은 단항 `+` 연산자에 의해 숫자로 형변환되기 때문이다. 표현식을 괄호로 묶으면 - `({} + [])` – 중괄호는 빈 객체로 해석되고 표현식의 결과는 예상대로 `"[object Object]"`가 된다.[51]
자바스크립트는 동적 타이핑을 사용한다. 타입 시스템은 표현식이 아닌 값에 연결된다. 예를 들어, 처음에 숫자에 바인딩된 변수는 문자열로 다시 할당될 수 있다.[54]
3. 3. 프로토타입 기반 객체 지향
자바스크립트는 프로토타입을 사용하여 상속을 구현한다.[56] 다른 객체 지향 프로그래밍 언어들이 클래스를 통해 상속을 구현하는 것과 달리, 자바스크립트는 프로토타입을 사용하며, 이를 통해 클래스 기반 기능들을 흉내 낼 수 있다.[57]더글러스 크락포드는 자바스크립트의 프로토타입 상속을 다음과 같이 설명했다.
{{Blockquote
|당신은 프로토타입 객체를 만들고, 그 다음 ... 새로운 인스턴스를 만듭니다. 자바스크립트에서 객체는 변경 가능하므로, 우리는 새로운 인스턴스를 보강하여 새로운 필드와 메서드를 부여할 수 있습니다. 이들은 더 새로운 객체의 프로토타입으로 작용할 수 있습니다. 우리는 많은 유사한 객체를 만들기 위해 클래스가 필요하지 않습니다... 객체는 객체로부터 상속됩니다. 이보다 더 객체 지향적인 것이 있을까요?[55]
}}
자바스크립트에서 객체는 프로토타입으로 보강된 연관 배열이다. 각 키는 객체 속성의 이름을 제공하며, 점 표기법(
obj.x = 10
)과 대괄호 표기법(obj['x'] = 10
)을 사용해 이름을 지정할 수 있다. 런타임에 속성을 추가, 재바인딩 또는 삭제할 수 있으며, 객체의 대부분의 속성과 프로토타입 상속 체인에 속하는 모든 속성은 `for...in` 루프를 사용하여 열거할 수 있다.자바스크립트에서 명시적인 함수 기반 위임은 구성을 다루지만, 묵시적인 위임은 객체가 직접 소유하지는 않지만 관련이 있을 수 있는 메서드를 찾기 위해 프로토타입 체인을 순회할 때마다 이미 발생한다. 일단 메서드가 발견되면 이 객체의 컨텍스트 내에서 호출된다. 따라서 자바스크립트의 상속은 생성자 함수의 프로토타입 속성에 바인딩된 위임 자동화에 의해 처리된다.
3. 4. 함수와 클로저
자바스크립트에서 함수는 일반적인 역할 외에도 객체 생성자 역할을 수행한다. 함수 호출 시 `new` 키워드를 사용하면 프로토타입의 인스턴스가 생성되어 생성자( `Object` 프로토타입의 속성 포함)로부터 속성과 메서드를 상속받는다.[58] ECMAScript 5에서는 `Object.create` 메서드를 통해 `Object` 프로토타입으로부터의 자동 상속 없이 인스턴스를 명시적으로 생성할 수 있다.[59] 생성자의 `prototype` 속성은 새 객체의 내부 프로토타입에 사용되는 객체를 결정하며, 이를 수정하여 새로운 메서드를 추가할 수 있다. `Array`나 `Object`와 같은 내장 생성자도 수정 가능한 프로토타입을 가지지만, `Object` 프로토타입 수정은 대부분의 객체가 이를 상속받고 예상하지 못할 수 있으므로 권장되지 않는다.[60]함수 정의와 메서드 정의는 명확히 구분되지 않으며, 함수가 객체의 메서드로 호출될 때, 함수의 `this` 키워드는 해당 객체에 바인딩된다.
중첩된 함수는 다른 함수 내에 정의된 함수로, 외부 함수가 호출될 때마다 생성된다. 각 중첩 함수는 렉시컬 클로저를 형성하여 외부 함수의 렉시컬 스코프(상수, 지역 변수, 인수 값 포함)를 내부 상태의 일부로 가지게 되며, 이는 외부 함수 실행 종료 후에도 유지된다.
3. 5. 비동기 처리와 병행/병렬 처리
자바스크립트는 비동기 처리를 지원하여 네트워크 요청과 같이 "대기"가 있는 처리를 효율적으로 수행할 수 있다.[110] 표준으로 제공되는 처리 기능에도 비동기 처리되는 것이 있다.비동기 처리를 위해 프로미스와 Async/await를 지원한다.[110] 콜백 함수 표기법을 래핑하는 `Promise`를 통해 비동기 처리를 할 수 있으며, `Promise`를 동기적인 코드처럼 기술할 수 있는 Async/await 구문을 통해 비동기 코드를 동기 코드처럼 작성할 수 있다.
자바스크립트는 여러 스레드를 사용한 병렬 처리를 통해 병행 처리를 지원한다.[110] 공유 메모리상의 버퍼를 나타내는 `SharedArrayBuffer`, 버퍼 조작 객체 `Atomics`가 정의되어 있다. 스레드 자체의 사양은 환경마다 다르다. 브라우저의 경우 `Worker`, Node.js의 경우 `worker_threads`로 정의되어 있으며, `postMessage`에 의한 메시징이 양쪽 모두에서 지원되는 등 거의 공통적인 구조로 되어 있다.
3. 6. 기타 특징
자바스크립트는 0부터 시작하는 인덱스를 사용하는 언어이다. 함수에 무제한의 매개변수를 전달할 수 있으며, 함수는 형식 매개변수와 지역 `arguments` 객체를 통해 해당 매개변수에 접근할 수 있다. 가변 인자 함수는 `bind` 메서드를 사용하여 생성할 수도 있다.배열과 객체(다른 언어에서는 연관 배열)는 각각 간결한 단축 구문으로 생성할 수 있다. 이러한 객체 리터럴은 JSON 데이터 형식의 기반을 형성한다.
펄과 유사하게 자바스크립트는 정규 표현식을 지원하며, 이는 내장된 문자열 함수보다 더 정교한 텍스트 조작을 위한 간결하고 강력한 구문을 제공한다.[67]
4. 문법
자바스크립트의 변수는 `var`[145][69][122], `let`[146][70][123], `const`[147][71][124] 키워드를 사용하여 정의할 수 있다. 키워드 없이 정의된 변수는 전역 범위에서 정의된다.[69] `var`는 함수 범위 변수를 선언하고, `let`은 블록 범위 변수를 선언한다. `const`는 블록 범위의 재할당 불가능한 변수(상수)를 선언하며, 반드시 선언과 동시에 값을 할당해야 한다.[147]
```javascript
// `x`라는 함수 범위 변수를 선언하고, 암시적으로 undefined를 할당한다.
var x;
// `y`라는 블록 범위 변수를 선언하고, 암시적으로 undefined를 할당한다.
let y;
// `z`라는 블록 범위의 재할당 불가능한 변수를 선언하고, 문자열 리터럴로 설정한다.
const z = "this value cannot be reassigned!";
// `myNumber`라는 변수를 선언하고 숫자 리터럴(값 2)을 할당한다.
let myNumber = 2;
// `myNumber`를 재할당하여, 문자열 리터럴(값 "foo")로 설정한다.
myNumber = "foo";
```
위 예제에서 `//`는 한 줄 주석을 나타낸다.[69] 여러 줄 주석은 `/* ... */` 형태로 사용한다.
자바스크립트는 자체적인 입출력 기능이 없으며, 런타임 환경에서 제공되는 기능을 사용한다.[72][125] 대부분의 런타임 환경에는 출력을 위한 `console` 객체가 있으며,[73][127] `console.log()` 함수를 사용하여 콘솔에 값을 출력할 수 있다.[126]
```javascript
console.log("Hello, World!");
```
자바스크립트는 익명 함수를 지원한다. `function` 키워드를 사용하여 정의하며, 화살표 함수(`=>`)를 사용하여 함수를 간결하게 표현할 수 있다.
자바스크립트에서 배열과 객체(연관 배열)는 간결한 단축 구문으로 생성할 수 있다. 이러한 객체 리터럴은 JSON 데이터 형식의 기반이 된다.
4. 1. 기본 문법
자바스크립트의 변수는 `var`[145][69][122], `let`[146][70][123], `const`[147][71][124] 키워드를 사용하여 정의할 수 있다. 키워드 없이 정의된 변수는 전역 범위에서 정의된다.[69] `var`는 함수 범위 변수를 선언하고, `let`은 블록 범위 변수를 선언한다. `const`는 블록 범위의 재할당 불가능한 변수(상수)를 선언하며, 반드시 선언과 동시에 값을 할당해야 한다.[147]```javascript
// `x`라는 함수 범위 변수를 선언하고, 암시적으로 undefined를 할당한다.
var x;
// `y`라는 블록 범위 변수를 선언하고, 암시적으로 undefined를 할당한다.
let y;
// `z`라는 블록 범위의 재할당 불가능한 변수를 선언하고, 문자열 리터럴로 설정한다.
const z = "this value cannot be reassigned!";
// `myNumber`라는 변수를 선언하고 숫자 리터럴(값 2)을 할당한다.
let myNumber = 2;
// `myNumber`를 재할당하여, 문자열 리터럴(값 "foo")로 설정한다.
myNumber = "foo";
```
위 예제에서 `//`는 한 줄 주석을 나타낸다.[69] 여러 줄 주석은 `/* ... */` 형태로 사용한다.
자바스크립트는 자체적인 입출력 기능이 없으며, 런타임 환경에서 제공되는 기능을 사용한다.[72][125] 대부분의 런타임 환경에는 출력을 위한 `console` 객체가 있으며,[73][127] `console.log()` 함수를 사용하여 콘솔에 값을 출력할 수 있다.[126]
```javascript
console.log("Hello, World!");
4. 2. 함수
자바스크립트는 익명 함수를 지원한다. `function` 키워드를 사용하여 정의하며, 화살표 함수(`=>`)를 사용하여 함수를 간결하게 표현할 수 있다.4. 3. 객체
자바스크립트에서 배열과 객체(연관 배열)는 간결한 단축 구문으로 생성할 수 있다. 이러한 객체 리터럴은 JSON 데이터 형식의 기반이 된다.4. 4. 제어문
4. 5. 예제 코드
HTML5와 함께 사용되는 자바스크립트의 헬로 월드 프로그램 예제는 다음과 같다.```html5
```
콘솔 객체가 있는 런타임 환경에서는 다음과 같이 작성할 수도 있다.[73]
```javascript
console.log("Hello, World!");
```
또는
```javascript
alert("Hello world!")
```
자바스크립트에서 변수는 `var`,[69] `let`[70] 또는 `const`[71] 키워드를 사용하여 정의할 수 있다. 키워드 없이 정의된 변수는 전역 범위에서 정의된다.
```javascript
// `x`라는 함수 범위 변수를 선언하고, 암시적으로
// 특별 값 `undefined`를 할당합니다. 값이 없는 변수는 자동으로
// undefined로 설정됩니다.
// var는 일반적으로 좋지 않은 관행으로 간주되며 let과 const가 일반적으로 선호됩니다.
var x;
// 변수는 다음과 같이 수동으로 `undefined`로 설정할 수 있습니다.
let x2 = undefined;
// `y`라는 블록 범위 변수를 선언하고, 암시적으로
// `undefined`로 설정합니다. `let` 키워드는 ECMAScript 2015에 도입되었습니다.
let y;
// `z`라는 블록 범위의 재할당 불가능한 변수를 선언하고, 문자열 리터럴로 설정합니다.
// `const` 키워드도 ECMAScript 2015에 도입되었으며, 명시적으로 할당해야 합니다.
// 키워드 `const`는 상수를 의미하므로, 변수 값은 `constant`이므로 재할당할 수 없습니다.
const z = "this value cannot be reassigned!";
// 전역 범위 변수를 선언하고 3을 할당합니다. 이것은 일반적으로
// 좋지 않은 관행으로 간주되며, strict mode가 켜져 있으면 작동하지 않습니다.
t = 3;
// `myNumber`라는 변수를 선언하고 숫자 리터럴(값
// `2`)을 할당합니다.
let myNumber = 2;
// `myNumber`를 재할당하여, 문자열 리터럴(값 `"foo"`)로 설정합니다.
// 자바스크립트는 동적으로 유형이 지정되는 언어이므로 이것은 유효합니다.
myNumber = "foo";
```
자연수의 계승을 계산하는 재귀 함수 예제는 다음과 같다.
```javascript
function factorial(n) {
// 인수의 정당성을 확인합니다. 계승은 양의 정수에 대해 정의됩니다.
if (isNaN(n)) {
console.error("숫자가 아닌 인수는 허용되지 않습니다.");
return NaN; // 특수 값: 숫자가 아님
}
if (n === 0)
return 1; // 0! = 1
if (n < 0)
return undefined; // 음수의 계승은 정의되지 않습니다.
if (n % 1) {
console.warn(`${n}은 가장 가까운 정수로 반올림됩니다. 정수가 아닌 경우 감마 함수를 사용하는 것을 고려하십시오.`);
n = Math.round(n);
}
// 위 검사는 재귀에서 반복할 필요가 없으므로 실제 재귀 부분을 별도로 정의합니다.
// 다음 줄은 계승을 재귀적으로 계산하는 함수 표현식입니다. ES6에 도입된 화살표 구문을 사용합니다.
const recursivelyCompute = a => a > 1 ? a * recursivelyCompute(a - 1) : 1; // 삼항 연산자 `?`의 사용에 유의하십시오.
return recursivelyCompute(n);
}
factorial(3); // 6을 반환합니다.
```
다음은 함수 클로저가 비지역 변수를 참조로 캡처하는 익명 함수 (또는 람다) 예제이다.
```javascript
const counter = function() {
let count = 0;
return function() {
return ++count;
}
};
const x = counter();
x(); // 1을 반환합니다.
x(); // 2를 반환합니다.
x(); // 3을 반환합니다.
```
6th Edition – ECMAScript 2015에 처음 도입된 화살표 함수는 자바스크립트에서 함수를 작성하는 구문을 단축한다. 화살표 함수는 익명이므로 생성 후 호출하려면 변수가 필요하다.
```javascript
// 화살표 함수를 사용하면 `function` 키워드를 생략할 수 있습니다.
// 여기에서 `long_example`은 익명 함수 값을 가리킵니다.
const long_example = (input1, input2) => {
console.log("Hello, World!");
const output = input1 + input2;
return output;
};
// 중괄호가 없으면 화살표 함수는 단순히 표현식을 반환합니다.
// 그래서 여기서는 (input1 + input2)입니다.
const short_example = (input1, input2) => input1 + input2;
long_example(2, 3); // "Hello, World!"를 출력하고 5를 반환합니다.
short_example(2, 5); // 7을 반환합니다.
// 화살표 함수에 매개변수가 하나만 있으면 괄호를 제거할 수 있습니다.
const no_parentheses = input => input + 2;
no_parentheses(3); // 5를 반환합니다.
// 다른 함수 정의와 마찬가지로 화살표 함수는 생성된 것과 동일한 문에서 실행될 수 있습니다.
// 이것은 전역 범위를 채우는 것을 피하고 클로저를 위해 라이브러리를 작성할 때 유용합니다.
let three = ((a, b) => a + b) (1, 2);
const generate_multiplier_function = a => (b => isNaN(b) || !b ? a : a*=b);
const five_multiples = generate_multiplier_function(5); // 제공된 인수 "seeds" the expression and is retained by a.
five_multiples(1); // 5를 반환합니다.
five_multiples(3); // 15를 반환합니다.
five_multiples(4); // 60을 반환합니다.
```
가변 인자 함수 데모( `arguments`는 특수한 변수):[74]
```javascript
function sum() {
let x = 0;
for (let i = 0; i < arguments.length; ++i)
x += arguments[i];
return x;
}
sum(1, 2); // 3을 반환합니다.
sum(1, 2, 3); // 6을 반환합니다.
// ES6부터, rest 연산자를 사용합니다.
function sum(...args) {
return args.reduce((a, b) => a + b);
}
sum(1, 2); // 3을 반환합니다.
sum(1, 2, 3); // 6을 반환합니다.
```
즉시 호출 함수 표현식은 종종 클로저를 만드는 데 사용되며, 속성 및 메서드를 네임스페이스에 수집하고 일부를 비공개로 만들 수 있다.
```javascript
let counter = (function() {
let i = 0; // 비공개 속성
return { // 공개 메서드
get: function() {
alert(i);
},
set: function(value) {
i = value;
},
increment: function() {
alert(++i);
}
};
})(); // 모듈
counter.get(); // 0을 반환합니다.
counter.set(6);
counter.increment(); // 7을 반환합니다.
counter.increment(); // 8을 반환합니다.
```
5. 활용
웹 브라우저에서 HTML 조작을 목적으로 만들어진 JavaScript는 2020년 현재 폭넓은 영역에서 이용되고 있다.
- 웹 페이지・웹 사이트・웹 애플리케이션 (브라우저 클라이언트 상에서의 동작)
- 웹 백엔드 서버 (Node.js)
- 데스크톱 애플리케이션 (예: Electron)
- 모바일 애플리케이션 (예: React Native)
== 웹 프론트엔드 개발 ==
HTML, CSS와 함께 웹 페이지의 동적인 요소를 구현하는 데 사용된다.[7] 자바스크립트는 웹의 지배적인 클라이언트 측 스크립트 언어이며, 모든 웹사이트의 99%가 이를 사용한다. 스크립트는 HTML 문서에 포함되거나 포함되어 있으며 DOM과 상호 작용한다.[148]
Ajax 기술을 통해 페이지 새로고침 없이 서버와 통신할 수 있다. 예를 들어, 소셜 미디어의 사용자는 현재 페이지를 벗어나지 않고 메시지를 보내고 받을 수 있다.
웹사이트의 80% 이상이 클라이언트 측 스크립팅의 일부로 제3자 라이브러리 또는 웹 프레임워크를 사용한다.[38] jQuery가 가장 많이 사용되며,[38] 그 외에 Angular, Bootstrap, Lodash, Modernizr, React, Underscore, Vue 등이 있다.[38] jQuery와 Bootstrap과 같이 여러 옵션을 함께 사용할 수 있다.[39]
자바스크립트의 사용 예는 다음과 같다:
- 페이지를 다시 로드하지 않고 새로운 콘텐츠를 불러오거나 서버에 전송 (Ajax. 예를 들어, SNS에서 페이지를 벗어나지 않고 새로운 게시물을 표시할 수 있다).
- 게임 등과 같은 동적인 콘텐츠를 제공.
- 데이터를 서버에 전송하지 않고 폼 입력값의 유효성 검사를 수행.
- 액세스 분석이나 광고 추적, 개인화 등을 위해 사용자의 열람 정보를 수집[131]。
Gmail과 같은 애플리케이션에서는, 자바스크립트로 UI 로직을 구현하고, 또한 자바스크립트로 서버에서 정보 (예: 이메일 메시지)를 가져온다.
대표적인 자바스크립트 라이브러리는 다음과 같다:
- 앵귤러JS
- 백본.js
- 도조 툴킷
- 익스프레스.js
- 익스텐드JS(Ext JS)
- 구글 웹 툴킷(GWT)
- 임팩트
- 제이쿼리
- 모치킷
- 무툴스
- 프로토타입 자바스크립트 프레임워크(prototype.js)
- QUnit
- 야후! 사용자 인터페이스 라이브러리
- WinJS
- 리액트
- 뷰.js
== 웹 백엔드 개발 ==
Node.js를 사용하면 웹 브라우저 없이도 서버 측 애플리케이션을 개발할 수 있다.[43] 초기에는 넷스케이프 엔터프라이즈 서버와 마이크로소프트의 인터넷 정보 서비스가 서버 측 자바스크립트 사용을 시도했지만,[41][42] 큰 성과를 거두지 못했다. 2000년대 후반 Node.js와 다른 접근 방식이 등장하면서 서버 측 자바스크립트 사용이 증가하기 시작했다.[43]
Node.js는 파일 시스템 접근을 위한 `fs` API(모듈)나 실행 프로세스와 상호 작용하는 `process` API 등을 제공한다. 웹 브라우저의 강력한 샌드박스 요구 사항이 완화된 것이 Node.js API의 특징 중 하나이다. Node.js는 임베디드 시스템에서도 활용된다.[46][47][48]
일렉트론, 코르도바, 리액트 네이티브 등과 같은 응용 프로그램 프레임워크들을 사용하여 자바스크립트로 동작하는 여러 응용 프로그램을 만들 수 있다. 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장[45]과 같은 브라우저가 아닌 다른 응용 프로그램도 있다.
== 데스크톱 애플리케이션 개발 ==
자바스크립트 엔진은 서버 측 웹사이트 배포와 브라우저가 아닌 응용 프로그램을 위해 다양한 소프트웨어 시스템에 내장되어 있다.[41][42] 서버 측 자바스크립트 사용은 2000년대 후반 Node.js와 다른 접근 방식의 등장과 함께 성장하기 시작했다.[43]
일렉트론, 코르도바, 리액트 네이티브와 같은 응용 프로그램 프레임워크들을 사용하여 자바스크립트로 구현된 동작을 가진 많은 응용 프로그램을 만들 수 있다. 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장[45]과 같은 브라우저가 아닌 다른 응용 프로그램도 존재한다.
Node.js처럼 OS의 기능 (네트워크 및 파일 시스템 등)에 접근할 수 있는 환경도 존재한다. Electron과 같은 애플리케이션 프레임워크의 등장으로 Atom과 같은 애플리케이션이 널리 사용되고 있다.
몇몇 애플리케이션에서는 매크로 언어로도 채택되고 있다. 예를 들어 Adobe Acrobat은 JavaScript를 이용한 매크로 기능을 탑재하고 있다.
== 모바일 애플리케이션 개발 ==
자바스크립트는 리액트 네이티브와 같은 프레임워크를 통해 네이티브 모바일 애플리케이션 개발에 사용된다.[43] 아파치 코르도바등의 응용 프로그램 프레임워크들을 활용하여 자바스크립트로 구현된 많은 응용 프로그램을 만들수 있다.[43]
== 기타 ==
자바스크립트 엔진은 서버 측 웹사이트 배포와 브라우저가 아닌 응용 프로그램 모두를 위해 다양한 다른 소프트웨어 시스템에 내장되어 있다.[41][42] 서버 측 사용은 2000년대 후반 Node.js와 다른 접근 방식의 등장과 함께 성장하기 시작했다.[43]
일렉트론, 코르도바, 리액트 네이티브와 같은 응용 프로그램 프레임워크들은 자바스크립트로 구현된 동작을 가진 많은 응용 프로그램을 만드는 데 사용되었다. 브라우저가 아닌 다른 응용 프로그램으로는 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장이 있다.[45]
임베디드 시스템에서 사용되어 왔으며, 일반적으로 Node.js를 활용한다.[46][47][48]
웹 브라우저 외에도 JavaScript를 실행하는 환경이 존재한다. 데이터베이스나 웹 서버에 내장되어 API나 HTTP 요청 및 응답에 대한 접근을 제공하는 경우도 있다.
Node.js처럼 OS의 기능 (네트워크 및 파일 시스템 등)에 접근할 수 있는 환경도 존재한다. Electron과 같은 애플리케이션 프레임워크의 등장으로 Atom과 같은 애플리케이션이 널리 사용되고 있다.
몇몇 애플리케이션에서는 매크로 언어로도 채택되고 있다. 예를 들어 Adobe Acrobat은 JavaScript를 이용한 매크로 기능을 탑재하고 있다.
5. 1. 웹 프론트엔드 개발
HTML, CSS와 함께 웹 페이지의 동적인 요소를 구현하는 데 사용된다.[7] 자바스크립트는 웹의 지배적인 클라이언트 측 스크립트 언어이며, 모든 웹사이트의 99%가 이를 사용한다. 스크립트는 HTML 문서에 포함되거나 포함되어 있으며 DOM과 상호 작용한다.[148]Ajax 기술을 통해 페이지 새로고침 없이 서버와 통신할 수 있다. 예를 들어, 소셜 미디어의 사용자는 현재 페이지를 벗어나지 않고 메시지를 보내고 받을 수 있다.
웹사이트의 80% 이상이 클라이언트 측 스크립팅의 일부로 제3자 라이브러리 또는 웹 프레임워크를 사용한다.[38] jQuery가 가장 많이 사용되며,[38] 그 외에 Angular, Bootstrap, Lodash, Modernizr, React, Underscore, Vue 등이 있다.[38] jQuery와 Bootstrap과 같이 여러 옵션을 함께 사용할 수 있다.[39]
자바스크립트의 사용 예는 다음과 같다:
- 페이지를 다시 로드하지 않고 새로운 콘텐츠를 불러오거나 서버에 전송 (Ajax. 예를 들어, SNS에서 페이지를 벗어나지 않고 새로운 게시물을 표시할 수 있다).
- 게임 등과 같은 동적인 콘텐츠를 제공.
- 데이터를 서버에 전송하지 않고 폼 입력값의 유효성 검사를 수행.
- 액세스 분석이나 광고 추적, 개인화 등을 위해 사용자의 열람 정보를 수집[131]。
Gmail과 같은 애플리케이션에서는, 자바스크립트로 UI 로직을 구현하고, 또한 자바스크립트로 서버에서 정보 (예: 이메일 메시지)를 가져온다.
대표적인 자바스크립트 라이브러리는 다음과 같다:
- 앵귤러JS
- 백본.js
- 도조 툴킷
- 익스프레스.js
- 익스텐드JS(Ext JS)
- 구글 웹 툴킷(GWT)
- 임팩트
- 제이쿼리
- 모치킷
- 무툴스
- 프로토타입 자바스크립트 프레임워크(prototype.js)
- QUnit
- 야후! 사용자 인터페이스 라이브러리
- WinJS
- 리액트
- 뷰.js
5. 2. 웹 백엔드 개발
Node.js를 사용하면 웹 브라우저 없이도 서버 측 애플리케이션을 개발할 수 있다.[43] 초기에는 넷스케이프 엔터프라이즈 서버와 마이크로소프트의 인터넷 정보 서비스가 서버 측 자바스크립트 사용을 시도했지만,[41][42] 큰 성과를 거두지 못했다. 2000년대 후반 Node.js와 다른 접근 방식이 등장하면서 서버 측 자바스크립트 사용이 증가하기 시작했다.[43]Node.js는 파일 시스템 접근을 위한 `fs` API(모듈)나 실행 프로세스와 상호 작용하는 `process` API 등을 제공한다. 웹 브라우저의 강력한 샌드박스 요구 사항이 완화된 것이 Node.js API의 특징 중 하나이다. Node.js는 임베디드 시스템에서도 활용된다.[46][47][48]
일렉트론, 코르도바, 리액트 네이티브 등과 같은 응용 프로그램 프레임워크들을 사용하여 자바스크립트로 동작하는 여러 응용 프로그램을 만들 수 있다. 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장[45]과 같은 브라우저가 아닌 다른 응용 프로그램도 있다.
5. 3. 데스크톱 애플리케이션 개발
자바스크립트 엔진은 서버 측 웹사이트 배포와 브라우저가 아닌 응용 프로그램을 위해 다양한 소프트웨어 시스템에 내장되어 있다.[41][42] 서버 측 자바스크립트 사용은 2000년대 후반 Node.js와 다른 접근 방식의 등장과 함께 성장하기 시작했다.[43]일렉트론, 코르도바, 리액트 네이티브와 같은 응용 프로그램 프레임워크들을 사용하여 자바스크립트로 구현된 동작을 가진 많은 응용 프로그램을 만들 수 있다. 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장[45]과 같은 브라우저가 아닌 다른 응용 프로그램도 존재한다.
Node.js처럼 OS의 기능 (네트워크 및 파일 시스템 등)에 접근할 수 있는 환경도 존재한다. Electron과 같은 애플리케이션 프레임워크의 등장으로 Atom과 같은 애플리케이션이 널리 사용되고 있다.
몇몇 애플리케이션에서는 매크로 언어로도 채택되고 있다. 예를 들어 Adobe Acrobat은 JavaScript를 이용한 매크로 기능을 탑재하고 있다.
5. 4. 모바일 애플리케이션 개발
자바스크립트는 리액트 네이티브와 같은 프레임워크를 통해 네이티브 모바일 애플리케이션 개발에 사용된다.[43] 아파치 코르도바등의 응용 프로그램 프레임워크들을 활용하여 자바스크립트로 구현된 많은 응용 프로그램을 만들수 있다.[43]5. 5. 기타
자바스크립트 엔진은 서버 측 웹사이트 배포와 브라우저가 아닌 응용 프로그램 모두를 위해 다양한 다른 소프트웨어 시스템에 내장되어 있다.[41][42] 서버 측 사용은 2000년대 후반 Node.js와 다른 접근 방식의 등장과 함께 성장하기 시작했다.[43]일렉트론, 코르도바, 리액트 네이티브와 같은 응용 프로그램 프레임워크들은 자바스크립트로 구현된 동작을 가진 많은 응용 프로그램을 만드는 데 사용되었다. 브라우저가 아닌 다른 응용 프로그램으로는 어도비 아크로뱃의 PDF 문서 스크립팅 지원[44]과 자바스크립트로 작성된 GNOME 셸 확장이 있다.[45]
임베디드 시스템에서 사용되어 왔으며, 일반적으로 Node.js를 활용한다.[46][47][48]
웹 브라우저 외에도 JavaScript를 실행하는 환경이 존재한다. 데이터베이스나 웹 서버에 내장되어 API나 HTTP 요청 및 응답에 대한 접근을 제공하는 경우도 있다.
Node.js처럼 OS의 기능 (네트워크 및 파일 시스템 등)에 접근할 수 있는 환경도 존재한다. Electron과 같은 애플리케이션 프레임워크의 등장으로 Atom과 같은 애플리케이션이 널리 사용되고 있다.
몇몇 애플리케이션에서는 매크로 언어로도 채택되고 있다. 예를 들어 Adobe Acrobat은 JavaScript를 이용한 매크로 기능을 탑재하고 있다.
6. 개발 도구
웹 브라우저는 자바스크립트 디버거를 포함한 웹 개발 도구를 내장하고 있다. ESLint 및 JSLint와 같은 정적 프로그램 분석 도구는 자바스크립트 코드가 표준 및 지침을 준수하는지 검사한다. 일부 브라우저에는 프로파일러가 내장되어 있으며, benchmark.js 및 jsbench와 같은 독립형 프로파일링 라이브러리도 있다. 많은 텍스트 편집기는 자바스크립트 코드에 대한 구문 강조 기능을 지원한다. 자바스크립트 생태계에는 다양한 라이브러리(패키지)가 존재하며, npm
이나 yarn
과 같은 패키지 관리자를 통해 관리된다.
대표적인 자바스크립트 라이브러리는 다음과 같다.
7. 보안
자바스크립트와 DOM은 악의적인 제작자가 웹을 통해 클라이언트 컴퓨터에서 실행될 스크립트를 전달할 가능성을 제공한다. 브라우저 제작자는 두 가지 제한 사항을 사용하여 이 위험을 최소화한다. 첫째, 스크립트는 파일을 생성하는 것과 같은 범용 프로그래밍 작업이 아닌 웹 관련 작업만 수행할 수 있는 샌드박스에서 실행된다. 둘째, 스크립트는 동일 출처 정책에 의해 제한된다. 한 웹사이트의 스크립트는 다른 사이트로 전송된 사용자 이름, 암호 또는 쿠키와 같은 정보에 액세스할 수 없다. 대부분의 자바스크립트 관련 보안 버그는 동일 출처 정책 또는 샌드박스의 위반이다.
일반 자바스크립트의 하위 집합인 ADsafe, 보안 ECMAScript(SES)는 특히 타사(광고 등)에서 생성된 코드에 대해 더 높은 수준의 보안을 제공한다.[77][78] Closure Toolkit은 타사 자바스크립트 및 HTML의 안전한 임베딩 및 격리를 위한 또 다른 프로젝트이다.[79]
콘텐츠 보안 정책은 웹 페이지에서 신뢰할 수 있는 코드만 실행되도록 보장하기 위한 주요 방법이다.
크로스 사이트 스크립팅크로스 사이트 스크립팅(XSS)은 동일 출처 정책을 위반하는 자바스크립트 관련 보안 문제 중 하나이다.[80] XSS 취약점은 공격자가 대상 웹사이트에 악성 스크립트를 삽입하여 사용자의 권한으로 뱅킹 애플리케이션에 접근, 비밀 정보를 유출하거나 돈을 이체하는 등의 행위를 할 수 있게 한다.[80]
XSS 취약점에 대한 중요한 해결책 중 하나는 HTML 위생 처리이다. 일부 브라우저는 반사된 XSS 공격에 대한 부분적인 보호 기능을 제공하지만, 악성 코드가 데이터베이스에 저장되는 경우와 같은 다른 XSS 공격에는 여전히 취약하다. 따라서 서버 측에서 웹 애플리케이션을 올바르게 설계해야 XSS를 완전히 방지할 수 있다. XSS 취약점은 브라우저 제작자의 구현 실수로 인해 발생할 수도 있다.[80]
사이트 간 요청 위조사이트 간 요청 위조(CSRF)는 공격자의 사이트에 있는 코드가 피해자의 브라우저를 속여 대상 사이트에서 사용자가 의도하지 않은 작업(예: 은행에서 돈을 이체)을 수행하게 하는 공격이다. 대상 사이트가 요청 인증에 쿠키에만 의존하는 경우, 공격자의 사이트에서 시작된 요청은 시작하는 사용자의 유효한 로그인 자격 증명을 동일하게 가질 수 있다.
일반적으로 CSRF를 해결하기위해서는 지속적인 영향을 미칠 수 있는 모든 요청을 인증하기 위해 쿠키뿐만 아니라 숨겨진 양식 필드에 인증 값을 요구해야한다. HTTP Referrer 헤더를 확인하는 것도 CSRF를 방어하는데 도움이 될 수 있다.
"자바스크립트 하이재킹"은 공격자의 사이트에 있는 `<script>` 태그가 JSON 또는 자바스크립트와 같은 개인 정보를 반환하는 피해자 사이트의 페이지를 악용하는 CSRF 공격 유형이다.
CSRF의 가능한 해결책은 다음과 같다.
- 개인 정보를 반환하는 모든 응답에 대해 POST 및 GET 매개변수에서 인증 토큰을 요구한다.
기타 보안 문제클라이언트-서버 애플리케이션 개발에서 클라이언트는 공격자의 통제를 받을 수 있으므로, 자바스크립트 코드가 의도대로 실행된다고 가정할 수 없다. 따라서 코드에 포함된 비밀 정보는 공격자에 의해 추출될 수 있다.[82] 예를 들어, 웹사이트는 자바스크립트 작동 방식을 완전히 숨길 수 없으며, 폼 유효성 검사는 보안이 아닌 사용자 편의를 위한 것이다.[81]
자바스크립트 개발자들은 npm과 같은 패키지 관리 시스템을 널리 사용하지만, 라이브러리 유지 관리자가 항상 최신 보안 상태를 유지하는 것은 아니다. 이러한 신뢰 문제로 인해 의존하는 라이브러리에 버그나 취약점이 발생할 수 있다. 연구에 따르면 웹사이트의 37%가 알려진 취약점이 있는 라이브러리를 포함하고 있으며, 라이브러리 제거로 인해 프로그램이 중단될 수도 있다.[83][84][85]
자바스크립트는 다양한 브라우저 기능에 대한 인터페이스를 제공하는데, 버퍼 오버플로우와 같은 결함이 있을 수 있다. 이러한 결함은 파이어폭스,[86] 인터넷 익스플로러,[87] 사파리[88] 등 주요 브라우저에 영향을 미쳤다. 플러그인(예: 어도비 플래시, ActiveX)도 자바스크립트를 통해 악용될 수 있는 결함을 가질 수 있다.[89][90] 구글 크롬은 페이지 렌더러를 자체 "샌드박스"에 가두는 방식으로 이러한 위험을 완화한다.
웹 브라우저는 샌드박스 외부에서 자바스크립트를 실행할 수 있으며, 파일 생성 또는 삭제 권한을 가질 수 있는데, 이러한 권한이 잘못 부여되면 취약점의 원인이 될 수 있다. Internet Explorer[92]와 Firefox[93]에서 이러한 취약점이 발생했으며, 마이크로소프트 윈도우는 윈도우 스크립트 호스트를 통해 샌드박싱되지 않은 자바스크립트 프로그램을 실행할 수 있어 이론적으로 트로이 목마의 실행 경로가 될 수 있다.
2015년에는 로해머 공격에 대한 자바스크립트 기반 개념 증명 구현이 발표되었고,[96][97][98][99] 2017년에는 브라우저를 통해 ASLR을 우회하는 "ASLR⊕Cache" 공격이 시연되었다.[100][101] 2018년에는 스펙터 공격의 자바스크립트 구현이 발표되었다.[102]
7. 1. 크로스 사이트 스크립팅 (XSS)
크로스 사이트 스크립팅(XSS)은 동일 출처 정책을 위반하는 자바스크립트 관련 보안 문제 중 하나이다.[80] XSS 취약점은 공격자가 대상 웹사이트에 악성 스크립트를 삽입하여 사용자의 권한으로 뱅킹 애플리케이션에 접근, 비밀 정보를 유출하거나 돈을 이체하는 등의 행위를 할 수 있게 한다.[80]XSS 취약점에 대한 중요한 해결책 중 하나는 HTML 위생 처리이다. 일부 브라우저는 반사된 XSS 공격에 대한 부분적인 보호 기능을 제공하지만, 악성 코드가 데이터베이스에 저장되는 경우와 같은 다른 XSS 공격에는 여전히 취약하다. 따라서 서버 측에서 웹 애플리케이션을 올바르게 설계해야 XSS를 완전히 방지할 수 있다. XSS 취약점은 브라우저 제작자의 구현 실수로 인해 발생할 수도 있다.[80]
7. 2. 사이트 간 요청 위조 (CSRF)
사이트 간 요청 위조(CSRF)는 공격자의 사이트에 있는 코드가 피해자의 브라우저를 속여 대상 사이트에서 사용자가 의도하지 않은 작업(예: 은행에서 돈을 이체)을 수행하게 하는 공격이다. 대상 사이트가 요청 인증에 쿠키에만 의존하는 경우, 공격자의 사이트에서 시작된 요청은 시작하는 사용자의 유효한 로그인 자격 증명을 동일하게 가질 수 있다.일반적으로 CSRF를 해결하기위해서는 지속적인 영향을 미칠 수 있는 모든 요청을 인증하기 위해 쿠키뿐만 아니라 숨겨진 양식 필드에 인증 값을 요구해야한다. HTTP Referrer 헤더를 확인하는 것도 CSRF를 방어하는데 도움이 될 수 있다.
"자바스크립트 하이재킹"은 공격자의 사이트에 있는 `<script>` 태그가 JSON 또는 자바스크립트와 같은 개인 정보를 반환하는 피해자 사이트의 페이지를 악용하는 CSRF 공격 유형이다.
CSRF의 가능한 해결책은 다음과 같다.
- 개인 정보를 반환하는 모든 응답에 대해 POST 및 GET 매개변수에서 인증 토큰을 요구한다.
7. 3. 기타 보안 문제
클라이언트-서버 애플리케이션 개발에서 클라이언트는 공격자의 통제를 받을 수 있으므로, 자바스크립트 코드가 의도대로 실행된다고 가정할 수 없다. 따라서 코드에 포함된 비밀 정보는 공격자에 의해 추출될 수 있다.[82] 예를 들어, 웹사이트는 자바스크립트 작동 방식을 완전히 숨길 수 없으며, 폼 유효성 검사는 보안이 아닌 사용자 편의를 위한 것이다.[81]자바스크립트 개발자들은 npm과 같은 패키지 관리 시스템을 널리 사용하지만, 라이브러리 유지 관리자가 항상 최신 보안 상태를 유지하는 것은 아니다. 이러한 신뢰 문제로 인해 의존하는 라이브러리에 버그나 취약점이 발생할 수 있다. 연구에 따르면 웹사이트의 37%가 알려진 취약점이 있는 라이브러리를 포함하고 있으며, 라이브러리 제거로 인해 프로그램이 중단될 수도 있다.[83][84][85]
자바스크립트는 다양한 브라우저 기능에 대한 인터페이스를 제공하는데, 버퍼 오버플로우와 같은 결함이 있을 수 있다. 이러한 결함은 파이어폭스,[86] 인터넷 익스플로러,[87] 사파리[88] 등 주요 브라우저에 영향을 미쳤다. 플러그인(예: 어도비 플래시, ActiveX)도 자바스크립트를 통해 악용될 수 있는 결함을 가질 수 있다.[89][90] 구글 크롬은 페이지 렌더러를 자체 "샌드박스"에 가두는 방식으로 이러한 위험을 완화한다.
웹 브라우저는 샌드박스 외부에서 자바스크립트를 실행할 수 있으며, 파일 생성 또는 삭제 권한을 가질 수 있는데, 이러한 권한이 잘못 부여되면 취약점의 원인이 될 수 있다. Internet Explorer[92]와 Firefox[93]에서 이러한 취약점이 발생했으며, 마이크로소프트 윈도우는 윈도우 스크립트 호스트를 통해 샌드박싱되지 않은 자바스크립트 프로그램을 실행할 수 있어 이론적으로 트로이 목마의 실행 경로가 될 수 있다.
2015년에는 로해머 공격에 대한 자바스크립트 기반 개념 증명 구현이 발표되었고,[96][97][98][99] 2017년에는 브라우저를 통해 ASLR을 우회하는 "ASLR⊕Cache" 공격이 시연되었다.[100][101] 2018년에는 스펙터 공격의 자바스크립트 구현이 발표되었다.[102]
8. 관련 기술
8. 1. Java
자바와 자바스크립트는 직접적인 관련은 없지만, 두 언어 모두 C 언어의 영향을 받아 문법이 유사하며, 일반적으로 샌드박스 방식으로 실행된다.[105] 자바스크립트는 자바의 문법과 표준 라이브러리를 염두에 두고 설계되었으며, 자바의 키워드는 원래 자바스크립트에서 예약되어 있었고, 자바스크립트의 표준 라이브러리는 자바의 명명 규칙을 따랐다.[105] 자바스크립트의 `Math` 및 `Date` 객체는 자바 1.0의 클래스를 기반으로 한다.[105]두 언어는 모두 1995년에 처음 등장했지만, 자바는 제임스 고슬링이 썬 마이크로시스템즈에서 개발했고, 자바스크립트는 브렌던 아이크가 넷스케이프 커뮤니케이션스에서 개발했다.
유사점보다 차이점이 더 많은데, 자바는 정적 타이핑을 사용하는 반면 자바스크립트는 동적 타이핑을 사용한다. 자바는 컴파일된 바이트코드로 로드되지만, 자바스크립트는 사람이 읽을 수 있는 소스 코드로 로드된다. 자바는 클래스 기반 프로그래밍을 사용하는 반면, 자바스크립트는 프로토타입 기반 프로그래밍을 사용한다. 자바는 Java 8까지 함수형 프로그래밍을 지원하지 않았지만, 자바스크립트는 Scheme의 영향을 받아 처음부터 함수형 프로그래밍을 지원했다.
8. 2. JSON
JSON(제이슨)은 자바스크립트 객체 표기법(JavaScript Object Notation)을 기반으로 한 데이터 형식이다. 이름에서 알 수 있듯 자바스크립트에서 파생되었으며, 다른 많은 프로그래밍 언어에서도 지원될 만큼 널리 사용된다.8. 3. 트랜스파일러
많은 웹사이트가 자바스크립트를 많이 사용하기 때문에, 개발 과정을 돕기 위해 다른 언어로 작성된 코드를 변환하는 트랜스파일러가 개발되었다.[106] 타입스크립트와 커피스크립트는 자바스크립트로 트랜스파일되는 두 가지 주목할 만한 언어이다. alternative JavaScript(altJS)는 JavaScript로 트랜스파일되는 프로그래밍 언어를 통칭한다.JavaScript에 새로운 기능을 추가하는 방법 중 하나는 새로운 언어를 정의하고 해당 코드를 JavaScript로 변환하는 것이다. 이러한 JavaScript로 트랜스파일되는 언어를 '''altJS'''라고 통칭한다. altJS를 사용하면 새로운 연산자나 표기법을 도입하여 효율적인 JavaScript 개발을 할 수 있다. 순수한 JavaScript는 altJS와 대비하여 바닐라 JS라고 불리기도 한다.[130]
예를 들어 타입스크립트는 타입의 도입을 가능하게 한다. JavaScript는 동적 타입이다. 정적 코드 분석으로 JavaScript 코드에 대한 타입 검사를 실행할 수 있지만, 코드에 타입 표기를 할 수는 없다. altJS 중 하나인 TypeScript는 JavaScript에 타입 노테이션을 도입하고 트랜스파일 시 타입 검사를 수행함으로써, 타입을 가진 JavaScript를 실현하고 있다.
8. 4. WebAssembly
WebAssembly는 특히 웹 페이지 스크립트의 성능이 중요한 부분을 위해 설계된 바이트코드 형식을 가진 새로운 언어이며, 자바스크립트를 보완하기 위해 만들어졌다.[107] 모든 주요 자바스크립트 엔진은 WebAssembly를 지원하며, 이는 일반 자바스크립트 코드와 동일한 샌드박스에서 실행된다.[107]asm.js는 WebAssembly의 전신 역할을 한 자바스크립트의 하위 집합이다.[108]
9. 대한민국과 자바스크립트
참조
[1]
웹사이트
nodejs/node-eps
https://github.com/n[...]
2018-07-05
[2]
간행물
Netscape and Sun announce JavaScript, the Open, Cross-platform Object Scripting Language for Enterprise Networks and the Internet
https://wp.netscape.[...]
1995-12-04
[3]
서적
Coders at Work: Reflections on the Craft of Programming
https://books.google[...]
Apress
2018-12-25
[4]
웹사이트
Popularity – Brendan Eich
https://brendaneich.[...]
[5]
웹사이트
Brendan Eich: An Introduction to JavaScript, JSConf 2010
https://www.youtube.[...]
2019-11-25
[6]
서적
JavaScript Bible
https://archive.org/[...]
John Wiley & Sons
[7]
웹사이트
Usage Statistics of JavaScript as Client-side Programming Language on Websites
https://w3techs.com/[...]
2024-02-27
[8]
웹사이트
ECMAScript 2020 Language Specification
https://tc39.es/ecma[...]
2020-05-08
[9]
뉴스
Bloomberg Game Changers: Marc Andreessen
https://www.bloomber[...]
Bloomberg
2011-12-07
[10]
웹사이트
The Evolution of the Web Browsers
https://www.mwdwebsi[...]
2018-08-31
[11]
웹사이트
Chapter 4. How JavaScript Was Created
https://exploringjs.[...]
2017-11-21
[12]
문서
Netscape Communications Corp. Browser enhancements. Encyclopædia Britannica 2006 Ultimate Reference Suite DVD
[13]
웹사이트
TechVision: Innovators of the Net: Brendan Eich and JavaScript
https://wp.netscape.[...]
[14]
간행물
JavaScript Runs the World—Maybe Even Literally
https://www.wired.co[...]
2024-08-21
[15]
Youtube
Brendan Eich – CEO of Brave
https://www.youtube.[...]
2018-02-07
[16]
웹사이트
Chapter 5. Standardization: ECMAScript
https://speakingjs.c[...]
2021-11-01
[17]
웹사이트
JavaScript, How Did We Get Here?
https://archive.orei[...]
2016-07-16
[18]
웹사이트
Microsoft Internet Explorer 3.0 Beta Now Available
https://news.microso[...]
Microsoft
2016-07-16
[19]
웹사이트
The Unwelcome Return of "Best Viewed with Internet Explorer"
https://www.technolo[...]
2016-07-16
[20]
뉴스
Mozilla Firefox Internet Browser Market Share Gains to 7.4%
https://www.searchen[...]
2021-05-08
[21]
뉴스
The assault on software giant Microsoft
https://news.bbc.co.[...]
2005-05-09
[22]
웹사이트
Big browser comparison test: Internet Explorer vs. Firefox, Opera, Safari and Chrome
https://www.pcgamesh[...]
Computec Media AG
2010-06-28
[23]
웹사이트
Lifehacker Speed Tests: Safari 4, Chrome 2
https://lifehacker.c[...]
2021-05-08
[24]
웹사이트
TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog
https://brendaneich.[...]
2020-07-22
[25]
간행물
Mozilla asks, 'Are we fast yet?'
https://www.wired.co[...]
2019-01-18
[26]
웹사이트
ECMAScript 6: New Features: Overview and Comparison
https://es6-features[...]
2018-03-19
[27]
Webarchive
Professional Node.js: Building JavaScript Based Scalable Software
https://books.google[...]
2017-03-24
[28]
Webarchive
Sams Teach Yourself Node.js in 24 Hours
https://books.google[...]
2017-03-23
[29]
웹사이트
The secret history behind the success of npm and Node
https://www.theserve[...]
2021-08-02
[30]
웹사이트
State of the Union: npm
https://www.linux.co[...]
2021-08-02
[31]
웹사이트
JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16
https://thenewstack.[...]
2021-01-15
[32]
웹사이트
The TC39 Process
https://tc39.es/proc[...]
Ecma International
2021-01-15
[33]
웹사이트
ECMAScript proposals
https://github.com/t[...]
TC39
2021-01-15
[34]
웹사이트
U.S. Trademark Serial No. 75026640
https://tsdr.uspto.g[...]
United States Patent and Trademark Office
2021-05-08
[35]
웹사이트
Legal Notices
https://www.oracle.c[...]
Oracle Corporation
2021-05-08
[36]
뉴스
Oracle to buy Sun in $7.4-bn deal
https://economictime[...]
2009-04-21
[37]
웹사이트
JavaScript™️
https://javascript.t[...]
[38]
웹사이트
Usage statistics of JavaScript libraries for websites
2021-04-09
[39]
웹사이트
Using jQuery with Bootstrap
https://clouddevs.co[...]
2024-03-17
[40]
웹사이트
Vanilla JS
https://vanilla-js.c[...]
2020-06-16
[41]
웹사이트
Server-Side JavaScript Guide
https://docs.oracle.[...]
Oracle Corporation
2021-05-08
[42]
웹사이트
Introducing JScript .NET
https://msdn.microso[...]
Microsoft
2018-04-10
[43]
웹사이트
Server-Side JavaScript, Back with a Vengeance
https://readwrite.co[...]
2016-07-16
[44]
웹사이트
JavaScript for Acrobat
https://www.adobe.co[...]
2009-08-18
[45]
웹사이트
Answering the question: "How do I develop an app for GNOME?"
https://treitter.liv[...]
2013-02-07
[46]
웹사이트
Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel.
https://tessel.io/
2021-05-08
[47]
웹사이트
Node.js Raspberry Pi GPIO Introduction
https://www.w3school[...]
2020-05-03
[48]
웹사이트
Espruino – JavaScript for Microcontrollers
https://www.espruino[...]
2020-05-03
[49]
웹사이트
Concurrency model and Event Loop
2015-08-28
[50]
서적
JavaScript: The Definitive Guide: The Definitive Guide
https://books.google[...]
"O'Reilly Media, Inc."
2019-03-29
[51]
웹사이트
JavaScript quirks in one image from the Internet
https://dev.to/mkrl/[...]
2019-10-28
[52]
웹사이트
Proposal-bigint/ADVANCED.md at master · tc39/Proposal-bigint
[53]
웹사이트
Wat
https://www.destroya[...]
2019-10-28
[54]
웹사이트
JavaScript data types and data structures
https://developer.mo[...]
2017-02-24
[55]
웹사이트
Prototypal Inheritance in JavaScript
https://javascript.c[...]
2013-08-20
[56]
웹사이트
Inheritance and the prototype chain
https://developer.mo[...]
2013-04-06
[57]
서적
Effective JavaScript
https://books.google[...]
Addison-Wesley
[58]
서적
Eloquent JavaScript
https://books.google[...]
No Starch Press
[59]
웹사이트
Understanding "Prototypes" in JavaScript
https://yehudakatz.c[...]
2013-04-06
[60]
서적
Effective JavaScript
https://books.google[...]
Addison-Wesley
[61]
웹사이트
Function – JavaScript
https://developer.mo[...]
2021-10-30
[62]
웹사이트
Properties of the Function Object
https://es5.github.c[...]
Es5.github.com
2013-05-26
[63]
웹사이트
The many talents of JavaScript for generalizing Role-Oriented Programming approaches like Traits and Mixins
https://peterseliger[...]
2014-04-11
[64]
웹사이트
Traits for JavaScript
https://soft.vub.ac.[...]
2010
[65]
웹사이트
Home | CocktailJS
https://cocktailjs.g[...]
2017-02-24
[66]
웹사이트
A fresh look at JavaScript Mixins
https://javascriptwe[...]
2011-05-31
[67]
서적
Eloquent JavaScript
https://books.google[...]
No Starch Press
[68]
웹사이트
E4X – Archive of obsolete content
https://developer.mo[...]
Mozilla Foundation
2014-07-13
[69]
웹사이트
var – JavaScript
https://developer.mo[...]
The Mozilla Developer Network
2012-12-22
[70]
웹사이트
let
https://developer.mo[...]
Mozilla
2018-06-27
[71]
웹사이트
const
https://developer.mo[...]
Mozilla
2018-06-27
[72]
웹사이트
ECMAScript Language Specification – ECMA-262 Edition 5.1
https://www.ecma-int[...]
Ecma International
2012-12-22
[73]
웹사이트
console
https://developer.mo[...]
Mozilla
2013-04-06
[74]
웹사이트
arguments
https://developer.mo[...]
Mozilla
2013-04-06
[75]
웹사이트
function* - JavaScript {{!}} MDN
https://developer.mo[...]
2022-09-27
[76]
웹사이트
JavaScript modules
https://developer.mo[...]
Mozilla
2022-07-28
[77]
웹사이트
Making JavaScript Safe for Advertising
https://www.adsafe.o[...]
ADsafe
2021-05-08
[78]
웹사이트
Secure ECMA Script (SES)
https://code.google.[...]
2013-05-26
[79]
웹사이트
Google Caja Project
https://developers.g[...]
2021-07-09
[80]
웹사이트
Mozilla Cross-Site Scripting Vulnerability Reported and Fixed – MozillaZine Talkback
https://www.mozillaz[...]
2017-02-24
[81]
웹사이트
Right-click "protection"? Forget about it
https://blog.anta.ne[...]
2008-06-17
[82]
웹사이트
Why You Should Never Put Sensitive Data in Your JavaScript
https://www.serviceo[...]
ServiceObjects
2019-06-03
[83]
간행물
Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web
https://web.archive.[...]
2022-07-28
[84]
뉴스
How one programmer broke the internet by deleting a tiny piece of code
https://qz.com/64646[...]
2017-02-22
[85]
뉴스
Developer's 11 lines of deleted code 'breaks the internet'
https://www.scmagazi[...]
SC Magazine UK
2017-02-23
[86]
웹사이트
Buffer overflow in crypto.signText()
https://www.mozilla.[...]
Mozilla Corporation
2014-06-04
[87]
웹사이트
Buffer-overflow bug in IE
https://web.archive.[...]
1998-08-19
[88]
웹사이트
Apple Safari JavaScript Buffer Overflow Lets Remote Users Execute Arbitrary Code and HTTP Redirect Bug Lets Remote Users Access Files
https://securitytrac[...]
SecurityTracker.com
2010-02-18
[89]
웹사이트
Microsoft WebViewFolderIcon ActiveX Control Buffer Overflow Vulnerability
https://www.security[...]
SecurityFocus
2011-10-11
[90]
웹사이트
Macromedia Flash ActiveX Buffer Overflow
https://www.fusionau[...]
Fusion Authority
2011-08-13
[91]
웹사이트
Protected Mode in Vista IE7 – IEBlog
https://blogs.msdn.c[...]
2017-02-24
[92]
웹사이트
Vulnerability Note VU#713878: Microsoft Internet Explorer does not properly validate source of redirected frame
https://www.kb.cert.[...]
US CERT
2009-10-30
[93]
웹사이트
Mozilla Foundation Security Advisory 2005–41: Privilege escalation via DOM property overrides
https://www.mozilla.[...]
Mozilla Foundation
2014-06-04
[94]
웹사이트
Part 5: Enhanced Browsing Security
https://docs.microso[...]
2021-10-20
[95]
웹사이트
JS.Seeker.K
https://www.symantec[...]
Symantec Corporation
2011-09-13
[96]
arXiv
Rowhammer.js: A Remote Software-Induced Fault Attack in JavaScript
2015-07-24
[97]
뉴스
Rowhammer.js Is the Most Ingenious Hack I've Ever Seen
https://motherboard.[...]
Vice (magazine)
2018-01-26
[98]
웹사이트
DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript
https://arstechnica.[...]
2018-01-26
[99]
웹사이트
Rowhammer security exploit: Why a new security attack is truly terrifying
https://www.slate.co[...]
2015-07-29
[100]
웹사이트
AnC
https://www.vusec.ne[...]
VUSec
2017
[101]
웹사이트
New ASLR-busting JavaScript is about to make drive-by exploits much nastier
https://arstechnica.[...]
Ars Technica
2017
[102]
웹사이트
Spectre Attack
https://spectreattac[...]
2018-01-03
[103]
웹사이트
Benchmark.js
https://benchmarkjs.[...]
2016-11-06
[104]
웹사이트
JSBEN.CH Performance Benchmarking Playground for JavaScript
https://jsben.ch
2021-08-13
[105]
웹사이트
Popularity
https://brendaneich.[...]
2012-01-19
[106]
웹사이트
List of languages that compile to JS
https://github.com/j[...]
2020-02-06
[107]
웹사이트
Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine
https://visualstudio[...]
2018-02-09
[108]
웹사이트
frequently asked questions
https://asmjs.org/fa[...]
asm.js
2014-04-13
[109]
문서
新しい (ES2015以降) JavaScriptではクラスの構文によりプロトタイプを意識せずにオブジェクト指向プログラミングをすることが可能になったが、言語設計はプロトタイプベースの設計を維持している。
[110]
문서
もしも待ちの間にプログラムを停止/sleep させると、その間に他の処理をそのスレッドで行うことが出来ない(ブロッキング (インターネット)|ブロッキング)。もしネットワークリクエストが返ってくるまでブロッキングしたとすると、その間ブラウザのレンダリングも停止してしまう。
[111]
서적
Effective JavaScript
翔泳社
2013
[112]
웹사이트
INNOVATORS OF THE NET: BRENDAN EICH AND JAVASCRIPT
http://wp.netscape.c[...]
2008-01-22
[113]
웹사이트
NETSCAPE AND SUN ANNOUNCE JAVASCRIPT, THE OPEN, CROSS-PLATFORM OBJECT SCRIPTING LANGUAGE FOR ENTERPRISE NETWORKS AND THE INTERNET
http://wp.netscape.c[...]
2008-01-22
[114]
문서
ECMA 262, ISO/IEC 16262, JIS X 3060
[115]
서적
JavaScript 第5版
オライリー・ジャパン
2007
[116]
문서
ECMA-262 第5版 2.Conformance
https://www.ecma-int[...]
[117]
문서
WebExtensions, Browser Extensions
https://developer.mo[...]
[118]
문서
ECMAScript® 2017 Language Specification (ECMA-262, 8th edition, June 2017) Introduction
https://www.ecma-int[...]
[119]
웹사이트
Python and JavaScript
http://weblogs.mozil[...]
2006-02-19
[120]
웹사이트
JavaScript 2.0はECMAScript 3.1ベースに、ECMAScript 4は譲歩
https://news.mynavi.[...]
2008-08-18
[121]
웹사이트
Mozilla における ECMAScript 5 のサポート
https://developer.mo[...]
[122]
웹사이트
var – JavaScript – MDN
https://developer.mo[...]
The [[Mozilla Developer Network]]
2012-12-22
[123]
웹사이트
let – JavaScript – MDN
https://developer.mo[...]
The [[Mozilla Developer Network]]
2018-01-24
[124]
웹사이트
const – JavaScript – MDN
https://developer.mo[...]
The [[Mozilla Developer Network]]
2018-01-24
[125]
웹사이트
ECMAScript Language Specification – ECMA-262 Edition 5.1
http://www.ecma-inte[...]
Ecmaインターナショナル
2012-12-22
[126]
웹사이트
Console Living Standard
https://console.spec[...]
WHATWG
2017-05-18
[127]
웹사이트
console
https://developer.mo[...]
Mozilla
2013-04-06
[128]
웹사이트
Rest parameters - JavaScript
https://developer.mo[...]
Mozilla
2018-01-24
[129]
문서
2020-04-10現在 tc39 stage-4 (finished proposal). ECMAScript2020へ採用予定
https://github.com/t[...]
[130]
웹사이트
Vanilla JS
http://vanilla-js.co[...]
2021-09-04
[131]
웹사이트
JavaScript tracking – Piwik
http://piwik.org/doc[...]
Piwik
2012-03-31
[132]
웹사이트
JavaScriptのブラウザ非互換に解決のみとおし
https://news.mynavi.[...]
journal.mycom.co.jp
2009-12-09
[133]
웹사이트
Versions of JavaScript
http://ejohn.org/blo[...]
Ejohn.org
2009-05-19
[134]
문서
node.js ECMAScript Modules Specification
https://github.com/n[...]
[135]
웹인용
What’s the difference between JavaScript and ECMAScript?
https://www.freecode[...]
2017-10-28
[136]
서적
Marc Andreessen and Jim Clark: The Founders of Netscape
http://books.google.[...]
Rosen Publishing Group
[137]
웹인용
Chapter 4. How JavaScript Was Created
http://speakingjs.co[...]
2019-04-15
[138]
저널
JavaScript: Designing a Language in 10 Days
http://www.computer.[...]
IEEE Computer Society
2012-02
[139]
문서
Press release announcing JavaScript
https://web.archive.[...]
[140]
웹인용
TechVision: Innovators of the Net: Brendan Eich and JavaScript
http://wp.netscape.c[...]
web.archive.org
[141]
인용
Brendan Eich - CEO of Brave
https://www.youtube.[...]
2016-06-17
[142]
웹인용
USPTO Copyright entry #75026640
http://tarr.uspto.go[...]
USPTO
[143]
웹인용
보관된 사본
https://gamecodingsc[...]
2017-07-30
[144]
웹인용
Sun Trademarks
http://www.sun.com/s[...]
Sun Microsystems
2007-11-08
[145]
웹인용
var – JavaScript – MDN
https://developer.mo[...]
Mozilla Developer Network
2012-12-22
[146]
웹인용
let
https://developer.mo[...]
Mozilla
2018-06-27
[147]
웹인용
const
https://developer.mo[...]
Mozilla
2018-06-27
[148]
웹인용
보관된 사본
https://developer.mo[...]
2017-07-30
[149]
웹인용
What Version of Javascript
http://javascript.ab[...]
2016-02-22
관련 사건 타임라인
( 최근 20개의 뉴스만 표기 됩니다. )
스칼라의 미래, 자바와 코틀린 사이에서 – 바이라인네트워크
“타입스크립트가 10배 빨라집니다” 그리고 불이 났다 – 바이라인네트워크
개발자는 챗GPT를 좋아한다, 그 어떤 도구보다 – 바이라인네트워크
안랩, 제로데이 취약점 발견...“익스플로러 허점 노렸다” – 바이라인네트워크
오라클, 최신 버전 DB ‘23c’ 베타 발표...앱 개발 간소화 초점 – 바이라인네트워크
신용카드 정보 노린 ‘폼재킹’ 공격 기승...“해외직구족 위험 증가” – 바이라인네트워크
기존 웹 보안 대책으론 한계...증가하는 ‘메이지카트’ 스크립트 공격 대응방안은 – 바이라인네트워크
“커머스·하이테크 기업, 웹공격 주타깃” 아카마이, 크리덴셜스터핑·스크립트 위협 경고 – 바이라인네트워크
파이썬의 인기는 언제까지 갈까? – 바이라인네트워크
취약한 자바스크립트 기반 서비스 보호…악산, ‘시큐어JS’ 발표 – 바이라인네트워크
지금 뜨는 프로그래밍 언어는? ‘스위프트’와 ‘코틀린’ – 바이라인네트워크
입사지원서로 위장한 랜섬웨어 이메일 주의…“감염 피해 속출” – 바이라인네트워크
돌아온 ‘록키’ 랜섬웨어…이메일 통해 국내 유포 – 바이라인네트워크
구글이 제시하는 미래의 웹…AMP와 PWA – 바이라인네트워크
유형 다양화, 제작 대행·입금 상담까지…한층 강력해진 ‘랜섬웨어’ – 바이라인네트워크
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com