Listen to this article

자바스크립트

JavaScript
자바스크립트
자바스크립트 소스코드 스크린샷
패러다임멀티패러다임: 이벤트 중심, 기능 중심, 명령형, 절차 중심, 객체 지향 프로그래밍
설계자NetscapeBrendan Eich는 처음에는 EMCAScript 표준에 기여했습니다.
첫 등장1995년 12월 4일, 28년(1995-12-04)[1]
안정적인 방출
EMC스크립트 2021[2] / 2021년 6월; 2년 전(2021년 6월)
미리보기출고
ECMAcript 2022[3]/2021년 7월 22일, 2년(2021년 7월 22일)
타이핑 규율다이나믹, 나약, 오리
파일 확장자
  • .js
  • .cjs
  • .mjs[4]
웹사이트ecma-international.org/publications-and-standards/standards/ecma-262/
주요구현
V8, 자바스크립트코어, 스파이더몽키, Chakra
영향을 받음
Java,[5][6] Scheme,[6] Self,[7] AWK,[8] HyperTalk[9]
영향받은
ActionScript, AssemblyScript, CoffeeScript, Dart, Haxe, JS++, Opa, TypeScript

자바스크립트(/ ˈd ʒɑːv əskr ɪpt/)는 HTML, CSS와 함께 월드 와이드 웹의 프로그래밍 언어이자 핵심 기술입니다. 2023년 현재 웹사이트의 98.7%가 웹페이지 행동을 위해 클라이언트 측에서 자바스크립트를 사용하고 있으며,[10] 종종 타사 라이브러리를 통합하고 있습니다. 모든 주요 웹 브라우저에는 사용자의 장치에서 코드를 실행할 수 있는 전용 자바스크립트 엔진이 있습니다.

자바스크립트는 ECMA스크립트 표준을 준수하는 높은 수준의, 종종 시간 내에 컴파일된 언어입니다.[11] 동적 타이핑, 프로토타입 기반 객체 지향, 1등급 기능이 있습니다. 이벤트 중심, 기능 및 필수 프로그래밍 스타일을 지원하는 멀티패러다임입니다. 텍스트, 날짜, 정규 표현식, 표준 데이터 구조 및 DOM(Document Object Model) 작업을 위한 응용 프로그램 프로그래밍 인터페이스(API)가 있습니다.

EMCA 스크립트 표준에는 네트워킹, 스토리지 또는 그래픽 시설과 같은 입출력(I/O)이 포함되어 있지 않습니다. 실제로 웹 브라우저나 다른 런타임 시스템은 I/O를 위한 자바스크립트 API를 제공합니다.

자바스크립트 엔진은 원래 웹 브라우저에서만 사용되었으나, 현재는 일부 서버와 다양한 애플리케이션의 핵심 구성 요소입니다. 이 용도로 가장 많이 사용되는 런타임 시스템Node.js입니다.

자바와 자바스크립트는 이름, 구문, 각각의 표준 라이브러리에서 유사하지만 두 언어는 구별되고 디자인에서 큰 차이가 있습니다.

역사

Netscape에서 작성

그래픽 사용자 인터페이스를 갖춘 최초의 인기 웹 브라우저모자이크는 1993년에 출시되었습니다. 비기술자가 접근할 수 있는 이 웹은 초기 월드 와이드 웹의 급속한 성장에 중요한 역할을 했습니다.[12] 그 후 Mosaic의 주요 개발자들은 1994년에 더 세련된 브라우저인 Netscape Navigator를 출시한 Netscape Corporation을 설립했습니다. 이것은 빠르게 가장 많이 사용되는 제품이 되었습니다.[13]

웹이 형성되는 이 기간 동안 웹 페이지는 정적일 수 밖에 없었고, 페이지가 브라우저에 로드된 후 동적 동작을 수행할 수 있는 기능이 없었습니다. 번창하는 웹 개발 장면에서 이러한 제한을 제거하려는 열망이 있었기 때문에 1995년 Netscape는 Navigator에 스크립팅 언어를 추가하기로 결정했습니다. 그들은 이것을 달성하기 위해 두 가지 경로를 추구했습니다: Java 프로그래밍 언어를 내장하기 위해 Sun Microsystems와 협력하는 동시에 Scheme 언어를 내장하기 위해 Brendan Eich를 고용했습니다.[6]

넷스케이프 경영진은 곧 아이히가 자바와 유사한 구문을 가지고 기존의 스킴이나 다른 스크립팅 언어들과 덜 비슷한 새로운 언어를 고안하는 것이 최선의 선택이라고 결정했습니다.[5][6] 새로운 언어와 그 인터프리터 구현은 1995년 9월 네비게이터 베타의 일부로 처음 출시되었을 때 라이브스크립트라고 불렸지만, 12월에 정식 출시를 위해 이름이 자바스크립트로 변경되었습니다.[6][1][14]

자바스크립트 이름의 선택은 자바와 직접적인 관련이 있음을 암시하며 혼란을 야기했습니다. 당시 닷컴 붐이 시작되고 자바가 인기 있는 새로운 언어였기 때문에 아이히는 자바스크립트 이름을 넷스케이프의 마케팅 책략으로 여겼습니다.[15]

마이크로소프트 채용

마이크로소프트는 1995년 인터넷 익스플로러를 선보였고, 넷스케이프와의 브라우저 전쟁으로 이어졌습니다. 자바스크립트 프론트에서 마이크로소프트는 Navigator 인터프리터를 역설계하여 Jscript라고 하는 자체를 만들었습니다.[16]

자바스크립트는 CSS와 HTML 확장에 대한 초기 지원과 함께 1996년에 처음 출시되었습니다. 이들 각각의 구현들은 네비게이터의 그것들과는 눈에 띄게 달랐습니다.[17][18] 이러한 차이로 인해 개발자들은 웹 사이트가 두 브라우저 모두에서 잘 작동하도록 만들기가 어려웠고, 몇 년 동안 "Netscape에서 가장 잘 볼 수 있는" 로고와 "Internet Explorer에서 가장 잘 볼 수 있는" 로고를 널리 사용하게 되었습니다.[17][19]

J스크립트의 상승

1996년 11월, 넷스케이프는 모든 브라우저 공급업체가 준수할 수 있는 표준 규격의 시작점으로 자바스크립트를 Ecma International에 제출했습니다. 이를 통해 1997년 6월 최초의 EMC 스크립트 언어 규격이 공식적으로 공개되었습니다.

표준 프로세스는 1998년 6월 EMCAcript 2, 1999년 12월 EMCAcript 3이 출시되는 등 몇 년간 계속되었습니다. EMC스크립트 4에 대한 작업은 2000년에 시작되었습니다.[16]

한편, 마이크로소프트는 브라우저 시장에서 점점 더 우위를 점하게 되었습니다. 2000년대 초반까지 인터넷 익스플로러의 시장 점유율은 95%[20]에 달했습니다. 이는 Jscript가 웹에서 클라이언트스크립팅을 위한 사실상의 표준이 되었음을 의미했습니다.

마이크로소프트는 처음에 표준 프로세스에 참여하여 J스크립트 언어로 일부 제안을 구현했지만 결국 Ecma 작업에 대한 협업을 중단했습니다. 그래서 EMCA스크립트 4는 mothball이었습니다.

성장 및 표준화

2000년대 초반 인터넷 익스플로러가 지배적이었던 시기에는 클라이언트 측 스크립팅이 정체되어 있었습니다. 이것은 넷스케이프의 후계자인 모질라파이어폭스 브라우저를 출시한 2004년부터 바뀌기 시작했습니다. 파이어폭스는 인터넷 익스플로러로부터 상당한 시장 점유율을 차지하며 많은 사람들에게 호평을 받았습니다.[21]

2005년, 모질라는 ECMA International에 가입했고, ECMA 스크립트 for XML(E4X) 표준에 대한 작업을 시작했습니다. 이로 인해 Mozilla는 Macromedia(나중에 Adobe Systems에 인수됨)와 공동으로 E4X를 EMA스크립트 4 초안을 기반으로 한 액션스크립트 3 언어로 구현하게 되었습니다. 목표는 액션스크립트 3을 새로운 EMC 스크립트 4로 표준화하는 것이 되었습니다. 이를 위해 Adobe Systems는 오픈 소스 프로젝트로 Tamarin 구현을 공개했습니다. 그러나 Tamarin과 ActionScript 3은 기존의 클라이언트 측 스크립팅과는 너무 달랐고, 마이크로소프트의 협력 없이는 EMC스크립트 4는 결실을 맺지 못했습니다.

한편 ECMA 업무와 연계되지 않은 오픈 소스 커뮤니티에서 매우 중요한 발전이 일어나고 있었습니다. 2005년 Jesse James Garrett는 백서를 발표하여 Ajax라는 용어를 만들고 자바스크립트가 백본인 일련의 기술을 설명하여 전체 페이지를 다시 로드할 필요를 방지하고 데이터를 백그라운드로 로드할 수 있는 웹 응용 프로그램을 만들었습니다. 이것은 오픈 소스 라이브러리와 그 주변에 형성된 커뮤니티에 의해 주도되는 자바스크립트의 르네상스 시대를 촉발시켰습니다. jQuery, Prototype, Dojo ToolkitMooTools를 포함한 많은 새로운 라이브러리가 생성되었습니다.

구글은 경쟁사보다 빠른 V8 자바스크립트 엔진을 탑재한 크롬 브라우저를 2008년에 선보였습니다.[22][23] 주요 혁신은 JIT(Just-in-Time Compilitation)이었기 [24]때문에 다른 브라우저 공급업체들은 JIT를 위한 엔진을 정비해야 했습니다.[25]

2008년 7월, 이 이질적인 당들은 오슬로에서 회의를 위해 모였습니다. 이로 인해 2009년 초에 모든 관련 작업을 통합하고 언어를 발전시키기로 최종 합의했습니다. 결과는 2009년 12월에 발표된 EMC 스크립트 5 표준입니다.

만기도래

언어에 대한 야심찬 작업은 몇 년 동안 계속되었으며, 2015년 EMC스크립트 6이 출판되면서 공식화된 광범위한 추가 및 개선 사항 모음으로 끝이 났습니다.[26]

2009년 Ryan DahlNode.js를 개발하면서 웹 브라우저 이외의 자바스크립트 사용이 크게 증가했습니다. 노드는 V8 엔진, 이벤트 루프, I/O API를 결합하여 독립 실행형 자바스크립트 런타임 시스템을 제공합니다.[27][28] Node는 2018년 현재 수백만 명의 개발자가 사용하고 있으며,[29] npm은 전 세계 패키지 매니저 중 가장 많은 모듈을 보유하고 있습니다.[30]

EMCAcript 초안 사양은[as of?] 현재 GitHub에서 공개적으로 유지되고 있으며, 정기적인 연간 스냅샷을 통해 버전이 생성됩니다.[31] 언어에 대한 잠재적인 수정 사항은 종합적인 제안 과정을 통해 검토됩니다.[32][33] 이제 에디션 번호 대신 개발자들이 개별적으로 향후 기능의 상태를 확인합니다.[31]

