경고 : 최신판이 아닙니다. 이 문서의 오래된 판을 편집하고 있습니다. 이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다. 로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!'''JavaScript'''는 오늘날 [[월드 와이드 웹]] 환경에서 광범위하게 쓰이는 [[프로그래밍 언어]]이다. [[Java]]하고는 문법이 ''조금'' 비슷해 보인다는 점을 빼면 '''전혀 다른 언어이다.''' {{ㅊ|[[인도]]와 [[인도네시아]]급}} <del>car와 carpet처럼 관련이 없다</del> [[#역사]] 참고. == 역사 == [[웹 브라우저]]인 [[넷스케이프 네비게이터]] 2.0의 [[스크립트 언어]]로 쓰기 위해 [[1995년]]부터 개발되었다. 당시 [[넷스케이프]] 사에서 일했고, 훗날 [[모질라 재단]]의 [[CTO]]로 재직하는 [http://en.wikipedia.org/wiki/Brendan_Eich Brendan Eich]가 10일 만에(......) 만들었다고 한다. JavaScript라는 이름이 된 것은 순전히 마케팅적인 이유로, 처음에는 Mocha, 그 다음에는 LiveScript라는 이름을 쓰다가 <s>지금은 회사 째로 [[오라클 (기업)|오라클]]에 먹힌</s> [[썬 마이크로시스템즈]]와 상표권 라이센스를 맺게 되면서<ref>[https://web.archive.org/web/20070916144913/http://wp.netscape.com/newsref/pr/newsrelease67.html Netscape and Sun Announce JavaScript]</ref> JavaScript라는 이름으로 발표하고 덤으로 문법까지 [[Java]]와 비슷하게 고쳐져 버렸다. 넷스케이프 네비게이터와 함께 JavaScript는 큰 성공을 거두었고, 당시 넷스케이프와 경쟁하던 [[인터넷 익스플로러]]도 JScript라는 이름으로 호환 엔진을 만들게 되었다. 이렇게 한동안 비슷한 듯 다른 두 개의 언어가 공존하는 상태가 지속되다가, 이 애매한 상태를 해소하기 위해 공동으로 [[Ecma 인터내셔널]]이라는 유럽의 표준화 단체에서 이 언어에 대한 표준화를 진행하게 되었다. 이때, 어쨌거나 '''Java'''Script라는 이름을 쓰는 건 상표권 이슈가 있었으므로, 표준화 단체의 앞글자를 딴 [http://www.ecmascript.org ECMAScript]라는 이름 공식적인 표준의 이름으로 쓰게 되었다. 따라서 형식적으로는 JavaScript는 ECMAScript 표준을 구현한 한 구현체의 이름이 된다. ECMAScript 표준을 따르는 다른 프로그래밍 언어로는 [[Adobe Flash]]에서 쓰이는 [[ActionScript]]가 있다. == 특징 == 언어적으로, JavaScript는 동적 타입을 쓰며 프로토타입 기반 객체 지향 프로그래밍을 지원하는 절차형 언어이다. 절차형 언어임에도 불구하고 [[함수형 프로그래밍]] 언어들처럼 익명 함수와 클로져를 쓸 수 있는데, 이는 JavaScript가 처음 설계될 적에 [[Scheme]]이라는 [[LISP]] 사투리로부터 영향을 받았기 때문이다.<ref>[http://www.2ality.com/2011/03/javascript-how-it-all-began.html JavaScript: how it all began ]</ref> JavaScript에 영향을 준 또 다른 언어로는 [[Self]]가 있는데, 이것은 [[Smalltalk]]를 기반으로 클래스 대신 프로토타입 기반의 객체지향 시스템을 적용한 언어이다. 이는 JavaScript의 <code>.prototype</code> 프로퍼티를 사용하는 특이한 객체 모델의 바탕이 되었다. 원래 [[인터프리터]]를 쓸 것을 염두에 두고 디자인되었고 따라서 실행 성능도 보잘것없었다. 하지만 [[2000년]]대 후반부터 [[HTML5]]와 웹 애플리케이션이 크게 대두되기 시작하면서 [[구글 크롬]]의 [https://developers.google.com/v8/ V8], [[파이어폭스]]의 [https://developer.mozilla.org/ko/docs/SpiderMonkey SpiderMonkey], [[사파리]]의 [http://trac.webkit.org/wiki/JavaScriptCore JavaScriptCore] 등 여러 우수한 JavaScript 엔진들의 성능 경쟁이 일어났고, 그 덕에 지금은 인터프리트되는 언어 중에서는 상당히 성능이 좋은 편에 속한다. 태생이 웹 브라우저의 [[스크립트 언어]]였기에, 언어 자체의 표준 라이브러리보다는 [[웹 브라우저]]의 [[API]]에 의존하는 경향이 매우 강하다. 따라서 언어 자체의 표준안인 ECMAScript 표준 이상으로 [[W3C]]의 [http://www.w3.org/DOM/ 문서 객체 모델] 표준, [[HTML5]]의 브라우저 API 표준 등에 강하게 영향을 받는다. V8 엔진을 활용한 서버측 JavaScript 구현인 Node.js가 히트하기 전에는 변변한 파일 입출력 API조차 제대로 합의된 게 없었을 정도. == 표준 == 표준은 현재 ECMA에서 관리하며 저작권 문제를 피하기 위해 ECMAScript라고 공표한다. 최신 ECMAScript 표준의 버전은 ECMAScript 2019이다. ECMAScript 2015 이후로는 매년 새 표준이 발표되고 있다. 2015년에 6번째 판이 나왔고, 이후에는 연도를 이용해 버전을 표기하기로 결정되었다. 따라서 ECMAScript 2015는 ECMAScript 6과 같은 표준이다. 표준명을 줄여서 ES2019, ES6, ES7 같은 식으로 쓰기도 한다. 표준이 발표되어도 그 기능을 구현하는 건 브라우저 제조사들 마음대로라, 기능이 표준에 들어간지 한참 뒤에 구현하거나 표준에 없는 기능을 넣어놓거나 하는 일이 많다. 다만 메이저 브라우저 제조사들은 대부분 ES 표준 위원회에 참여하고 있기 때문에 되도록이면 표준에 맞추려고 노력은 하는 편이다. 아니면 자기네 독자 기능을 표준에 넣든지. 업데이트가 되고 있는 브라우저들은 대개 새 표준을 꾸준히 반영하고 있지만 [[인터넷 익스플로러]]는 보안 패치 이외의 업데이트가 되지 않기 때문에 이런 새 기능 사용에 제약을 받는 일이 많다. Babel과 같은 transpiler는 최신 표준 문법을 옛날 표준, 주로 ES5로 바꿔주어 IE와 같은 구식 브라우저에서 사용할 수 있게 해준다. 또한 아직 표준으로 확정되지 않은 제안 단계의 표준들을 미리 사용할 수 있도록 변경해주는 기능도 제공한다. 문법상 변경이 아닌 API 수준의 차이는Polyfill 라이브러리를 이용하면 새로 나온 함수나 객체 등을 이용할 수 있다. === ECMAScript6 기능 === ==== let, const키워드 ==== let 키워드는 변수를 정의합니다. 함수 스코프를 가지던 var와는 달리 스코프를 중괄호 블록 내로 제한합니다. <source lang="javascript"> if(true) { let x = 12; alert(x); //대화상자에 12라고 뜹니다. } alert(x); //여기서 x는 undefined가 나옵니다. </source> 2015년 9월 기준으로 IE11, 엣지 브라우저, 크롬이 기능을 구현했습니다. const는 변수의 값을 바꿀 수 없다고 선언합니다. 만약 같은 스코프에서 동일한 이름의 변수를 선언하거나, 혹은 값을 넣으려 할 경우, 에러가 납니다. 2015년 9월 기준으로 IE11, 엣지 브라우저, 파이어폭스, 크롬이 기능을 구현했습니다. ==== 다중 리턴값 ==== 파이썬처럼 함수에서 여러 값을 한번에 반환할 수 있게 되었습니다. <source lang="javascript"> function function_name() { return [1, 6, 7, 4, 8, 0]; } var q, w, e, r, t, y; // 2번째와 4번째 요소는 무시됩니다. [q, w, , r, , y] = function_name(); alert(y);//y is 0 </source> ==== 매개변수 기본값 ==== Python, C++가 마찬가지로 매개변수 기본값을 넣을 수 있습니다. 2015년 9월 기준으로 파이어폭스만 기능을 구현했습니다. ==== ... 키워드==== 2015년 9월 기준으로 엣지, 파이어폭스만 기능을 구현했습니다. ===== 함수의 가변인자 ===== '''...'''키워드를 이용하여 함수에서 가변인자를 사용할 수 있습니다. <source lang="javascript"> function function_one(...args) { var res = 0; for(var i = 0 ; i < args.length ; i++) { res += args[i]; } return res; } function_one(1, 4);//5 function_one(1, 4, 7);//12 function_one(1, 4, 7, 0);//12 </source> ===== 배열의 각 요소를 함수의 매개변수로 넣기 ===== <source lang="javascript"> function function_one(a, b) { return a + b; } var a = [1,2]; function_one( ...a); </source> ==== Class키워드와 상속의 지원(!!) ==== function과 prototype을 이용한 객체지향이 아닌 class를 이용한 객체지향을 할 수 있게 되었습니다. ==== 새로운 함수 선언 ==== (매개변수) =>{ 함수구현 }; 형식으로 함수를 선언할 수 있습니다. 엣지 브라우저, 파이어폭스 , 크롬이 지원합니다. <source lang="javascript"> var sum = (x, y) => x + y; console.log(sum(2, 900)); </source> == 기타 == [http://asmjs.org asm.js]라고 하는 특이한 표준이 있는데, JavaScript를 [[어셈블리어]]처럼 [[컴파일]]할 수 있도록 JavaScript 문법을 '''매우''' 제약한 스펙이다. {{각주}} {{프로그래밍}} [[분류:JavaScript| ]] 요약: 리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다. 취소 편집 도움말 (새 창에서 열림) | () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |} {{lang|}} · {{llang||}} · {{인용문|}} · {{인용문2|}} · {{유튜브|}} · {{다음팟|}} · {{니코|}} · {{토막글}} {{삭제|}} · {{특정판삭제|}}(이유를 적지 않을 경우 기각될 가능성이 높습니다. 반드시 이유를 적어주세요.) {{#expr:}} · {{#if:}} · {{#ifeq:}} · {{#iferror:}} · {{#ifexist:}} · {{#switch:}} · {{#time:}} · {{#timel:}} · {{#titleparts:}} __NOTOC__ · __FORCETOC__ · __TOC__ · {{PAGENAME}} · {{SITENAME}} · {{localurl:}} · {{fullurl:}} · {{ns:}} –(대시) ‘’(작은따옴표) “”(큰따옴표) ·(가운뎃점) …(말줄임표) ‽(물음느낌표) 〈〉(홑화살괄호) 《》(겹화살괄호) ± − × ÷ ≈ ≠ ∓ ≤ ≥ ∞ ¬ ¹ ² ³ ⁿ ¼ ½ ¾ § € £ ₩ ¥ ¢ † ‡ • ← → ↔ ‰ °C µ(마이크로) Å °(도) ′(분) ″(초) Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η Θ θ Ι ι Κ κ Λ λ Μ μ(뮤) Ν ν Ξ ξ Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ Φ φ Χ χ Ψ ψ Ω ω · Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ · Ϊ ϊ Ϋ ϋ · ΐ ΰ Æ æ Đ(D with stroke) đ Ð(eth) ð ı Ł ł Ø ø Œ œ ß Þ þ · Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź · À à È è Ì ì Ǹ ǹ Ò ò Ù ù · İ Ż ż ·  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û · Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ · ǘ ǜ ǚ ǖ · caron/háček: Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž · breve: Ă ă Ğ ğ Ŏ ŏ Ŭ ŭ · Ā ā Ē ē Ī ī Ō ō Ū ū · à ã Ñ ñ Õ õ · Å å Ů ů · Ą ą Ę ę · Ç ç Ş ş Ţ ţ · Ő ő Ű ű · Ș ș Ț ț 이 문서에서 사용한 틀: 틀:ECMAScript (편집) 틀:Skin (원본 보기) (준보호됨)틀:ㅊ (원본 보기) (준보호됨)틀:각주 (원본 보기) (준보호됨)틀:둘러보기 상자 (원본 보기) (보호됨)틀:둘러보기 상자/중첩 (원본 보기) (준보호됨)틀:둘러보기 상자/핵심 (원본 보기) (보호됨)틀:본문 (원본 보기) (준보호됨)틀:취소선 (원본 보기) (준보호됨)틀:틀바 (원본 보기) (준보호됨)틀:프로그래밍 (편집)