현재의 자바스크립트 생태계는 많은 라이브러리와 프레임워크를 가지고 있으며, 확립된 프로그래밍 관행과 웹 브라우저 이외의 상당한 자바스크립트 사용을 가지고 있습니다. 또한 단일 페이지 응용 프로그램과 기타 자바스크립트가 많은 웹 사이트가 증가함에 따라 개발 프로세스를 지원하기 위해 여러 의 트랜스파일러가 개발되었습니다.[34]

상표

"JavaScript"는 미국 오라클 Corporation상표입니다.[35][36] 이 상표는 원래 1997년 5월 6일에 Sun Microsystems에 발행되었으며 2009년 Sun을 인수하면서 Oracle로 이전되었습니다.[37]

웹사이트 클라이언트측 사용

자바스크립트는 웹의 지배적인 클라이언트스크립트 언어로, 전체 웹사이트의 98%(2022년 중반)[38]가 이 목적으로 자바스크립트를 사용합니다. 스크립트는 HTML 문서에 포함되거나 포함되며 DOM과 상호 작용합니다. 모든 주요 웹 브라우저에는 사용자의 장치에서 코드를 실행하는 자바스크립트 엔진이 내장되어 있습니다.

스크립트로 작성된 동작의 예

  • Ajax 또는 WebSocket을 통해 페이지를 다시 로드하지 않고 새 웹 페이지 컨텐츠를 로드합니다. 예를 들어, 소셜 미디어 사용자는 현재 페이지를 떠나지 않고 메시지를 주고받을 수 있습니다.
  • 객체를 안팎으로 페이딩하고 크기를 조정하고 이동하는 등의 웹 페이지 애니메이션.
  • 브라우저 게임을 하고 있습니다.
  • 스트리밍 미디어 재생 제어.
  • 팝업 광고 또는 알림 상자를 생성하는 중입니다.
  • 데이터가 웹 서버로 전송되기 전에 웹 양식의 입력 을 확인합니다.
  • 사용자의 동작에 대한 데이터를 기록한 후 서버로 전송합니다. 웹사이트 소유자는 이 데이터를 분석, 광고 추적개인화에 사용할 수 있습니다.
  • 사용자를 다른 페이지로 리디렉션합니다.
  • 저장소 또는 Indexed를 통해 사용자의 장치에 데이터 저장 및 검색DB 표준.

웹 라이브러리 및 프레임워크

웹 사이트의 80% 이상이 클라이언트 측 스크립팅을 위해 타사 JavaScript 라이브러리 또는 웹 프레임워크를 사용합니다.[39]

j쿼리

jQuery는 웹사이트의 75% 이상이 사용하는 가장 인기 있는 클라이언트 측 라이브러리입니다.[39]

리액트

반응(React.js 또는 React라고도 함)JS)는 컴포넌트를 기반으로 사용자 인터페이스를 구축하기 위한 자유 오픈 소스 프론트 엔드 자바스크립트 라이브러리입니다[40][41]. 메타(구 페이스북)와 개별 개발자 및 기업의 커뮤니티에 의해 유지됩니다.[42][43][44]

React는 Next.js와 같은 프레임워크를 사용하여 단일 페이지, 모바일 또는 서버 렌더링 애플리케이션을 개발하는 데 사용할 수 있습니다. React는 사용자 인터페이스와 DOM에 대한 렌더링 구성 요소에만 관련되기 때문에 React 응용 프로그램은 라우팅 및 기타 클라이언트 측 기능을 위해 라이브러리에 의존하는 경우가 많습니다.[45][46] React의 주요 장점은 페이지에서 변경된 부분만 재렌더링하여 변경되지 않은 DOM 요소를 불필요하게 재렌더링하지 않는다는 것입니다.

각진

앵귤러(Angular [47]2+)는 구글의 앵귤러 팀과 개인 및 기업 커뮤니티가 주도하는 타입스크립트 기반자유로운 오픈 소스 단일 페이지애플리케이션 프레임워크입니다. Angular는 Angular를 만든 팀과 같은 팀에서 완전히 다시 쓴 것입니다.JS.

바닐라제이에스

대조적으로, "바닐라 JS"라는 용어는 표준 자바스크립트 기능에 전적으로 의존하면서 라이브러리나 프레임워크를 사용하지 않는 웹사이트를 위해 만들어졌습니다.[48]

기타용도

자바스크립트의 사용은 웹브라우저의 뿌리를 넘어 확장되었습니다. 자바스크립트 엔진은 현재 서버측 웹사이트 배포 및 비브라우저 응용 프로그램을 위한 다양한 다른 소프트웨어 시스템에 내장되어 있습니다.

서버 측의 자바스크립트 사용을 촉진하기 위한 초기 시도는 Netscape Enterprise Server와 Microsoft의 Internet Information Services였지만 작은 틈새 시장이었습니다.[49][50][51] 서버측 사용량은 2000년대 후반 Node.js 및 기타 접근 방식이 개발되면서 점차 증가하기 시작했습니다.[51]

전자, 코르도바, 리액트 네이티브 및 기타 응용 프로그램 프레임워크는 자바스크립트로 구현된 동작을 가진 많은 응용 프로그램을 만드는 데 사용되었습니다. 다른 비브라우저 응용 프로그램으로는 PDF 문서[52] 스크립팅을 위한 Adobe Acrobat 지원과 자바스크립트로 작성된 GNOME Shell 확장이 있습니다.[53]

자바스크립트는 최근 Node.js를 활용하여 일부 임베디드 시스템에 나타나기 시작했습니다.[54][55][56]

실행시스템

Just-In-Time 컴파일

자바스크립트 엔진

자바스크립트 엔진은 자바스크립트 코드를 실행하는 소프트웨어 구성 요소입니다. 최초의 자바스크립트 엔진들단순한 인터프리터였지만, 모든 최신 엔진들은 성능 향상을 위해 시간 내 컴파일을 사용합니다.[57]

자바스크립트 엔진은 일반적으로 웹 브라우저 벤더에 의해 개발되며 모든 주요 브라우저에는 하나가 있습니다. 브라우저에서 JavaScript 엔진은 Document Object Model을 통해 렌더링 엔진과 함께 실행됩니다.

자바스크립트 엔진의 사용은 브라우저에만 국한되지 않습니다. 예를 들어, V8 엔진Node.jsDeno 런타임 시스템의 핵심 구성 요소입니다.

ECMAScript는 자바스크립트의 표준화된 규격이므로, ECMAScript 엔진은 이 엔진들의 다른 이름입니다. WebAssembly의 등장으로 일부 엔진은 일반 자바스크립트 코드와 동일한 샌드박스에서 이 코드를 실행할 수도 있습니다.

런타임 환경

자바스크립트는 일반적으로 런타임 환경(예: 웹 브라우저)에 의존하여 스크립트가 환경(예: 웹 페이지 DOM)과 상호 작용할 수 있는 객체 및 방법을 제공합니다. 이러한 환경은 단일 스레드입니다. 또한 자바스크립트는 런타임 환경에 의존하여 스크립트(예: HTML)를 포함/가져오는 기능을 제공합니다. <script> 원소). 이는 언어 기능 자체는 아니지만 대부분의 자바스크립트 구현에서 일반적입니다. 자바스크립트는 한 번에 하나씩 대기열메시지를 처리합니다. 자바스크립트는 각 새 메시지와 연관된 함수를 호출하여 함수의 인수로컬 변수가 있는 호출 스택 프레임을 만듭니다. 콜 스택은 기능의 필요에 따라 축소되고 성장합니다. 함수 완료 시 콜 스택이 비어 있으면 자바스크립트는 큐의 다음 메시지로 진행합니다. 이를 이벤트 루프라고 하며, 각 메시지가 다음 메시지를 고려하기 전에 완전히 처리되기 때문에 "완료까지 실행"이라고 설명합니다. 그러나 언어의 동시성 모델은 이벤트 루프를 비차단(non-blocking)으로 설명합니다: 프로그램 입출력이벤트콜백 기능을 사용하여 수행됩니다. 예를 들어, 이것은 자바스크립트가 데이터베이스 쿼리가 정보를 반환할 때까지 기다리는 동안 마우스 클릭을 처리할 수 있다는 것을 의미합니다.[58]

Node.js
Node.js윈도우, 리눅스, 유닉스, macOS 등에서 실행할 수 있는 크로스 플랫폼 오픈 소스 자바스크립트 런타임 환경입니다. Node.js는 V8 자바스크립트 엔진에서 실행되며, 웹 브라우저 외부에서 자바스크립트 코드를 실행합니다.
데노
Deno / di ːno ʊ/는 V8 자바스크립트 엔진과 러스트 프로그래밍 언어를 기반으로 하는 자바스크립트, 타입스크립트, 웹어셈블리를 위한 런타임입니다. Deno는 Node.js를 만들기도 했던 Ryan Dahl이 공동으로 만들었습니다.[60]

특징들

다음 기능은 명시적으로 달리 명시되지 않는 한 모든 EMCAScript 구현에 공통적입니다.

명령적이고 체계적인

자바스크립트는 C에서 구조화된 프로그래밍 구문의 대부분을 지원합니다. if 진술들, while 루프, switch 진술들, do while 루프 등). 한가지 부분적인 예외는 스코핑입니다: 원래 자바스크립트는 오직 기능 스코핑만 가지고 있었습니다. var; EMCAscript 2015에서 키워드와 함께 블록 범위 지정이 추가되었습니다. let 그리고. const. C와 마찬가지로 자바스크립트는 을 구분합니다. C와 구문론적으로 다른 점은 (문을 종료하는) 세미콜론을 생략할 수 있는 자동 세미콜론 삽입입니다.[61]

약하게 타이핑함

자바스크립트가 약하게 입력되어 있어서 사용되는 작업에 따라 특정 유형이 암시적으로 캐스팅됩니다.[62]

  • 이진법 + 연산자는 두 피연산자가 모두 숫자인 경우를 제외하고 두 피연산자를 문자열에 캐스트합니다. 덧셈 연산자가 연접 연산자의 두 배이기 때문입니다.
  • 이진법 - 연산자는 항상 두 피연산자를 모두 숫자에 캐스팅합니다.
  • 두 단항 연산자()+, -) 피연산자를 항상 숫자로 캐스팅합니다.

값은 다음과 같은 문자열에 캐스팅됩니다.[62]

  • 문자열은 그대로 남습니다.
  • 숫자는 문자열 표현으로 변환됩니다.
  • 배열은 요소를 문자열에 캐스팅한 후 쉼표로 연결됩니다.,)
  • 다른 개체는 문자열로 변환됩니다. [object Object] 어디에 Object 개체의 생성자 이름입니다.

값은 문자열에 캐스팅한 다음 문자열을 숫자에 캐스팅하여 숫자에 캐스팅됩니다. 이러한 프로세스는 정의를 통해 수정할 수 있습니다. toString 그리고. valueOf 각각 스트링과 번호 캐스팅을 위한 프로토타입의 기능.

자바스크립트는 규칙의 복잡성이 불일치로 오인될 수 있기 때문에 이러한 변환을 구현하는 방식에 대해 비판을 받았습니다.[63][62] 예를 들어 문자열에 숫자를 추가할 때 연결을 수행하기 전에 숫자가 문자열에 캐스팅되지만 문자열에서 숫자를 뺄 때는 빼기 전에 숫자에 캐스팅됩니다.

자바스크립트 형식 변환
레프트 피연산자 교환입니다. 오른쪽 피연산자 결과
[] (빈 배열) + [] (빈 배열) "" (빈 문자열)
[] (빈 배열) + {} (빈 개체) "[object Object]" (끈)
false (boolean) + [] (빈 배열) "false" (끈)
"123"(끈) + 1 (숫자) "1231" (끈)
"123" (끈) - 1 (숫자) 122 (숫자)
"123" (끈) - "abc" (끈) NaN (숫자)

종종 언급되기도 합니다. {} + [] 결과적으로 0 (숫자). 오해의 소지가 있습니다. {} 는 빈 개체 대신 빈 코드 블록으로 해석되며 빈 배열은 나머지 유니터리에 의해 숫자로 캐스팅됩니다. + 교환입니다. 식을 괄호로 감싸면 ({} + []) 곱슬괄호는 빈 개체로 해석되며 표현의 결과는 "[object Object]" 역시[62]

역학

타자 치기

자바스크립트는 대부분의 다른 스크립트 언어들처럼 동적으로 입력됩니다. 유형은 식이 아니라 값과 연결됩니다. 예를 들어, 처음에 숫자에 바인딩된 변수를 문자열로 재할당할 수 있습니다.[64] 자바스크립트는 오리 타이핑을 포함하여 객체의 유형을 테스트하는 다양한 방법을 지원합니다.[65]

런타임평가

자바스크립트는 다음을 포함합니다. eval 런타임에 문자열로 제공되는 문을 실행할 수 있는 함수입니다.

객체 지향(프로토타입 기반)

자바스크립트의 프로토타입팔 상속은 더글러스 크록포드에 의해 다음과 같이 기술되었습니다.

프로토타입 오브젝트를 만들고 새로운 인스턴스를 만듭니다. 개체는 자바스크립트에서 변경 가능하므로 새 인스턴스를 증강하여 새 필드와 메서드를 제공할 수 있습니다. 그런 다음 이들은 더 새로운 물체의 프로토타입 역할을 할 수 있습니다. 우리는 비슷한 물건을 많이 만들기 위해 수업이 필요하지 않습니다. 개체는 개체에서 상속됩니다. 그것보다 더 객관적인 방향이 될 수 있는 것이 무엇일까요?[66]

자바스크립트에서 객체프로토타입(아래 참조)으로 증강된 연관 배열입니다. 각각의 키는 객체 속성의 이름을 제공하며, 이러한 이름을 지정하는 두 가지 구문적 방법이 있습니다: 도트 표기법(dot notation)obj.x = 10) 및 괄호 표기법()obj['x'] = 10). 속성은 런타임에 추가, 반등 또는 삭제할 수 있습니다. 개체의 대부분의 속성(및 개체의 프로토타입 상속 체인에 속하는 모든 속성)은 다음을 사용하여 열거할 수 있습니다. for...in 고리.

프로토타입

자바스크립트는 다른 많은 객체 지향 언어들이 상속을 위해 클래스를 사용하는 프로토타입을 사용합니다.[67] 자바스크립트의 프로토타입으로 많은 클래스 기반 기능을 시뮬레이션할 수 있습니다.[68]

객체 생성자로서의 기능

기능은 일반적인 역할과 함께 객체 생성자로서의 역할을 이중으로 수행합니다. 함수 호출을 new로 접두사를 붙이면 생성자로부터 속성 및 메서드를 상속받아 프로토타입의 인스턴스가 생성됩니다(속성 포함). Object 원형).[69] EMC 스크립트 5는 다음을 제공합니다. Object.create 메서드, 자동으로 상속되지 않고 인스턴스를 명시적으로 생성할 수 있습니다. Object 프로토타입(이전 환경은 프로토타입을 다음에 할당할 수 있음) null).[70] 시공자의 prototype 속성은 새 개체의 내부 프로토타입에 사용되는 개체를 결정합니다. 컨스트럭터로 사용되는 기능의 프로토타입을 수정하여 새로운 방식을 추가할 수 있습니다. 다음과 같은 자바스크립트의 내장형 컨스트럭터. Array 아니면 Object, 또한 수정할 수 있는 프로토타입도 있습니다. 수정이 가능한 동안 Object 프로토타입, 자바스크립트의 대부분의 객체들은 다음으로부터 메소드와 속성을 상속받기 때문에 일반적으로 나쁜 관행으로 간주됩니다. Object 프로토타입, 그리고 프로토타입이 수정될 것으로 예상하지 않을 수 있습니다.[71]

메소드로서의 기능

많은 객체 지향 언어와는 달리 자바스크립트에서는 함수 정의와 메소드 정의가 구분되지 않습니다. 오히려 기능 호출 중에 구별이 발생합니다. 함수가 개체의 메서드로 호출될 때 함수의 로컬 이 키워드는 해당 호출에 대해 해당 개체에 바인딩됩니다.

기능적

자바스크립트 함수1급입니다. 함수는 개체로 간주됩니다.[72] 이와 같이 함수는 다음과 같은 속성과 메서드를 가질 수 있습니다. .call() 그리고. .bind().[73]

어휘 폐쇄

중첩 함수는 다른 함수 내에서 정의된 함수입니다. 외부 기능이 호출될 때마다 생성됩니다.

또한, 각 중첩된 함수는 어휘 폐쇄를 형성합니다: 외부 함수의 어휘 범위(상수, 로컬 변수 또는 인수 값 포함)는 외부 함수의 실행이 끝난 후에도 각 내부 함수 객체의 내부 상태의 일부가 됩니다.[74]

익명 함수

자바스크립트는 익명 기능도 지원합니다.

대표자

자바스크립트는 암시적이고 명시적인 위임을 지원합니다.

역할로서의 기능(특성 및 혼합)

자바스크립트는 기본적으로 특성[76][77] 믹신과 같은 역할[75] 패턴의 다양한 기능 기반 구현을 지원합니다.[78] 이러한 함수는 적어도 하나의 방법으로 추가 동작을 정의합니다. this 그 안에 있는 키워드. function body. 그러면 역할이 명시적으로 위임되어야 합니다. call 아니면 apply 프로토타입 체인을 통해 공유되지 않는 추가 동작을 포함해야 하는 개체.

개체구성 및 상속

명시적 기능 기반 위임은 자바스크립트로 구성을 다루는 반면, 암시적 위임은 예를 들어 객체와 관련이 있을 수 있지만 직접 소유하지 않은 방법을 찾기 위해 프로토타입 체인을 걸을 때마다 이미 발생합니다. 메서드가 발견되면 이 개체의 컨텍스트 내에서 메서드가 호출됩니다. 따라서 자바스크립트의 상속은 생성자 함수의 프로토타입 속성에 바인딩된 위임 자동화에 의해 적용됩니다.

여러가지 종류의

제로베이스넘버링

자바스크립트는 제로 인덱스 언어입니다.

변분함수

함수에 무한히 많은 매개변수를 전달할 수 있습니다. 함수는 공식 매개 변수 및 로컬을 통해 액세스할 수 있습니다. arguments 물건. 다음을 사용하여 다양한 기능을 만들 수도 있습니다. bind 방법.

배열 및 객체 리터럴

많은 스크립팅 언어에서와 마찬가지로 배열과 객체(다른 언어의 연관 배열)는 각각 간단한 바로 가기 구문으로 생성할 수 있습니다. 실제로 이러한 리터럴JSON 데이터 형식의 기초를 형성합니다.

정규식

또한 자바스크립트는 펄과 유사한 방식으로 정규 표현식을 지원하는데, 이는 내장된 문자열 함수보다 더 정교한 텍스트 조작을 위한 간결하고 강력한 구문을 제공합니다.[79]

약속 및 비동기/대기

자바스크립트는 비동기 연산 처리를 위한 약속비동기/대기를 지원합니다.[citation needed]

약속들

기본 제공된 Promise 개체는 약속을 처리하고 처리자를 비동기 작업의 최종 결과와 연결하기 위한 기능을 제공합니다. 최근 자바스크립트 사양은 개발자들이 여러 자바스크립트 약속을 결합하고 서로 다른 시나리오에 기반한 연산을 할 수 있는 컴비네이터 방식을 도입했습니다. 소개된 방법은 Promise.race, Promise 입니다.다, 약속.모든 것을 해결하고 약속합니다.조금도.

비동기/대기

비동기/대기 기능을 사용하면 비동기 비차단 기능을 일반 동기 기능과 유사한 방식으로 구성할 수 있습니다. 비동기식 비차단 코드는 최소한의 오버헤드로 기존의 동기식 비차단 코드와 유사한 구조로 작성될 수 있습니다.

벤더별 확장

역사적으로 일부 자바스크립트 엔진은 다음과 같은 비표준 기능을 지원했습니다.

  • 조건부의 catch 절(Java 등)
  • 배열 이해 및 생성기 식(예: Python)
  • 간결한 함수식()function(args) expr; 이 실험 구문 예측 화살표 함수)
  • ECMA스크립트에 네이티브 XML 지원을 추가하는 확장자인 E4X(E4X)용 ECMA스크립트(버전 21[80] 이후로는 Firefox에서 지원되지 않음)

구문

간단한 예

자바스크립트의 변수는 다음을 사용하여 정의할 수 있습니다. var,[81] let[82] 아니면 const[83] 키워드 키워드 없이 정의된 변수는 전역 범위에서 정의됩니다.

// 'x'라는 함수 범위 변수를 선언하고 암묵적으로 다음을 할당합니다. // 특수 값 'undefined'입니다. 값이 없는 변수는 자동으로 지정됩니다. // 미정으로 설정합니다. // var는 일반적으로 나쁜 관행으로 간주되며 일반적으로 let과 const가 선호됩니다. 바아 x;  // 변수를 이렇게 수동으로 'undefined'로 설정할 수 있습니다. 허락하다 x2 = 미정의;  // 'y'라는 이름의 블록 범위 변수를 선언하고 암시적으로 다음과 같이 설정합니다. // 미정의 'let' 키워드는 EMCAScript 2015에서 소개되었습니다. 허락하다 y;  // 'z'라는 이름의 블록 범위 재할당 불가능 변수를 선언하고 다음으로 설정합니다. // 직역 문자 'const' 키워드는 EMCAScript 2015에서도 소개된 바 있습니다. // 명시적으로 할당해야 합니다.  // 키워드 'const'는 상수를 의미하므로 변수를 재할당할 수 없습니다. // 값이 'constant'이므로 상투적인 z = "이 값은 재할당할 수 없습니다!";  // 전역 범위 변수를 선언하고 3을 할당합니다.  이것은 일반적으로 고려됩니다. // 잘못된 관행이며 엄격한 모드가 켜져 있으면 작동하지 않습니다. t = 3;  // myNumber라는 이름의 변수를 선언하고 number 리터럴(값)을 할당합니다. // 2) 거기에. 허락하다 마이넘버 = 2;  // myNumber를 문자열 리터럴("foo" 값)로 설정하여 재할당합니다. // 자바스크립트는 동적으로 입력되는 언어이므로 이것은 합법적입니다. 마이넘버 = "foo"; 

위의 예에서 언급한 내용을 기록해 두 번의 전방 슬래시가 선행합니다.

자바스크립트에는 내장된 입출력 기능이 없으며, 대신 런타임 환경에서 제공됩니다. 5.1판의 EMCA스크립트 명세는 "외부 데이터의 입력이나 계산 결과의 출력에 대한 규정이 본 명세서에는 없다"[84]고 언급하고 있습니다. 그러나 대부분의 런타임 환경에는 console 출력을 인쇄하는 데 사용할 수 있는 개체입니다.[85] 다음은 콘솔 객체가 있는 런타임 환경에서 자바스크립트로 된 미니멀리즘 헬로 월드 프로그램입니다.

위로의.로그.("안녕, 월드!"); 

HTML 문서에서 출력을 위해서는 다음과 같은 프로그램이 필요합니다.

// 텍스트 노드는 "쓰기" 방법을 사용하여 만들 수 있습니다. // 문서가 완전히 로드된 경우 문서를 덮어쓸 수 있으므로 이 문제는 눈살을 찌푸리게 합니다. 문서.글을 쓰다(푸.);  // 요소도 만들 수 있습니다. 먼저 DOM에서 생성해야 합니다. 상투적인 마이엘렘 = 문서.createElement(스판);  // 클래스 및 ID와 같은 속성도 설정할 수 있습니다. 마이엘렘.클래스리스트.더하다(푸.); 마이엘렘.id = '바';  // 이 설정 후 태그는 다음과 같이 표시됩니다. '<span class="foo" id="bar" data-attr="baz">/span>. 마이엘렘.setAttribute(data-attr', 'baz'); // 이는 'myElem.dataset.attr = 'baz'로도 쓸 수 있습니다.  // 마지막으로 HTML의 <body>에 하위 요소로 추가합니다. 문서..추가 차일드(마이엘렘);  // 요소는 querySelector를 사용하여 하나의 요소에 대해 또는 querySelectorAll을 사용하여 각각에 대해 루프할 수 있는 여러 요소에 대해 querySelectorAll을 사용하여 반드시 잡을 수 있습니다. 문서.쿼리선택기('''수업'''); // 클래스가 있는 첫 번째 요소를 선택합니다. 문서.쿼리선택기('#id'); // ID가 "id"인 첫 번째 요소를 선택합니다. 문서.쿼리선택기('[자료-기타]'); // "data-other" 특성을 가진 첫 번째 요소를 선택합니다. 문서.쿼리선택기모든.('다중'); // "multiple" 클래스가 있는 모든 요소의 Array-like NodeList를 반환합니다. 

자연수계승을 계산하는 단순 재귀 함수:

기능. 계승의(n) {     // 정당성을 위한 주장을 확인하는 것. 요인은 양의 정수에 대해 정의됩니다.     한다면 (Is NaN(n)) {         위로의.과오("숫자가 아닌 인수는 허용되지 않습니다.");         돌아가다 NaN; // 특별한 값: 숫자 아님     }     한다면 (n === 0)         돌아가다 1; // 0! = 1     한다면 (n < 0)         돌아가다 미정의; // 음수의 요인이 정의되지 않았습니다.     한다면 (n % 1) {         위로의.경고하다(`${n} 가장 가까운 정수로 반올림됩니다. 정수가 아닌 경우에는 감마 함수를 사용하는 것을 고려합니다.');         n = 수학.둥글게(n);     }     // 위의 검사를 재귀에서 반복할 필요가 없으므로 아래에서 실제 재귀적인 부분을 별도로 정의합니다.      // 다음 줄은 요인을 재귀적으로 계산하기 위한 함수식입니다. ES6에 도입된 화살표 구문을 사용합니다.     상투적인 재귀적으로 계산 = a => a > 1 ? a * 재귀적으로 계산(a - 1) : 1; // ternary 연산자 '?'의 사용에 주목합니다.     돌아가다 재귀적으로 계산(n); }  계승의(3); // 리턴즈6 

익명 함수(또는 람다):

상투적인 계산대 = 기능.() {     허락하다 세어보세요 = 0;     돌아가다 기능.() {         돌아가다 ++세어보세요;     } };  상투적인 x = 계산대(); x(); // 리턴즈1 x(); // 리턴즈2 x(); // 리턴즈3 

이 예는 자바스크립트에서 함수 폐쇄가 참조로 로컬이 아닌 변수를 캡처한다는 것을 보여줍니다.

화살표 기능은 6th Edition - EMCAcript 2015에서 처음 소개되었습니다. 그들은 자바스크립트로 기능을 쓰기 위한 구문을 단축합니다. 화살표 함수는 익명이므로 괄호로 둘러싸여 즉시 실행되지 않는 한, 작성 후에 화살표 함수를 호출하기 위해서는 화살표 함수를 참조하는 변수가 필요합니다.

화살표 기능의 예:

// 화살표 함수는 'function' 키워드를 생략할 수 있습니다. // 여기서 'long_example'은 익명 함수 값을 가리킵니다. 상투적인 긴_ = (인풋1, 인풋2) => {     위로의.로그.("안녕, 월드!");     상투적인 산출량 = 인풋1 + 인풋2;      돌아가다 산출량; };  // 가새가 없는 경우 화살표 함수는 단순히 식을 반환합니다. // 여기 있습니다 (input1 + input2). 상투적인 쇼트_ = (인풋1, 인풋2) => 인풋1 + 인풋2;  긴_(2, 3); // "Hello, World!"를 인쇄하고 5를 반환합니다. 쇼트_(2, 5);  // 리턴즈7  // 화살표 함수에 매개변수가 하나만 있는 경우 괄호를 제거할 수 있습니다. 상투적인 no_괄호 = 인풋의 => 인풋의 + 2;  no_괄호(3); // 리턴즈5  // 화살표 함수는 다른 함수 정의와 마찬가지로 생성된 것과 동일한 문에서 실행할 수 있습니다. // 이는 전역 범위를 채우는 것을 방지하기 위해 라이브러리를 작성할 때와 폐쇄할 때 유용합니다. 허락하다 세개 = ((a, b) => a + b) (1, 2);  상투적인 generate_multiplier_function = a => (b => Is NaN(b)    !b ? a : a*=b); 상투적인 5_ multip = generate_multiplier_function(5); // 제공된 인수는 식을 "seed"하고 a로 유지됩니다. 5_ multip(1); // 리턴즈5 5_ multip(3); // 반품 15 5_ multip(4); // 반품 60 

자바스크립트에서 객체클래스인스턴스로 생성될 수 있습니다.

개체 클래스 예제:

학급  {     시공자(반지름) {       이것..반지름 = 반지름;       이것..지역 = 수학.PI * ( 반지름 ** 2 );    }     // 클래스(따라서 개체)에는 메서드로 알려진 함수가 포함될 수 있습니다.    보여주는() {       위로의.로그.(이것..반지름);    } };  상투적인 마이볼 = 신규 (5); // 반지름이 5인 볼 개체의 새 인스턴스를 만듭니다. 마이볼.반지름++; // 개체 속성은 일반적으로 외부에서 수정할 수 있습니다. 마이볼.보여주는();   // 상속된 "show" 함수 로그 "6" 사용 

자바스크립트에서는 객체를 함수에서 직접 인스턴스화할 수 있습니다.

개체 기능 예제:

기능. (반지름) {     상투적인 지역 = 수학.PI * ( 반지름 ** 2 );    상투적인 오브제 = { 반지름, 지역 };     // 개체는 변경 가능하며 함수를 속성으로 추가할 수 있습니다.    오브제.보여주는 = () => 위로의.로그.(오브제.반지름);    돌아가다 오브제; };  상투적인 마이볼 = (5); // 반지름이 5인 새 공 객체를 만듭니다. "새로운" 키워드가 필요하지 않습니다. 마이볼.반지름++; // 인스턴스 속성을 수정할 수 있습니다. 마이볼.보여주는();   // "show" 함수 로그 "6" - 새 인스턴스 값을 사용합니다. 

변분함수 시연(arguments 특수 변수):[86]

기능. () {     허락하다 x = 0;      위해서 (허락하다 i = 0; i < 논쟁들.길이; ++i)         x += 논쟁들[i];      돌아가다 x; }  (1, 2); // 리턴즈3 (1, 2, 3); // 리턴즈6  // ES6 기준으로 나머지 연산자를 사용합니다. 기능. (...아그르그르그르그르그르그르그르그르그.) {     돌아가다 아그르그르그르그르그르그르그르그르그..줄이자((a, b) => a + b); }  (1, 2); // 리턴즈3 (1, 2, 3); // 리턴즈6 

즉시 호출되는 함수식은 종종 폐쇄를 만드는 데 사용됩니다. 닫기를 사용하면 네임스페이스에서 속성 및 메서드를 수집하고 일부 속성을 비공개로 만들 수 있습니다.

허락하다 계산대 = (기능.() {     허락하다 i = 0; // 사유재산      돌아가다 {   // 공개방법         얻다: 기능.() {             경종을 울리다(i);         },         세트: 기능.(가치) {             i = 가치;         },         증량의: 기능.() {             경종을 울리다(++i);         }     }; })(); // 모듈  계산대.얻다(); // 반환 0 계산대.세트(6); 계산대.증량의(); // 리턴즈7 계산대.증량의(); // 리턴즈8 

제너레이터 객체(제너레이터 함수 형태)는 내부 컨텍스트(statefulness)를 유지하면서 호출, 종료 및 재입력할 수 있는 기능을 제공합니다.[87]

기능.* 날것의 카운터() {     양보 1;     양보 2; }  기능.* 다이내믹 카운터() {     허락하다 세어보세요 = 0;     하는 동안에 (진실의) {         // 대부분의 경우 실제 루프를 사용하는 것은 권장되지 않습니다.         양보 ++세어보세요;     } }  // 인스턴스 상투적인 카운터1 = 날것의 카운터(); 상투적인 카운터2 = 다이내믹 카운터();  // 실행 카운터1.다음 분.(); // {value: 1, 완료: false} 카운터1.다음 분.(); // {value: 2, 완료: false} 카운터1.다음 분.(); // {value: 정의되지 않음, 완료: true}  카운터2.다음 분.(); // {value: 1, 완료: false} 카운터2.다음 분.(); // {value: 2, 완료: false} 카운터2.다음 분.(); // {value: 3, 완료: false} // infin적으로 

자바스크립트는 모듈에서 내보내고 가져올 수 있습니다.[88]

내보내기 예:

/* mymodule.js */ // 내보내지 않으므로 이 기능은 비공개로 유지됩니다. 허락하다  = (a, b) => {     돌아가다 a + b; }  // 변수 내보내기 수출의 허락하다 이름. = '앨리스'; 수출의 허락하다 나이 = 23;  // 명명된 함수 내보내기 수출의 기능. 더하다(1번, 2번) {     돌아가다 1번 + 2번; }  // 내보내기반 수출의 학급 곱셈 {     시공자(1번, 2번) {         이것..1번 = 1번;         이것..2번 = 2번;     }      더하다() {         돌아가다 (이것..1번, 이것..2번);     } } 

가져오기 예:

// 속성 하나 가져오기 수입품 { 더하다 } 부터 '/module.js'; 위로의.로그.(더하다(1, 2)); //> 3  // 여러 속성 가져오기 수입품 { 이름., 나이 } 부터 '/module.js'; 위로의.로그.(이름., 나이); //> "앨리스", 23  // 모듈에서 모든 속성 가져오기 수입품 * 부터 '/module.js' 위로의.로그.(이름., 나이); //> "앨리스", 23 위로의.로그.(더하다(1,2)); //> 3 

고급 예제

이 샘플 코드는 다양한 자바스크립트 기능을 표시합니다.

/* 두 숫자 중 가장 낮은 공배수(LCM)를 찾습니다 */ 기능. LCMCalculator(x, y) { // 컨스트럭터 함수     한다면 (Is NaN(x*y)) 던지다 신규 유형 오류("숫자가 아닌 인수는 허용되지 않습니다.");     상투적인 체크 인트 = 기능.(x) { // 내적 기능         한다면 (x % 1 !== 0)             던지다 신규 유형 오류(x + "정수가 아닙니다.");          돌아가다 x;     };      이것..a = 체크 인트(x)     //   세미콜론 ^^^^는 선택사항이며 새 줄이면 충분합니다.     이것..b = 체크 인트(y); } // 생성자에 의해 생성된 객체 인스턴스의 프로토타입은 // 그 건설업자의 "prototype" 재산입니다. LCMCalculator.원형의 = { // 객체 문자 그대로의     시공자: LCMCalculator, // 프로토타입을 재할당할 때, 컨스트럭터 속성을 적절하게 설정합니다.     gcd: 기능.() { // 최대 공약수를 계산하는 방법         // 유클리드 알고리즘:         허락하다 a = 수학.복근(이것..a), b = 수학.복근(이것..b), t;          한다면 (a < b) {             // 변수 교환             // t = b; b = a; a = t;             [a, b] = [b, a]; // 파괴 할당(ES6)을 사용하여 스왑         }          하는 동안에 (b !== 0) {             t = b;             b = a % b;             a = t;         }          // GCD를 한 번만 계산하면 되므로 이 방법을 "다시 정의"합니다.         // (사실 재정의는 아니지만 인스턴스 자체에 정의되어 있습니다.         // 따라서 이 .gcd는 LCMCcalulator.prototype.gcd 대신 이 "definition"을 참조합니다.         // LCMC Calculator 개체 멤버 "a" 및/또는 "b"가 나중에 변경되면 잘못된 결과가 발생합니다.         // Also, 'gcd' === "gcd", this['gcd'] === this.gcd         이것.['gcd'] = 기능.() {             돌아가다 a;         };          돌아가다 a;     },      // 개체 속성 이름은 이중(") 또는 단일(') 따옴표로 구분된 문자열로 지정할 수 있습니다.     "lcm": 기능.() {         // 변수 이름은 개체 속성과 충돌하지 않습니다. 예를 들어, lcm는 this.lcm이 아닙니다.         // 이거 안 써요.a*this.b는 FP 정밀도 문제를 피하기 위해         허락하다 lcm = 이것..a / 이것..gcd() * 이것..b;          // lcm을 한 번만 계산하면 되므로 이 방법을 "다시 정의"합니다.         이것..lcm = 기능.() {             돌아가다 lcm;         };          돌아가다 lcm;     },      // 방법은 ES6 구문을 사용하여 선언할 수도 있습니다.     끈까지() {         // ES6 템플릿 리터럴과 (+) 연산자를 모두 사용하여 값 연결         돌아가다 `LCMCalculator: a = ${이것..a}, b = ' + 이것..b;     } };  // 일반 출력 기능을 정의합니다. 이 구현은 웹 브라우저에서만 작동합니다. 기능. 산출량(x) {     문서..추가 차일드(문서.텍스트 노드 만들기(x));     문서..추가 차일드(문서.createElement('br')); }  // 참고: 배열의 지도()와 forEach()는 자바스크립트 1.6에 정의되어 있습니다. // 여기서는 자바스크립트의 고유한 기능적 특성을 보여주는 데 사용됩니다. [     [25, 55],     [21, 56],     [22, 58],     [28, 56] ].지도를 그리다(기능.() { // 배열 리터럴 + 매핑 함수     돌아가다 신규 LCMCalculator([0], [1]); }).종류((a, b) => a.lcm() - b.lcm()) // 이 비교 함수를 사용하여 정렬합니다. =>는 "arrow 함수"라고 불리는 함수의 약어입니다.     .각각에 대하여(인쇄결과);  기능. 인쇄결과(오브제) {     산출량(오브제 + ", gcd =" + 오브제.gcd() + ", lcm =" + 오브제.lcm()); } 

다음 출력이 브라우저 창에 표시되어야 합니다.

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56 LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168 LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275 LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638 

보안.

JavaScript와 DOM은 악의적인 작성자가 웹을 통해 클라이언트 컴퓨터에서 실행할 스크립트를 전달할 수 있는 잠재력을 제공합니다. 브라우저 작성자는 두 가지 제한 사항을 사용하여 이러한 위험을 최소화합니다. 첫째, 스크립트는 파일 생성과 같은 범용 프로그래밍 작업이 아닌 웹 관련 작업만 수행할 수 있는 샌드박스에서 실행됩니다. 둘째, 한 웹사이트의 스크립트는 다른 사이트로 전송된 사용자 이름, 비밀번호 또는 쿠키와 같은 정보에 액세스할 수 없습니다. 대부분의 자바스크립트 관련 보안 버그는 동일한 오리진 정책 또는 샌드박스를 위반한 것입니다.

일반적인 자바스크립트의 하위 집합들이 있습니다.안전하고 안전한 EMCA 스크립트(SES) - 특히 제3자가 만든 코드(예: 광고)에 대해 더 높은 수준의 보안을 제공합니다.[89][90] Closure Toolkit은 타사의 자바스크립트와 HTML의 안전한 임베딩과 격리를 위한 또 다른 프로젝트입니다.[91]

내용 보안 정책은 웹 페이지에서 신뢰할 수 있는 코드만 실행되도록 하는 주요 의도된 방법입니다.

사이트 간 취약점

사이트 간 스크립팅

일반적인 JavaScript 관련 보안 문제는 동일한 출처 정책 위반인 사이트 간 스크립팅(XSS)입니다. XSS 취약성은 공격자가 온라인 뱅킹 웹 사이트와 같은 대상 웹 사이트가 공격 대상자에게 제공되는 웹 페이지에 악의적인 스크립트를 포함하도록 할 수 있는 경우에 발생합니다. 이 예제의 스크립트는 피해자의 권한으로 은행 애플리케이션에 액세스하여 잠재적으로 비밀 정보를 공개하거나 피해자의 권한 없이 송금할 수 있습니다. XSS 취약성에 대한 해결책은 신뢰할 없는 데이터를 표시할 때마다 HTML 탈출을 사용하는 것입니다.

일부 브라우저에는 반사된 XSS 공격에 대한 부분적인 보호 기능이 포함되어 있으며, 여기서 공격자는 악성 스크립트를 포함한 URL을 제공합니다. 그러나 해당 브라우저의 사용자조차도 악성 코드가 데이터베이스에 저장된 것과 같은 다른 XSS 공격에 취약합니다. 서버 측의 웹 애플리케이션을 올바르게 설계해야만 XSS를 완전히 방지할 수 있습니다.

브라우저 작성자의 구현 실수로 인해 XSS 취약성도 발생할 수 있습니다.[92]

교차요청위조

다른 사이트 간 취약성은 사이트 간 요청 위조(CSRF)입니다. CSRF에서 공격자 사이트의 코드는 대상 사이트에서 사용자가 의도하지 않은 동작(은행에서 송금하는 것과 같은)을 취하도록 피해자의 브라우저를 속입니다. 대상 사이트가 요청 인증을 위해 쿠키에만 의존하는 경우 공격자 사이트의 코드에서 비롯된 요청은 시작 사용자의 유효한 로그인 자격 증명을 전달할 수 있습니다. 일반적으로 CSRF의 해결책은 쿠키뿐만 아니라 숨겨진 양식 필드에 인증 값을 요구하여 지속적인 영향을 미칠 수 있는 요청을 인증하는 것입니다. HTTP Referrer 헤더를 확인하는 것도 도움이 될 수 있습니다.

"자바스크립트 하이재킹"은 CSRF 공격의 한 종류입니다. <script> 공격자 사이트의 태그는 JSON이나 자바스크립트와 같은 개인 정보를 반환하는 피해자 사이트의 페이지를 악용합니다. 가능한 솔루션은 다음과 같습니다.

  • 개인 정보를 반환하는 응답에 대해 POSTGET 매개 변수에 인증 토큰이 필요합니다.

클라이언트에 대한 잘못된 신뢰

클라이언트-서버 애플리케이션의 개발자는 신뢰할 수 없는 클라이언트가 공격자의 통제 하에 있을 수 있음을 인식해야 합니다. 애플리케이션 작성자는 결정된 상대방에 의해 코드에 포함된 비밀이 추출될 수 있기 때문에 그들의 자바스크립트 코드가 의도한 대로(또는 전혀) 실행될 것이라고 가정할 수 없습니다. 몇 가지 의미는 다음과 같습니다.

  • 원시 소스 코드를 클라이언트로 전송해야 하기 때문에 웹 사이트 작성자는 자바스크립트가 어떻게 작동하는지 완벽하게 숨길 수 없습니다. 코드는 난독화될 수 있지만 난독화는 역설계될 수 있습니다.
  • 자바스크립트 양식 유효성 검사는 사용자에게 편리함만 제공하고 보안은 제공하지 않습니다. 사이트가 사용자가 서비스 이용 조건에 동의했는지 확인하거나 숫자만 포함해야 하는 필드에서 잘못된 문자를 필터링하는 경우 클라이언트뿐만 아니라 서버에서도 이를 수행해야 합니다.
  • 스크립트는 선택적으로 비활성화할 수 있으므로 이미지를 저장하기 위해 이미지를 마우스 오른쪽 버튼으로 클릭하는 등의 작업을 방지하기 위해 자바스크립트를 사용할 수 없습니다.[93]
  • 공격자가 추출할 수 있기 때문에 비밀번호와 같은 민감한 정보를 자바스크립트에 내장하는 것은 매우 나쁜 관행으로 여겨집니다.[94]

개발자에 대한 잘못된 신뢰

npm, Bower와 같은 패키지 관리 시스템은 자바스크립트 개발자들에게 인기가 많습니다. 이러한 시스템을 통해 개발자가 다른 개발자의 프로그램 라이브러리에 대한 프로그램 종속성을 쉽게 관리할 수 있습니다. 개발자들은 도서관의 관리자가 도서관을 안전하고 최신 상태로 유지할 것이라고 믿지만 항상 그렇지는 않습니다. 이러한 맹목적인 신뢰 때문에 취약성이 나타났습니다. 의존형 라이브러리에는 버그나 취약점이 라이브러리에 의존하는 모든 프로그램에 나타날 수 있는 새로운 릴리스가 있을 수 있습니다. 반대로 라이브러리는 알려진 취약성으로 패치를 해제할 수 있습니다. 133,000개의 웹사이트 샘플을 조사한 연구에서 연구원들은 웹사이트의 37%에 하나 이상의 알려진 취약성이 있는 라이브러리가 포함되어 있음을 발견했습니다.[95] "각 웹사이트에서 사용되는 가장 오래된 도서관 버전과 해당 도서관의 최신 버전 사이의 중간 시차는 알렉사에서 1,177일이며, 아직도 활발하게 사용되고 있는 일부 도서관의 개발은 수년 전에 중단되었습니다."[95] 또 다른 가능성은 도서관의 관리자가 도서관을 완전히 제거할 수 있다는 것입니다. 이는 2016년 3월 Azer Koçulu가 npm에서 저장소를 제거하면서 발생했습니다. 이로 인해 그의 도서관에 따라 수만 개의 프로그램과 웹사이트가 파괴되었습니다.[96][97]

브라우저 및 플러그인 코딩 오류

자바스크립트는 광범위한 브라우저 기능에 대한 인터페이스를 제공하며, 그 중 일부는 버퍼 오버플로와 같은 결함이 있을 수 있습니다. 이 결함으로 인해 공격자는 사용자 시스템에서 원하는 코드를 실행하는 스크립트를 작성할 수 있습니다. 이 코드는 결코 다른 자바스크립트 응용 프로그램에 국한되지 않습니다. 예를 들어 버퍼 오버런 공격을 통해 공격자는 슈퍼유저 권한으로 운영 체제의 API에 액세스할 수 있습니다.

이러한 결함은 Firefox,[98] Internet Explorer,[99] Safari 등 주요 브라우저에 영향을 미쳤습니다.[100]

비디오 플레이어, Adobe Flash 및 Microsoft Internet Explorer에서 기본적으로 활성화된 광범위한 ActiveX 컨트롤과 같은 플러그인에도 자바스크립트를 통해 악용될 수 있는 결함이 있을 수 있습니다(이러한 결함은 과거에 악용된 적이 있습니다).[101][102]

Microsoft는 Windows Vista에서 제한된 권한으로 Internet Explorer 프로세스를 실행하여 버퍼 오버플로와 같은 버그의 위험을 차단하려고 시도했습니다.[103] Google Chrome도 마찬가지로 페이지 렌더러를 자신의 "샌드박스"로 제한합니다.

샌드박스 구현 오류

웹 브라우저는 예를 들어 파일을 만들거나 삭제하는 데 필요한 권한으로 샌드박스 외부에서 자바스크립트를 실행할 수 있습니다. 이러한 권한은 웹에서 코드화하기 위한 것이 아닙니다.

웹에서 자바스크립트에 대한 권한을 잘못 부여한 것은 Internet Explorer와[104] Firefox의 취약성에 영향을 미쳤습니다.[105] Windows XP Service Pack 2에서 Microsoft는 Internet Explorer에 대한 Jscript의 권한을 강등했습니다.[106]

Microsoft Windows에서는 컴퓨터 하드 드라이브의 JavaScript 소스 파일을 샌드박스가 아닌 범용 프로그램으로 시작할 수 있습니다(Windows Script Host 참조). 이것은 자바스크립트(VBScript와 같은)를 트로이 목마에 대한 이론적으로 실행 가능한 벡터로 만들지만, 자바스크립트 트로이 목마는 실제로는 흔하지 않습니다.[107][failed verification]

하드웨어 취약점

2015년 보안 연구자들의 논문에서 자바스크립트 기반의 로해머 공격 개념 증명 구현에 대해 설명했습니다.[108][109][110][111]

2017년에는 브라우저를 통한 자바스크립트 기반 공격이 ASLR을 우회할 수 있는 것으로 나타났습니다. 이것은 "ASLR ⊕ 캐시" 또는 AnC라고 불립니다.

2018년 인텔 및 기타 프로세서에서 Spectre 공격을 발표한 논문에는 자바스크립트 구현이 포함되어 있습니다.[114]

개발도구

중요한 도구는 언어와 함께 진화했습니다.

  • 모든 주요 웹 브라우저에는 자바스크립트 디버거를 포함한 웹 개발 도구가 내장되어 있습니다.
  • ESLintJSLint와 같은 정적 프로그램 분석 도구는 일련의 표준 및 지침 준수를 위해 자바스크립트 코드를 스캔합니다.
  • 일부 브라우저에는 프로파일러가 내장되어 있습니다. benchmark.js 및 jsbench와 같은 독립형 프로파일링 라이브러리도 생성되었습니다.[115][116]
  • 많은 텍스트 편집기는 자바스크립트 코드에 대한 구문 강조 기능을 가지고 있습니다.

정적 프로그램 분석

ESLint

ESLint는 자바스크립트 코드에서 발견되는 문제 패턴을 식별하기 위한 정적 코드 분석 도구입니다. 그것은 니콜라스 C. 자카스가 2013년에 만들었습니다.[117][118] ESLint의 규칙은 구성 가능하며 사용자 정의된 규칙을 정의하고 로드할 수 있습니다. ESLint는 코드 품질코딩 스타일 문제를 모두 다룹니다. ESLint는 EMCAcript의 현재 표준과 미래 표준을 위한 초안의 실험 구문을 지원합니다. JSXTypeScript를 이용한 코드는 플러그인이나 트랜스파일러를 사용할 때도 처리가 가능합니다.[119][120]

제이슬린트

JSLint는 자바스크립트 소스 코드코딩 규칙을 준수하는지 확인하기 위해 소프트웨어 개발에 사용되는 정적 코드 분석 도구입니다. 주로 jslint.com 도메인을 통해 액세스할 수 있는 브라우저 기반 웹 애플리케이션으로 제공되지만 명령줄 적응도 있습니다. 그것은 2002년에 더글러스 크록포드에 의해 만들어졌습니다.[122]

관련기술

자바

흔한 오해는 자바스크립트가 자바와 같다는 것입니다. 둘 다 실제로 C와 같은 구문(C 언어가 가장 즉각적인 공통 조상 언어임)을 가지고 있습니다. 또한 일반적으로 (브라우저 내부에서 사용되는 경우) 샌드박스가 적용되며, 자바스크립트는 자바의 구문과 표준 라이브러리를 염두에 두고 설계되었습니다. 특히 모든 자바 키워드는 원래 자바스크립트로 예약되어 있었고, 자바스크립트의 표준 라이브러리는 자바의 명명 규칙을 따르고 있으며, 자바스크립트의 표준 라이브러리는 자바스크립트의 규칙을 따릅니다. Math 그리고. Date 개체는 Java 1.0의 클래스를 기반으로 합니다.[123]

자바와 자바스크립트는 모두 1995년에 처음 등장했지만 자바는 썬 마이크로시스템즈의 제임스 고슬링이 개발했고 자바스크립트는 넷스케이프 커뮤니케이션즈의 브렌단 아이히가 개발했습니다.

두 언어의 차이점은 유사점보다 더 두드러집니다. 자바는 정적 타이핑이 있는 반면, 자바스크립트의 타이핑은 동적입니다. 자바는 컴파일된 바이트코드에서 로드되고 자바스크립트는 사람이 읽을 수 있는 소스코드로 로드됩니다. 자바의 객체는 클래스 기반인 반면 자바스크립트는 프로토타입 기반입니다. 마지막으로 자바는 자바 8까지 기능 프로그래밍을 지원하지 않았고 자바스크립트는 처음부터 스킴의 영향을 받아 기능 프로그래밍을 지원했습니다.

제이손

JSON(JavaScript Object Notation, 발음 / ˈd ʒe ɪs ən/; 또한 / ˈd ʒe ɪˌs ɒn/)은 사람이 읽을 수 있는 텍스트를 사용하여 속성-값 쌍과 배열(또는 다른 직렬화 가능한 값)로 구성된 데이터 객체저장하고 전송하는 개방형 표준 파일 형식 및 데이터 교환 형식입니다. 서버가 있는 웹 애플리케이션을 포함하여 전자 데이터 교환에서 다양한 용도로 사용되는 일반적인 데이터 형식입니다.

JSON은 언어 독립적인 데이터 형식입니다. 자바스크립트에서 파생되었지만, 많은 현대 프로그래밍 언어들은 JSON 형식의 데이터를 생성하고 파싱하기 위한 코드를 포함합니다. JSON 파일 이름은 확장자를 사용합니다. .json.

더글러스 크록포드는 원래 2000년대 초반에 JSON 포맷을 명시했습니다.[124] 그와 칩 모닝스타는 2001년 4월에 첫 JSON 메시지를 보냈습니다.

타이프스크립트

TS(TypeScript)는 자바스크립트의 엄격한 유형의 변형입니다. TS는 변수와 함수에 유형 주석을 도입하고 JS 내의 유형을 설명하기 위해 유형 언어를 도입함으로써 다릅니다. 그렇지 않은 경우 TS는 JS와 거의 동일한 기능 세트를 공유하여 클라이언트 측에서 실행하기 위해 JS로 쉽게 컴파일할 수 있고 다른 JS 코드와 상호 운용할 수 있습니다.[125]

웹 어셈블리

2017년부터 웹 브라우저는 자바스크립트 엔진이 네이티브 속도에 가까운 웹 페이지 스크립트의 성능에 중요한 부분을 실행할 수 있는 이진 형식인 웹어셈블리를 지원하고 있습니다.[126] WebAssembly 코드는 일반 자바스크립트 코드와 동일한 샌드박스에서 실행됩니다.

asm.js는 WebAssembly의 전신 역할을 했던 자바스크립트의 하위 집합입니다.[127]

트랜스필러

자바스크립트는 웹의 지배적인 클라이언트 측 언어이며, 많은 웹사이트는 스크립트를 많이 사용합니다. 따라서 트랜스파일러는 개발 과정에 도움이 될 수 있는 다른 언어로 작성된 코드를 변환하기 위해 만들어졌습니다.[34]

아약스

아약스(Ajax)는 비동기식 자바스크립트 및 XML의 줄임말로, 비동기식 [128][129]자바스크립트 전송(x-fer)은 클라이언트 측의 다양한 웹 기술사용하여 비동기식 웹 응용 프로그램을 만드는 웹 개발 기법입니다. Ajax를 사용하면 웹 응용 프로그램은 기존 페이지의 표시 및 동작을 방해하지 않고 비동기식(백그라운드)으로 서버에서 데이터를 전송하고 검색할 수 있습니다. Ajax는 프레젠테이션 계층에서 데이터 교환 계층을 분리함으로써 웹 페이지와 확장하여 웹 응용 프로그램이 전체 페이지를 다시 로드할 필요 없이 동적으로 콘텐츠를 변경할 수 있습니다.[130] 실제로 현대적인 구현은 XML 대신 JSON을 사용하는 것이 일반적입니다.

아약스는 기술이 아니라 프로그래밍 개념입니다. HTMLCSS를 결합하여 마크업 및 스타일 정보를 사용할 수 있습니다. 자바스크립트로 웹페이지를 수정하여 동적으로 표시하고 사용자가 새로운 정보와 상호 작용할 수 있도록 할 수 있습니다. 내장된 XMLHTtpRequest 개체는 웹 페이지에서 Ajax를 실행하는 데 사용되므로 웹 사이트에서 페이지를 새로 고치지 않고 화면에 콘텐츠를 로드할 수 있습니다. 아약스는 새로운 기술도 아니고 새로운 언어도 아닙니다. 대신 새로운 방식으로 사용되는 기존 기술입니다.

참고문헌

  1. ^ a b "Netscape and Sun announce JavaScript, the Open, Cross-platform Object Scripting Language for Enterprise Networks and the Internet" (Press release). December 4, 1995. Archived from the original on 2007-09-16.
  2. ^ "ECMAScript® 2021 language specification". June 2021. Retrieved 27 July 2021.
  3. ^ 오류: 참조를 제대로 표시할 수 없습니다. 자세한 내용은 설명서를 참조하십시오.
  4. ^ "nodejs/node-eps". GitHub. Archived from the original on 2020-08-29. Retrieved 2018-07-05.
  5. ^ a b Seibel, Peter (September 16, 2009). Coders at Work: Reflections on the Craft of Programming. Apress. ISBN 9781430219484. Archived from the original on December 24, 2020. Retrieved December 25, 2018. Eich: The immediate concern at Netscape was it must look like Java.
  6. ^ a b c d e "Chapter 4. How JavaScript Was Created". speakingjs.com. Archived from the original on 2020-02-27. Retrieved 2017-11-21.
  7. ^ "Popularity – Brendan Eich".
  8. ^ "Brendan Eich: An Introduction to JavaScript, JSConf 2010". YouTube. p. 22m. Archived from the original on August 29, 2020. Retrieved November 25, 2019. Eich: "function", eight letters, I was influenced by AWK.
  9. ^ Eich, Brendan (1998). "Foreword". In Goodman, Danny (ed.). JavaScript Bible (3rd ed.). John Wiley & Sons. ISBN 0-7645-3188-3. LCCN 97078208. OCLC 38888873. OL 712205M.
  10. ^ "Usage Statistics of JavaScript as Client-side Programming Language on Websites, July 2023". w3techs.com. Retrieved 2023-07-02.
  11. ^ "ECMAScript® 2020 Language Specification". Archived from the original on 2020-05-08. Retrieved 2020-05-08.
  12. ^ "Bloomberg Game Changers: Marc Andreessen". Bloomberg. Bloomberg. March 17, 2011. Archived from the original on May 16, 2012. Retrieved December 7, 2011.
  13. ^ Enzer, Larry (August 31, 2018). "The Evolution of the Web Browsers". Monmouth Web Developers. Archived from the original on August 31, 2018. Retrieved August 31, 2018.
  14. ^ "TechVision: Innovators of the Net: Brendan Eich and JavaScript". Archived from the original on February 8, 2008.
  15. ^ Fin JS (June 17, 2016), Brendan Eich – CEO of Brave, archived from the original on February 10, 2019, retrieved February 7, 2018
  16. ^ a b "Chapter 5. Standardization: ECMAScript". speakingjs.com. Archived from the original on 1 November 2021. Retrieved 1 November 2021.
  17. ^ a b Champeon, Steve (April 6, 2001). "JavaScript, How Did We Get Here?". oreilly.com. Archived from the original on July 19, 2016. Retrieved July 16, 2016.
  18. ^ "Microsoft Internet Explorer 3.0 Beta Now Available". microsoft.com. Microsoft. May 29, 1996. Archived from the original on November 24, 2020. Retrieved July 16, 2016.
  19. ^ McCracken, Harry (September 16, 2010). "The Unwelcome Return of "Best Viewed with Internet Explorer"". technologizer.com. Archived from the original on June 23, 2018. Retrieved July 16, 2016.
  20. ^ Baker, Loren (November 24, 2004). "Mozilla Firefox Internet Browser Market Share Gains to 7.4%". Search Engine Journal. Archived from the original on May 7, 2021. Retrieved May 8, 2021.
  21. ^ Weber, Tim (May 9, 2005). "The assault on software giant Microsoft". BBC News. Archived from the original on September 25, 2017.
  22. ^ "Big browser comparison test: Internet Explorer vs. Firefox, Opera, Safari and Chrome". PC Games Hardware. Computec Media AG. 3 July 2009. Archived from the original on May 2, 2012. Retrieved June 28, 2010.
  23. ^ Purdy, Kevin (June 11, 2009). "Lifehacker Speed Tests: Safari 4, Chrome 2". Lifehacker. Archived from the original on April 14, 2021. Retrieved May 8, 2021.
  24. ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog". Archived from the original on December 4, 2015. Retrieved July 22, 2020.
  25. ^ "Mozilla asks, 'Are we fast yet?'". Wired. Archived from the original on June 22, 2018. Retrieved January 18, 2019.
  26. ^ "ECMAScript 6: New Features: Overview and Comparison". es6-features.org. Archived from the original on March 18, 2018. Retrieved March 19, 2018.
  27. ^ Professional Node.js: Building JavaScript Based Scalable Software Archive at the Wayback Machine, John Wiley & Sons, 01-10-2012
  28. ^ Sams Teach Yourself Node.js in the Wayback Machine, Sams Publishing, 05-Sep-2012에서 24시간 동안 보관된 Sams Teach Yourself Node.js
  29. ^ Lawton, George (19 July 2018). "The secret history behind the success of npm and Node". TheServerSide. Archived from the original on 2 August 2021. Retrieved 2 August 2021.
  30. ^ Brown, Paul (13 January 2017). "State of the Union: npm". Linux.com. Archived from the original on 2 August 2021. Retrieved 2 August 2021.
  31. ^ a b Branscombe, Mary (2016-05-04). "JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16". The New Stack. Archived from the original on 2021-01-16. Retrieved 2021-01-15.
  32. ^ "The TC39 Process". tc39.es. Ecma International. Archived from the original on 2021-02-07. Retrieved 2021-01-15.
  33. ^ "ECMAScript proposals". TC39. Archived from the original on 2020-12-04. Retrieved 2021-01-15.
  34. ^ a b Ashkenas, Jeremy. "List of languages that compile to JS". GitHub. Archived from the original on January 31, 2020. Retrieved February 6, 2020.
  35. ^ "U.S. Trademark Serial No. 75026640". uspto.gov. United States Patent and Trademark Office. 1997-05-06. Archived from the original on 2021-07-13. Retrieved 2021-05-08.
  36. ^ "Legal Notices". oracle.com. Oracle Corporation. Archived from the original on 2021-06-05. Retrieved 2021-05-08.
  37. ^ "Oracle to buy Sun in $7.4-bn deal". The Economic Times. 21 April 2009.
  38. ^ "Usage statistics of JavaScript as client-side programming language on websites". w3techs.com. 2021-04-09. Archived from the original on 2022-02-13. Retrieved 2021-04-09.
  39. ^ a b "Usage statistics of JavaScript libraries for websites". w3techs.com. Archived from the original on 2012-05-26. Retrieved 2021-04-09.
  40. ^ "React - A JavaScript library for building user interfaces". reactjs.org. Archived from the original on April 8, 2018. Retrieved 7 April 2018.
  41. ^ "Chapter 1. What Is React? - What React Is and Why It Matters [Book]". www.oreilly.com. Archived from the original on May 6, 2023. Retrieved 2023-05-06.
  42. ^ Krill, Paul (May 15, 2014). "React: Making faster, smoother UIs for data-driven Web apps". InfoWorld. Retrieved 2021-02-23.
  43. ^ Hemel, Zef (June 3, 2013). "Facebook's React JavaScript User Interfaces Library Receives Mixed Reviews". infoq.com. Archived from the original on May 26, 2022. Retrieved 2022-01-11.
  44. ^ Dawson, Chris (July 25, 2014). "JavaScript's History and How it Led To ReactJS". The New Stack. Archived from the original on Aug 6, 2020. Retrieved 2020-07-19.
  45. ^ 2017년 폐인.
  46. ^ 판찰 2022.
  47. ^ "AngularJS and Angular 2+: a Detailed Comparison". 6 April 2018.
  48. ^ "Vanilla JS". vanilla-js.com. 2020-06-16. Archived from the original on June 16, 2020. Retrieved June 17, 2020.
  49. ^ "Server-Side JavaScript Guide". oracle.com. Oracle Corporation. December 11, 1998. Archived from the original on March 11, 2021. Retrieved May 8, 2021.
  50. ^ Clinick, Andrew (July 14, 2000). "Introducing JScript .NET". Microsoft Developer Network. Microsoft. Archived from the original on November 10, 2017. Retrieved April 10, 2018. [S]ince the 1996 introduction of JScript version 1.0 ... we've been seeing a steady increase in the usage of JScript on the server—particularly in Active Server Pages (ASP)
  51. ^ a b Mahemoff, Michael (December 17, 2009). "Server-Side JavaScript, Back with a Vengeance". readwrite.com. Archived from the original on June 17, 2016. Retrieved July 16, 2016.
  52. ^ "JavaScript for Acrobat". adobe.com. 2009-08-07. Archived from the original on August 7, 2009. Retrieved August 18, 2009.
  53. ^ treitter (2013-02-02). "Answering the question: "How do I develop an app for GNOME?"". livejournal.com. Archived from the original on 2013-02-11. Retrieved 2013-02-07.
  54. ^ "Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel". tessel.io. Archived from the original on 2021-05-26. Retrieved 2021-05-08.
  55. ^ "Node.js Raspberry Pi GPIO Introduction". w3schools.com. Archived from the original on 2021-08-13. Retrieved 2020-05-03.
  56. ^ "Espruino – JavaScript for Microcontrollers". espruino.com. Archived from the original on 2020-05-01. Retrieved 2020-05-03.
  57. ^ Looper, Jen (2015-09-21). "A Guide to JavaScript Engines for Idiots". Telerik Developer Network. Archived from the original on 2018-12-08. Retrieved 2018-12-08.
  58. ^ "Concurrency model and Event Loop". Mozilla Developer Network. Archived from the original on September 5, 2015. Retrieved August 28, 2015.
  59. ^ "Deno Manual". deno.land. Retrieved 2019-05-17.
  60. ^ Schiemann, Dylan (December 26, 2018). "Deno: Secure V8 TypeScript Runtime from Original Node.js Creator". InfoQ. Archived from the original on May 17, 2019. Retrieved May 17, 2019.
  61. ^ Flanagan, David (August 17, 2006). JavaScript: The Definitive Guide: The Definitive Guide. "O'Reilly Media, Inc.". p. 16. ISBN 978-0-596-55447-7. Archived from the original on August 1, 2020. Retrieved March 29, 2019.
  62. ^ a b c d Korolev, Mikhail (2019-03-01). "JavaScript quirks in one image from the Internet". The DEV Community. Archived from the original on October 28, 2019. Retrieved October 28, 2019.
  63. ^ Bernhardt, Gary (2012). "Wat". Destroy All Software. Archived from the original on October 28, 2019. Retrieved October 28, 2019.
  64. ^ "JavaScript data types and data structures". MDN. February 16, 2017. Archived from the original on March 14, 2017. Retrieved February 24, 2017.
  65. ^ Flanagan 2006, pp. 176–178.
  66. ^ Crockford, Douglas. "Prototypal Inheritance in JavaScript". Archived from the original on 13 August 2013. Retrieved 20 August 2013.
  67. ^ "Inheritance and the prototype chain". Mozilla Developer Network. Archived from the original on April 25, 2013. Retrieved April 6, 2013.
  68. ^ Herman, David (2013). Effective JavaScript. Addison-Wesley. p. 83. ISBN 978-0-321-81218-6.
  69. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. pp. 95–97. ISBN 978-1-59327-282-1.
  70. ^ Katz, Yehuda (12 August 2011). "Understanding "Prototypes" in JavaScript". Archived from the original on 5 April 2013. Retrieved April 6, 2013.
  71. ^ Herman, David (2013). Effective JavaScript. Addison-Wesley. pp. 125–127. ISBN 978-0-321-81218-6.
  72. ^ "Function – JavaScript". MDN Web Docs. Retrieved 2021-10-30.
  73. ^ "Properties of the Function Object". Es5.github.com. Archived from the original on January 28, 2013. Retrieved May 26, 2013.
  74. ^ Flanagan 2006, 페이지 141.
  75. ^ 역할 지향 프로그래밍을 일반화하기 위한 자바스크립트의 많은 재능Wayback Machine, Peterseliger에서 Trates and Mixins Archive 2017-10-05와 같은 접근 방식입니다.blogpsot.de , 2014.4.11.
  76. ^ Wayback Machine, 2010에서 보관된 자바스크립트의 특성 2014-07-24.
  77. ^ "Home CocktailJS". Cocktailjs.github.io. Archived from the original on February 4, 2017. Retrieved February 24, 2017.
  78. ^ Croll, Angus (May 31, 2011). "A fresh look at JavaScript Mixins". JavaScript, JavaScript…. Archived from the original on 2020-04-15.
  79. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. pp. 139–149. ISBN 978-1-59327-282-1.
  80. ^ "E4X – Archive of obsolete content". Mozilla Developer Network. Mozilla Foundation. February 14, 2014. Archived from the original on July 24, 2014. Retrieved July 13, 2014.
  81. ^ "var – JavaScript". The Mozilla Developer Network. Archived from the original on December 23, 2012. Retrieved December 22, 2012.
  82. ^ "let". MDN web docs. Mozilla. Archived from the original on May 28, 2019. Retrieved June 27, 2018.
  83. ^ "const". MDN web docs. Mozilla. Archived from the original on June 28, 2018. Retrieved June 27, 2018.
  84. ^ "ECMAScript Language Specification – ECMA-262 Edition 5.1". Ecma International. Archived from the original on November 26, 2012. Retrieved December 22, 2012.
  85. ^ "console". Mozilla Developer Network. Mozilla. Archived from the original on February 28, 2013. Retrieved April 6, 2013.
  86. ^ "arguments". Mozilla Developer Network. Mozilla. Archived from the original on April 13, 2013. Retrieved April 6, 2013.
  87. ^ "function* - JavaScript MDN". developer.mozilla.org. Retrieved 2022-09-27.
  88. ^ "JavaScript modules". MDN Web Docs. Mozilla. Archived from the original on 17 July 2022. Retrieved 28 July 2022.
  89. ^ "Making JavaScript Safe for Advertising". ADsafe. Archived from the original on 2021-07-06. Retrieved 2021-05-08.
  90. ^ "Secure ECMA Script (SES)". Archived from the original on May 15, 2013. Retrieved May 26, 2013.
  91. ^ "Google Caja Project". Google. Archived from the original on 2021-01-22. Retrieved 2021-07-09.
  92. ^ "Mozilla Cross-Site Scripting Vulnerability Reported and Fixed – MozillaZine Talkback". Mozillazine.org. Archived from the original on July 21, 2011. Retrieved February 24, 2017.
  93. ^ Kottelin, Thor (17 June 2008). "Right-click "protection"? Forget about it". blog.anta.net. Archived from the original on 9 August 2011. Retrieved 28 July 2022.
  94. ^ Rehorik, Jan (29 November 2016). "Why You Should Never Put Sensitive Data in Your JavaScript". ServiceObjects Blog. ServiceObjects. Archived from the original on June 3, 2019. Retrieved June 3, 2019.
  95. ^ a b Lauinger, Tobias; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (December 21, 2016), "Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web" (PDF), Northeastern University, arXiv:1811.00918, doi:10.14722/ndss.2017.23414, ISBN 978-1-891562-46-4, S2CID 17885720, archived from the original (PDF) on 29 March 2017, retrieved 28 July 2022
  96. ^ Collins, Keith (March 27, 2016). "How one programmer broke the internet by deleting a tiny piece of code". Quartz. Archived from the original on February 22, 2017. Retrieved February 22, 2017.
  97. ^ SC Magazine UK, 개발자의 삭제된 코드 11줄 '인터넷을 깨다' 2017년 2월 23일 Wayback Machine보관
  98. ^ Mozilla Corporation, crypto.signText() Wayback Machine에서 아카이브된 2014-06-04
  99. ^ Festa, Paul (August 19, 1998). "Buffer-overflow bug in IE". CNET. Archived from the original on December 25, 2002.
  100. ^ 보안.Tracker.com , 원격 사용자가 임의 코드를 실행하도록 허용하는 Apple Safari JavaScript 버퍼 오버플로 및 HTTP Redirect 버그를 통해 원격 사용자Wayback Machine에서 아카이브된 파일 2010-02-18에 액세스할 수 있음
  101. ^ 보안.포커스, Microsoft WebViewWayback MachineFolderIcon ActiveX Control 버퍼 오버플로 취약성 아카이브 2011-10-11
  102. ^ Fusion Authority, Macromedia Flash ActiveX 버퍼 오버플로 2011년 8월 13일 Wayback Machine에서 아카이브됨
  103. ^ "Protected Mode in Vista IE7 – IEBlog". Blogs.msdn.com. February 9, 2006. Archived from the original on January 23, 2010. Retrieved February 24, 2017.
  104. ^ US CERT, 취약성 노트 VU#713878: Microsoft Internet ExplorerWayback Machine에서 리디렉션된 프레임의 원본 유효성을 제대로 검사하지 않음
  105. ^ Mozilla Foundation, Mozilla Foundation Security Advisory 2005-41: Wayback Machine에서 DOM 속성 재정의를 통한 권한 상승 아카이브 2014-06-04
  106. ^ Andersen, Starr (2004-08-09). "Part 5: Enhanced Browsing Security". TechNet. Microsoft Docs. Changes to Functionality in Windows XP Service Pack 2. Retrieved 2021-10-20.
  107. ^ 희귀한 자바스크립트 트로이 목마의 한 예는 Symantec Corporation, JS를 참조하십시오.찾는 사람.K 2011-09-13 Wayback Machine에서 아카이브
  108. ^ Gruss, Daniel; Maurice, Clémentine; Mangard, Stefan (July 24, 2015). "Rowhammer.js: A Remote Software-Induced Fault Attack in JavaScript". arXiv:1507.06955 [cs.CR].
  109. ^ Jean-Pharuns, Alix (July 30, 2015). "Rowhammer.js Is the Most Ingenious Hack I've Ever Seen". Motherboard. Vice. Archived from the original on January 27, 2018. Retrieved January 26, 2018.
  110. ^ Goodin, Dan (August 4, 2015). "DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript". Ars Technica. Archived from the original on January 27, 2018. Retrieved January 26, 2018.
  111. ^ Auerbach, David (July 28, 2015). "Rowhammer security exploit: Why a new security attack is truly terrifying". slate.com. Archived from the original on July 30, 2015. Retrieved July 29, 2015.
  112. ^ ANC Archive the Wayback Machine VUSec, 2017-03-16
  113. ^ 새로운 ASLR 버스팅 JavaScriptWayback Machine Ars Technica, 2017에서 드라이브 바이(Drive-by) 활용할 예정입니다.
  114. ^ 웨이백 머신 스펙터 어택에서 스펙터 어택 아카이브 2018-01-03
  115. ^ "Benchmark.js". benchmarkjs.com. Archived from the original on 2016-12-19. Retrieved 2016-11-06.
  116. ^ JSBEN.CH. "JSBEN.CH Performance Benchmarking Playground for JavaScript". jsben.ch. Archived from the original on 2021-02-27. Retrieved 2021-08-13.
  117. ^ "First commit - eslint/eslint". GitHub. Retrieved 2019-07-05.
  118. ^ Zakas, Nicholas C. (16 July 2013). "Introducing ESLint". nczonline.net. Retrieved 2018-02-26. JSLint was the state of the art in JavaScript linting technology
  119. ^ "The future of TypeScript on ESLint". ESLint - Pluggable JavaScript linter. Retrieved 2020-04-24.
  120. ^ "Accessibility auditing with eslint-plugin-jsx-a11y". web.dev. Google Developers. 2019-04-29. Retrieved 2020-04-24. The [ELint plugin] can help pinpoint [issues] in your JSX.
  121. ^ "JSLint from the Command Line". www.hacksparrow.com. January 2013. Archived from the original on 2018-02-27. Retrieved 2018-02-26.
  122. ^ "first commit". GitHub. 2010-11-12. Retrieved 2018-02-25. Copyright 2002 Douglas Crockford. All Rights Reserved Wrrrldwide and Beyond!
  123. ^ Eich, Brendan (April 3, 2008). "Popularity". Archived from the original on July 3, 2011. Retrieved January 19, 2012.
  124. ^ "Douglas Crockford: The JSON Saga". YouTube. 2011-08-28. Retrieved 2022-02-21.
  125. ^ "TypeScript: JavaScript With Syntax For Types". Typescriptlang.org. Retrieved 2022-08-12.
  126. ^ "Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine". Visual Studio Magazine. Archived from the original on 2018-02-10. Retrieved 2018-02-09.
  127. ^ "frequently asked questions". asm.js. Archived from the original on June 4, 2014. Retrieved April 13, 2014.
  128. ^ Jesse James Garrett (18 February 2005). "Ajax: A New Approach to Web Applications". AdaptivePath.com. Archived from the original on 10 September 2015. Retrieved 19 June 2008.
  129. ^ "Ajax - Web developer guides". MDN Web Docs. Archived from the original on 28 February 2018. Retrieved 2018-02-27.
  130. ^ Ullman, Chris (March 2007). Beginning Ajax. wrox. ISBN 978-0-470-10675-4. Archived from the original on 5 July 2008. Retrieved 24 June 2008.

원천

더보기

  • 플래너건, 데이빗 자바스크립트: 디피니티브 가이드. 7판. 세바스토폴, 캘리포니아: 오라일리, 2020. ISBN 978-1-491-95202-3.
  • Haverbeke, Marijn. 유창한 자바스크립트. 3판. 전분프레스 없음, 2018. 472페이지 ISBN 978-1593279509.(download)
  • 자카스, 니콜라스. 객체 지향 자바스크립트의 원리, 1판. 녹말프레스 없음, 2014. 120페이지 ISBN 978-1593275402.

외부 링크

이 기사 듣기(48분)
Spoken Wikipedia icon
이 오디오 파일은 2013년 8월 20일자(2013-08-20) 본 기사의 개정판에서 생성되었으며 이후의 편집 내용은 반영되지 않습니다.