`](/fr/docs/Web/HTML/Element/figcaption)) ou invisible (par exemple, l'attribut `aria-label` défini sur un élément), ou d'une combinaison des deux. La manière dont le nom accessible d'un élément est déterminé est basée sur [le calcul du nom accessible (en anglais)](https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/#name_calculation), qui est différent pour chaque élément.
+
+Il est préférable d'utiliser du texte visible comme noms accessibles. De nombreux éléments, notamment [``](/fr/docs/Web/HTML/Element/a), [` `](/fr/docs/Web/HTML/Element/td) et [``](/fr/docs/Web/HTML/Element/button), tirent leur nom de leur contenu. Par exemple, étant donné `Bar `, le nom accessible est « Bar ».
+
+D'autres éléments tirent leur nom accessible du contenu des éléments associés. Pour certains éléments parents, comme [``](/fr/docs/Web/HTML/Element/fieldset), [``](/fr/docs/Web/HTML/Element/table), et [``](/fr/docs/Web/HTML/Element/figure), si ces derniers contiennent respectivement un enfant [``](/fr/docs/Web/HTML/Element/fieldset), [``](/fr/docs/Web/HTML/Element/caption), ou [``](/fr/docs/Web/HTML/Element/figcaption), l'association est automatique. Pour d'autres éléments, comme [`
@@ -27,13 +27,13 @@ slug: Learn/JavaScript/Building_blocks/conditionals
사람(과 동물)은 항상 그들의 삶에 영향을 미치는 결정을, 작은 것(과자를 하나 먹을까? 두개 먹을까?)부터 큰 것(고향에 머물면서 아버지의 농장에서 일해야 할까? 아니면 천체물리학을 공부하러 미국으로 유학을 갈까?)까지 내립니다.
-조건문은 우리가, 반드시 내려져야 하는 선택에서부터 (예를 들자면, "쿠키 한 개 또는 두 개"), 그 선택들의 결과까지 (아마도 "쿠키 한 개를 먹는다" 의 결과는 "여전히 배가 고프다" 일지도 모르고, "쿠키 두 개를 먹는다" 의 결과는 "배부르다, 그러나 엄마가 쿠키를 다 먹었다고 나를 야단칠 것이다" 일지도 모릅니다), 그러한 의사 결정을 자바스크립트에서 표현할 수 있게 합니다.
+조건문은 우리가, 반드시 내려져야 하는 선택에서부터 (예를 들자면, "쿠키 한 개 또는 두 개"), 그 선택들의 결과까지 (아마도 "쿠키 한 개를 먹는다" 의 결과는 "여전히 배가 고프다" 일지도 모르고, "쿠키 두 개를 먹는다" 의 결과는 "배부르다, 그러나 엄마가 쿠키를 다 먹었다고 나를 야단칠 것이다" 일지도 모릅니다), 그러한 의사 결정을 JavaScript에서 표현할 수 있게 합니다.
![](cookie-choice-small.png)
## if ... else 문
-여러분이 자바스크립트에서 쓸 단연코 가장 일반적인 형태의 조건문을 살펴봅시다 — 변변찮은 [`if ... else` 문](/ko/docs/Web/JavaScript/Reference/Statements/if...else)입니다.
+여러분이 JavaScript에서 쓸 단연코 가장 일반적인 형태의 조건문을 살펴봅시다 — 변변찮은 [`if ... else` 문](/ko/docs/Web/JavaScript/Reference/Statements/if...else)입니다.
### 기본 if ... else 문법
@@ -80,7 +80,7 @@ else 대신 실행할 다른 코드
### 실제 예시
-문법을 잘 이해하기 위해서 실제 예시를 알아봅시다. 어머니나 아버지가 아이에게 집안일을 도와달라고 요청한다고 상상해 봅시다. 부모님께서 "우리 애기, 만약에 쇼핑 가는 걸 도와주면, 네가 원하는 장난감을 살 여유가 되도록 용돈을 더 줄게." 라고 말씀하실지도 모릅니다. 자바스크립트에서, 우리는 이것을 다음과 같이 표현할 수 있습니다:
+문법을 잘 이해하기 위해서 실제 예시를 알아봅시다. 어머니나 아버지가 아이에게 집안일을 도와달라고 요청한다고 상상해 봅시다. 부모님께서 "우리 애기, 만약에 쇼핑 가는 걸 도와주면, 네가 원하는 장난감을 살 여유가 되도록 용돈을 더 줄게." 라고 말씀하실지도 모릅니다. JavaScript에서, 우리는 이것을 다음과 같이 표현할 수 있습니다:
```js
let shoppingDone = false;
@@ -146,7 +146,7 @@ function setWeather() {
{{ EmbedLiveSample('else_if', '100%', 100, "", "", "hide-codepen-jsfiddle") }}
1. 여기서 우리는 HTML {{htmlelement("select")}} 엘리먼트를 사용하여 다른 날씨 선택과 간단한 문단을 만들 수 있습니다.
-2. 자바스크립트 코드에서 {{htmlelement("select")}} 와 {{htmlelement("p")}} 요소를 모두 저장하고 있고, 값이 변할 때 `setWeather()`함수가 동작하도록 `` 요소에 이벤트 리스너를 추가했습니다.
+2. JavaScript 코드에서 {{htmlelement("select")}} 와 {{htmlelement("p")}} 요소를 모두 저장하고 있고, 값이 변할 때 `setWeather()`함수가 동작하도록 `` 요소에 이벤트 리스너를 추가했습니다.
3. 함수가 동작했을 때, 현재 `` 요소에서 선택된 현재 값을 `choice`라는 변수에 먼저 설정합니다. 그런 다음 `choice`값에 따라 문단 안에 다른 텍스트를 표시하기 위해 조건문을 사용합니다. `if() {...} block`에서 테스트된 첫 번째를 제외하고, `else if() {...}`에서 모든 조건들이 어떻게 테스트되는지에 유의하세요.
4. `else {...}`안의, 가장 마지막 선택은 기본적으로 "최후의 수단" 옵션입니다 — `true`인 조건이 없으면 그 안의 코드가 실행됩니다. 이 경우 아무것도 선택되지 않으면, 예를 들어, 사용자가 처음에 표시한 "--Make a choice--" 플레이스홀더(placeholder) 옵션을 다시 선택하기로 한다면, 문단의 텍스트를 비우는 역할을 합니다.
@@ -154,7 +154,7 @@ function setWeather() {
### 비교 연산자에 대한 메모
-비교 연산자는 우리의 조건문 안의 조건을 테스트하는데 사용됩니다. 우리는 먼저 이전의 [자바스크립트의 기본적인 연산 - 숫자와 연산자](/ko/docs/Learn/JavaScript/First_steps/Math#comparison_operators) 문서에서 비교 연산자를 봤습니다. 우리의 선택들은 다음과 같습니다:
+비교 연산자는 우리의 조건문 안의 조건을 테스트하는데 사용됩니다. 우리는 먼저 이전의 [JavaScript의 기본적인 연산 - 숫자와 연산자](/ko/docs/Learn/JavaScript/First_steps/Math#comparison_operators) 문서에서 비교 연산자를 봤습니다. 우리의 선택들은 다음과 같습니다:
- `===`와 `!==` — 한 값이 다른 값과 같거나 다른지 테스트한다.
- `<` 와 `>` — 한 값이 다른 값보다 작은지 큰지 테스트한다.
@@ -798,7 +798,7 @@ textarea.onkeyup = function () {
## 결론
-그리고 이것이 여러분이 지금 자바스크립트에서 알아야 할 조건문 구조에 대한 모든 것입니다! 저는 여러분이 이 개념들을 이해했고 이 예제들을 쉽게 통과했을 것이라고 확신합니다; 만약 뭐든지 이해하지 못한 게 있다면, 자유롭게 이 문서를 다시 읽거나, [문의하기](/ko/docs/Learn#contact_us)에서 도움을 요청해 보세요.
+그리고 이것이 여러분이 지금 JavaScript에서 알아야 할 조건문 구조에 대한 모든 것입니다! 저는 여러분이 이 개념들을 이해했고 이 예제들을 쉽게 통과했을 것이라고 확신합니다; 만약 뭐든지 이해하지 못한 게 있다면, 자유롭게 이 문서를 다시 읽거나, [문의하기](/ko/docs/Learn#contact_us)에서 도움을 요청해 보세요.
## 같이 보기
diff --git a/files/ko/learn/javascript/building_blocks/functions/index.md b/files/ko/learn/javascript/building_blocks/functions/index.md
index f0f1b8d59c91ba..14cf54c022754d 100644
--- a/files/ko/learn/javascript/building_blocks/functions/index.md
+++ b/files/ko/learn/javascript/building_blocks/functions/index.md
@@ -13,7 +13,7 @@ slug: Learn/JavaScript/Building_blocks/Functions
필요한 사전 지식:
기본적인 컴퓨터 활용 능력, HTML과 CSS의 기본적인 이해,
- 자바스크립트 첫 단계 JavaScript 첫 단계.
@@ -26,7 +26,7 @@ slug: Learn/JavaScript/Building_blocks/Functions
## 함수는 어디에서 찾을 수 있나요?
-자바스크립트 어디서든 함수를 찾을 수 있습니다. 사실, 우리는 지금까지 수업에서 함수를 계속 사용해왔습니다. 함수에 대해서 아주 많이 말해오지 않았을 뿐이죠. 그러나 이제 함수에 대해서 분명하게 말하고, 실제로 문법을 탐험할 때가 되었습니다.
+JavaScript 어디서든 함수를 찾을 수 있습니다. 사실, 우리는 지금까지 수업에서 함수를 계속 사용해왔습니다. 함수에 대해서 아주 많이 말해오지 않았을 뿐이죠. 그러나 이제 함수에 대해서 분명하게 말하고, 실제로 문법을 탐험할 때가 되었습니다.
[for loop](/ko/docs/Learn/JavaScript/Building_blocks/Looping_code#%EB%A3%A8%ED%94%84%EC%9D%98_%ED%91%9C%EC%A4%80), [while 과 do...while loop](/ko/docs/Learn/JavaScript/Building_blocks/Looping_code#while_%EA%B7%B8%EB%A6%AC%EA%B3%A0_do_..._while), 또는 [if...else문](/ko/docs/Learn/JavaScript/Building_blocks/%EC%A1%B0%EA%B1%B4%EB%AC%B8#if_..._else_%EB%AC%B8)과 같은 일반적인 내장 언어 구조를 사용하지 **않고** — `()` —같은 괄호 쌍을 사용했다면 여러분은 함수를 사용하고 있던 겁니다.
@@ -65,15 +65,15 @@ var myNumber = Math.random();
...우리는 함수를 사용하고 있었어요!
-> **참고:** 만약 필요하다면, 이 기능들에 다시 익숙해지기 위해 여러분의 브라우저 자바스크립트 콘솔에 자유롭게 이 코드들을 입력해 보세요.
+> **참고:** 만약 필요하다면, 이 기능들에 다시 익숙해지기 위해 여러분의 브라우저 JavaScript 콘솔에 자유롭게 이 코드들을 입력해 보세요.
JavaScript 언어는 여러분 스스로 코드 전체를 적을 필요 없이, 유용한 것들을 할 수 있게 해주는 많은 내장 함수를 가지고 있습니다. 사실, 브라우저 내장 함수를 **호출**("함수를 실행하다(run 또는 execute)"는 말을 멋있게 "호출하다(invoke)"라고 하기도 합니다)할 때 호출하는 일부 코드는 JavaScript로 작성될 수 없었습니다 — 이러한 함수 중 상당수는 백그라운드 브라우저 코드의 일부를 호출하고 있으며, 이는 JavaScript와 같은 웹 언어가 아니라 대체로 C++와 같은 저수준 시스템 언어로 작성됩니다.
-몇몇 브라우저 내장함수는 핵심(core) 자바스크립트 언어의 일부가 아니라는 것을 유념하세요. 몇몇은 브라우저 API의 일부로써 정의되어 있는데, 더욱 많은 기능성을 제공하기 위해 기본(default) 언어의 위에 개발되었습니다 ([앞선 코스](/ko/docs/Learn/JavaScript/First_steps/What_is_JavaScript#%EA%B7%B8%EB%9E%98%EC%84%9C_%EC%A7%84%EC%A7%9C_%EC%96%B4%EB%96%A4_%EC%9D%BC%EC%9D%84_%ED%95%A0_%EC%88%98_%EC%9E%88%EB%82%98%EC%9A%94)에서 더 자세한 설명을 볼 수 있습니다). 브라우저 API를 다루는 법은 나중에 더 살펴보도록 하겠습니다.
+몇몇 브라우저 내장함수는 핵심(core) JavaScript 언어의 일부가 아니라는 것을 유념하세요. 몇몇은 브라우저 API의 일부로써 정의되어 있는데, 더욱 많은 기능성을 제공하기 위해 기본(default) 언어의 위에 개발되었습니다 ([앞선 코스](/ko/docs/Learn/JavaScript/First_steps/What_is_JavaScript#%EA%B7%B8%EB%9E%98%EC%84%9C_%EC%A7%84%EC%A7%9C_%EC%96%B4%EB%96%A4_%EC%9D%BC%EC%9D%84_%ED%95%A0_%EC%88%98_%EC%9E%88%EB%82%98%EC%9A%94)에서 더 자세한 설명을 볼 수 있습니다). 브라우저 API를 다루는 법은 나중에 더 살펴보도록 하겠습니다.
## 함수 대 메소드
-프로그래머들은 객체(object)의 부분인 **함수**를 **메서드**(method)라고 부릅니다. 여러분은 아직 구성된(structured) 자바스크립트 객체의 내부 작동에 대해서 배울 필요는 없습니다. 차후의 모듈에서 객체의 내부 작동과, 어떻게 객체를 생성하는지에 대한 모든 것을 배울 수 있습니다. 우선은, 우리는 메서드 대 함수에 대해 있을 수 있는 혼란을 단지 정리하기를 원합니다. — 웹 상에서 이용 가능한 관련된 리소스들을 살펴보면서 여러분은 두 용어를 만날 가능성이 있습니다.
+프로그래머들은 객체(object)의 부분인 **함수**를 **메서드**(method)라고 부릅니다. 여러분은 아직 구성된(structured) JavaScript 객체의 내부 작동에 대해서 배울 필요는 없습니다. 차후의 모듈에서 객체의 내부 작동과, 어떻게 객체를 생성하는지에 대한 모든 것을 배울 수 있습니다. 우선은, 우리는 메서드 대 함수에 대해 있을 수 있는 혼란을 단지 정리하기를 원합니다. — 웹 상에서 이용 가능한 관련된 리소스들을 살펴보면서 여러분은 두 용어를 만날 가능성이 있습니다.
우리가 지금까지 사용해 왔던 내장된(built-in) 코드는 두 형태로 나타납니다. 바로 **함수**와 **메서드**입니다. 여러분은 내장 함수의 전체 목록과, 내장 객체와 그들의 해당하는 메서드들 또한 [여기서](/ko/docs/Web/JavaScript/Reference/Global_Objects) 확인할 수 있습니다.
@@ -240,9 +240,9 @@ var madeAString = myArray.join();
함수 바깥에 선언된 가장 상위 레벨의 스코프를 '**전역 스코프**(global scope)' 라고 부릅니다.전역 스코프 내에 정의된 값들은 어느 코드든 접근이 가능합니다.
-자바스크립트는 다양한 이유로 인해 이와 같이 설정되어 있지만, 주로는 안전성과 구조 때문입니다. 어떤 때에는 여러분의 변수가 어느 코드나 접근 가능한 변수가 되는 걸 원치 않을 겁니다. 여러분이 어딘가에서 불러온 외부 스크립트가 문제를 일으킬 수도 있으니깐요. 외부 스크립트의 코드와 같은 변수 이름을 사용하면 충돌이 일어나게 돼요. 이건 악의적일 수도 있고, 아님 뭐 단순한 우연이겠죠.
+JavaScript는 다양한 이유로 인해 이와 같이 설정되어 있지만, 주로는 안전성과 구조 때문입니다. 어떤 때에는 여러분의 변수가 어느 코드나 접근 가능한 변수가 되는 걸 원치 않을 겁니다. 여러분이 어딘가에서 불러온 외부 스크립트가 문제를 일으킬 수도 있으니깐요. 외부 스크립트의 코드와 같은 변수 이름을 사용하면 충돌이 일어나게 돼요. 이건 악의적일 수도 있고, 아님 뭐 단순한 우연이겠죠.
-예를 들어 , 여러분에게 두 개의 외부 자바스크립트 파일을 호출하는 HTML이 있다고 쳐요. 그 둘은 같은 이름으로 정의된 변수와 함수를 사용하고 있습니다.
+예를 들어 , 여러분에게 두 개의 외부 JavaScript 파일을 호출하는 HTML이 있다고 쳐요. 그 둘은 같은 이름으로 정의된 변수와 함수를 사용하고 있습니다.
```html
@@ -287,7 +287,7 @@ function greeting() {
1. 먼저, 주어진 [function-scope.html](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/functions/function-scope.html) 예제의 복사본을 만드세요. 예제에는 2개의 함수 `a()` 와 `b()`, 그리고 3개의 변수 — `x`, `y`, 와 `z` —가 있습니다. 그 중 2개는 함수 안에 정의되어 있으며, 1개는 전역 스코프에 정의되어 있습니다. 이것은 또한 세 번째 함수 `output()`을 포함하고 있는데, 이건 하나의 매개변수만 받으며, 페이지의 단락 안에 그것을 출력합니다.
2. 예제를 인터넷 브라우저나 텍스트 에디터를 통해 열어봅시다.
-3. 브라우저 개발자 툴에서 자바스크립트 콘솔을 엽시다. 자바스크립트 콘솔에서 아래와 같이 작성해보세요.
+3. 브라우저 개발자 툴에서 JavaScript 콘솔을 엽시다. JavaScript 콘솔에서 아래와 같이 작성해보세요.
```js
output(x);
@@ -318,7 +318,7 @@ function greeting() {
}
```
- 코드를 저장하고 브라우저에서 다시 로드한 후, `a()`와 `b()` 함수를 자바스크립트 콘솔에서 호출해 보세요.
+ 코드를 저장하고 브라우저에서 다시 로드한 후, `a()`와 `b()` 함수를 JavaScript 콘솔에서 호출해 보세요.
```js
a();
@@ -341,7 +341,7 @@ function greeting() {
}
```
-7. 저장하고 다시 로드한 후 이것을 자바스크립트 콘솔에서 시도해 보세요.
+7. 저장하고 다시 로드한 후 이것을 JavaScript 콘솔에서 시도해 보세요.
```js
a();
@@ -363,7 +363,7 @@ function greeting() {
}
```
-10. 저장하고 다시 로드한 후, 자바스크립트 콘솔에서 다시 다음을 시도해 보세요.
+10. 저장하고 다시 로드한 후, JavaScript 콘솔에서 다시 다음을 시도해 보세요.
```js
a();
diff --git a/files/ko/learn/javascript/building_blocks/looping_code/index.md b/files/ko/learn/javascript/building_blocks/looping_code/index.md
index 967214e53c55a2..206f3ba437b7b6 100644
--- a/files/ko/learn/javascript/building_blocks/looping_code/index.md
+++ b/files/ko/learn/javascript/building_blocks/looping_code/index.md
@@ -5,7 +5,7 @@ slug: Learn/JavaScript/Building_blocks/Looping_code
{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Building_blocks/conditionals", "Learn/JavaScript/Building_blocks/Functions", "Learn/JavaScript/Building_blocks")}}
-다수의 기본적인 계산에서부터 완료해야 할 비슷한 작업들을 가지고 있는 상황들에 대해서까지, 프로그래밍 언어는 반복적인 작업을 빠르게 완료하는 데 대단히 유용합니다. 여기서 우리는 그러한 필요를 다루는 자바스크립트에서 이용 가능한 반복문 구조를 살펴볼 것입니다.
+다수의 기본적인 계산에서부터 완료해야 할 비슷한 작업들을 가지고 있는 상황들에 대해서까지, 프로그래밍 언어는 반복적인 작업을 빠르게 완료하는 데 대단히 유용합니다. 여기서 우리는 그러한 필요를 다루는 JavaScript에서 이용 가능한 반복문 구조를 살펴볼 것입니다.
diff --git a/files/ko/learn/javascript/client-side_web_apis/index.md b/files/ko/learn/javascript/client-side_web_apis/index.md
index 3da6055d5cea3e..1346f41cb05ab8 100644
--- a/files/ko/learn/javascript/client-side_web_apis/index.md
+++ b/files/ko/learn/javascript/client-side_web_apis/index.md
@@ -9,7 +9,7 @@ slug: Learn/JavaScript/Client-side_web_APIs
## 선행사항
-다음의 문서를 미리 보고 오시는것을 권장합니다. ([First steps](/ko/docs/Learn/JavaScript/First_steps), [Building blocks](/ko/docs/Learn/JavaScript/Building_blocks), and [JavaScript objects](/ko/docs/Learn/JavaScript/Objects)). 이 모듈은 클라이언트 측 JavaScript 예제를 사용하지 않고 유용하게 사용할 수 있기 때문에 간단한 API 사용법을 상당히 많이 사용합니다. 여기에서는 핵심 자바 스크립트 언어에 대한 지식이 있다고 가정하고 일반적인 웹 API를 좀 더 자세하게 살펴보면서 한 단계 올라갑니다. 이번장에서는 심플한 API사용방법을 여럿 보도록 하겠습니다. 이 API들은 client-side 자바스크립트를 만드는데 도움이 많이 될 것입니다.
+다음의 문서를 미리 보고 오시는것을 권장합니다. ([First steps](/ko/docs/Learn/JavaScript/First_steps), [Building blocks](/ko/docs/Learn/JavaScript/Building_blocks), and [JavaScript objects](/ko/docs/Learn/JavaScript/Objects)). 이 모듈은 클라이언트 측 JavaScript 예제를 사용하지 않고 유용하게 사용할 수 있기 때문에 간단한 API 사용법을 상당히 많이 사용합니다. 여기에서는 핵심 자바 스크립트 언어에 대한 지식이 있다고 가정하고 일반적인 웹 API를 좀 더 자세하게 살펴보면서 한 단계 올라갑니다. 이번장에서는 심플한 API사용방법을 여럿 보도록 하겠습니다. 이 API들은 client-side JavaScript를 만드는데 도움이 많이 될 것입니다.
[HTM](/ko/docs/Learn/HTML)과[CSS](/ko/docs/Learn/CSS)에 관한 기본지식이 있으면 좋습니다!
diff --git a/files/ko/learn/javascript/first_steps/a_first_splash/index.md b/files/ko/learn/javascript/first_steps/a_first_splash/index.md
index 0e43e0bd9a4151..5209db72374c91 100644
--- a/files/ko/learn/javascript/first_steps/a_first_splash/index.md
+++ b/files/ko/learn/javascript/first_steps/a_first_splash/index.md
@@ -87,7 +87,7 @@ JavaScript에 관한 약간의 이론과, JavaScript가 할 수 있는 일을
```html
```
diff --git a/files/ko/learn/javascript/first_steps/arrays/index.md b/files/ko/learn/javascript/first_steps/arrays/index.md
index 7d00eb5dd80da6..60f37661622a55 100644
--- a/files/ko/learn/javascript/first_steps/arrays/index.md
+++ b/files/ko/learn/javascript/first_steps/arrays/index.md
@@ -673,7 +673,7 @@ textarea.onkeyup = function () {
## 결론
-이 문서를 쭉 읽으셨다면 배열이 꽤 유용해 보인다는 것에 동의할 겁니다. 배열은 종종 모든 원소에 동일한 것을 하기 위해 반복문과 함께 자바스크립트의 모든 곳에서 찾아볼 수 있습니다. 다음 모듈에서 반복문에 대해 알기 위해 있는 모든 유용한 기본을 가르칠 것이지만, 우선 스스로에게 박수를 보내고 휴식을 취하세요. 이 모듈의 모든 문서를 독파하셨으니 잠깐 쉬어가도 좋습니다!
+이 문서를 쭉 읽으셨다면 배열이 꽤 유용해 보인다는 것에 동의할 겁니다. 배열은 종종 모든 원소에 동일한 것을 하기 위해 반복문과 함께 JavaScript의 모든 곳에서 찾아볼 수 있습니다. 다음 모듈에서 반복문에 대해 알기 위해 있는 모든 유용한 기본을 가르칠 것이지만, 우선 스스로에게 박수를 보내고 휴식을 취하세요. 이 모듈의 모든 문서를 독파하셨으니 잠깐 쉬어가도 좋습니다!
유일한 남은 것은 이 모듈의 평가인데, 이는 이 평가 이전에 오는 문서들에 대한 당신의 이해를 테스트할 것입니다.
diff --git a/files/ko/learn/javascript/first_steps/math/index.md b/files/ko/learn/javascript/first_steps/math/index.md
index 7a56364ae86890..8202d5c1eee6e3 100644
--- a/files/ko/learn/javascript/first_steps/math/index.md
+++ b/files/ko/learn/javascript/first_steps/math/index.md
@@ -334,6 +334,6 @@ function updateBtn() {
다음 글에서는 텍스트와 JavaScript에서 텍스트를 조작하는 방법에 대해 알아보겠습니다.
-> **참고:** 수학을 좋아하고 자바스크립트에서 수학이 어떻게 구현되는지 더 자세히 알고 싶으시다면 MDN의 메인 자바스크립트 섹션에서 더 자세한 내용을 확인할 수 있습니다. [숫자와 날짜](/ko/docs/Web/JavaScript/Guide/Numbers_and_dates), [표현식 및 연산자](/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators) 문서에서 시작하기 좋습니다.
+> **참고:** 수학을 좋아하고 JavaScript에서 수학이 어떻게 구현되는지 더 자세히 알고 싶으시다면 MDN의 메인 JavaScript 섹션에서 더 자세한 내용을 확인할 수 있습니다. [숫자와 날짜](/ko/docs/Web/JavaScript/Guide/Numbers_and_dates), [표현식 및 연산자](/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators) 문서에서 시작하기 좋습니다.
{{PreviousMenuNext("Learn/JavaScript/First_steps/Variables", "Learn/JavaScript/First_steps/Strings", "Learn/JavaScript/First_steps")}}
diff --git a/files/ko/learn/javascript/first_steps/silly_story_generator/index.md b/files/ko/learn/javascript/first_steps/silly_story_generator/index.md
index 7f1d55f57a8005..8054ef68823af0 100644
--- a/files/ko/learn/javascript/first_steps/silly_story_generator/index.md
+++ b/files/ko/learn/javascript/first_steps/silly_story_generator/index.md
@@ -20,7 +20,7 @@ l10n:
목표:
- 변수, 숫자, 연산자, 문자열 및 배열 같은 자바스크립트의 기본 항목에 대한
+ 변수, 숫자, 연산자, 문자열 및 배열 같은 JavaScript의 기본 항목에 대한
전반적인 이해를 테스트합니다.
@@ -97,7 +97,7 @@ l10n:
## 힌트와 팁
- JavaScript 내용 외에는 HTML을 수정할 필요가 없습니다.
-- 만약 JavaScript가 정상적으로 HTML에 적용되었는지 의심스럽다면, 일시적으로 JavaScript의 내용을 지우고, 단순하고 짧은 효과가 명확한 내용을 추가해서, 저장하고 새로고침을 해보세요. 예를 들어 다음은 {{htmlelement("html")}} 요소의 배경을 빨간색으로 바꾸므로 자바스크립트가 제대로 적용되었다면 브라우저 창 전체가 빨간색으로 바뀌어야 합니다.
+- 만약 JavaScript가 정상적으로 HTML에 적용되었는지 의심스럽다면, 일시적으로 JavaScript의 내용을 지우고, 단순하고 짧은 효과가 명확한 내용을 추가해서, 저장하고 새로고침을 해보세요. 예를 들어 다음은 {{htmlelement("html")}} 요소의 배경을 빨간색으로 바꾸므로 JavaScript가 제대로 적용되었다면 브라우저 창 전체가 빨간색으로 바뀌어야 합니다.
```js
document.querySelector("html").style.backgroundColor = "red";
diff --git a/files/ko/learn/javascript/first_steps/test_your_skills_colon__variables/index.md b/files/ko/learn/javascript/first_steps/test_your_skills_colon__variables/index.md
index 462d29996b3b08..e699170ec679e3 100644
--- a/files/ko/learn/javascript/first_steps/test_your_skills_colon__variables/index.md
+++ b/files/ko/learn/javascript/first_steps/test_your_skills_colon__variables/index.md
@@ -11,7 +11,7 @@ slug: Learn/JavaScript/First_steps/Test_your_skills:_variables
>
> If you get stuck, then ask us for help — see the [Assessment or further help](#assessment_or_further_help) section at the bottom of this page.
-> **참고:** 아래에 있는 예제들에서, 답을 알아내기 위해 시도하는 것을 돕기 위해 만약 당신의 코드에 오류가 있으면, 페이지의 결과 패널에 출력될 것입니다 (또는 다운로드 버전의 경우, 브라우저의 자바스크립트 콘솔에 출력될 것입니다).
+> **참고:** 아래에 있는 예제들에서, 답을 알아내기 위해 시도하는 것을 돕기 위해 만약 당신의 코드에 오류가 있으면, 페이지의 결과 패널에 출력될 것입니다 (또는 다운로드 버전의 경우, 브라우저의 JavaScript 콘솔에 출력될 것입니다).
## 변수 1
diff --git a/files/ko/learn/javascript/first_steps/useful_string_methods/index.md b/files/ko/learn/javascript/first_steps/useful_string_methods/index.md
index 7cc0c3282eb024..ef91fb35895dce 100644
--- a/files/ko/learn/javascript/first_steps/useful_string_methods/index.md
+++ b/files/ko/learn/javascript/first_steps/useful_string_methods/index.md
@@ -657,6 +657,6 @@ textarea.onkeyup = function () {
## 결론
-자바스크립트에서 문장과 단어들을 다룰 수 있는 프로그래밍 능력이 매우 중요하다. 웹사이트는 사람들과 소통하는 공간이기 때문이다. 이 문서는 문자열을 다룰 수 있는 기초적인 내용에 대해 다루었다. 이 내용은 앞으로 배우게 될 심화 과정에 도움이 될 것이다. 다음으로 배열에 대해 알아보겠다.
+JavaScript에서 문장과 단어들을 다룰 수 있는 프로그래밍 능력이 매우 중요하다. 웹사이트는 사람들과 소통하는 공간이기 때문이다. 이 문서는 문자열을 다룰 수 있는 기초적인 내용에 대해 다루었다. 이 내용은 앞으로 배우게 될 심화 과정에 도움이 될 것이다. 다음으로 배열에 대해 알아보겠다.
{{PreviousMenuNext("Learn/JavaScript/First_steps/Strings", "Learn/JavaScript/First_steps/Arrays", "Learn/JavaScript/First_steps")}}
diff --git a/files/ko/learn/javascript/first_steps/variables/index.md b/files/ko/learn/javascript/first_steps/variables/index.md
index dd52956179e514..4e08fb19364626 100644
--- a/files/ko/learn/javascript/first_steps/variables/index.md
+++ b/files/ko/learn/javascript/first_steps/variables/index.md
@@ -5,7 +5,7 @@ slug: Learn/JavaScript/First_steps/Variables
{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/First_steps/What_went_wrong", "Learn/JavaScript/First_steps/Math", "Learn/JavaScript/First_steps")}}
-앞선 두 수업을 듣고, 자바스크립트에 대해(웹 기술에서 어떻게 사용되는지, 큰 범위에서의 특징) 알아보았다. 이번 수업에서는 기본중에 기본인 자바스크립트의 주된 구성중 하나인 변수가 어떻게 이루어져 있는지 알아볼 것이다.
+앞선 두 수업을 듣고, JavaScript에 대해(웹 기술에서 어떻게 사용되는지, 큰 범위에서의 특징) 알아보았다. 이번 수업에서는 기본중에 기본인 JavaScript의 주된 구성중 하나인 변수가 어떻게 이루어져 있는지 알아볼 것이다.
@@ -15,14 +15,14 @@ slug: Learn/JavaScript/First_steps/Variables
목표
- 자바스크립트 변수에 대해 익혀보기
+ JavaScript 변수에 대해 익혀보기
## 필요한 툴
-이번 수업에서 컨텐츠에 대한 이해도를 테스트하고자, 코드를 입력하라는 요청을 받게 될 것이다. 만약 데스크탑 브라우저를 사용한다면, 코드를 실행하기 가장 좋은 프로그램은 브라우저의 자바스크립트 콘솔창일 것이다.(도구의 사용법에 대해 알고자 한다면 [What are browser developer tools](/ko/docs/Learn/Common_questions/What_are_browser_developer_tools) 를 참고하자)
+이번 수업에서 컨텐츠에 대한 이해도를 테스트하고자, 코드를 입력하라는 요청을 받게 될 것이다. 만약 데스크탑 브라우저를 사용한다면, 코드를 실행하기 가장 좋은 프로그램은 브라우저의 JavaScript 콘솔창일 것이다.(도구의 사용법에 대해 알고자 한다면 [What are browser developer tools](/ko/docs/Learn/Common_questions/What_are_browser_developer_tools) 를 참고하자)
## 변수란?
diff --git a/files/ko/learn/javascript/howto/index.md b/files/ko/learn/javascript/howto/index.md
index 758bd3c6f6a921..b62151039689c3 100644
--- a/files/ko/learn/javascript/howto/index.md
+++ b/files/ko/learn/javascript/howto/index.md
@@ -5,7 +5,7 @@ slug: Learn/JavaScript/Howto
{{LearnSidebar}}
-다음의 링크들은 당신의 자바스크립트 코드가 정상적으로 작동할 수 있게 고쳐야되는 흔한 문제들의 해결책을 제시한다.
+다음의 링크들은 당신의 JavaScript 코드가 정상적으로 작동할 수 있게 고쳐야되는 흔한 문제들의 해결책을 제시한다.
## 초보자들의 흔한 실수들
@@ -54,7 +54,7 @@ myFunction();
#### 리턴 문 이후 코드 실행
-함수 밖으로 값을 리턴할 때, 자바스크립트 인터프리터가 함수를 완전히 빠져나감을 명심하세요. — 리턴 문 이후에 선언된 코드는 절대로 실행되지 않습니다.
+함수 밖으로 값을 리턴할 때, JavaScript 인터프리터가 함수를 완전히 빠져나감을 명심하세요. — 리턴 문 이후에 선언된 코드는 절대로 실행되지 않습니다.
사실, 몇몇 브라우저들은 (파이어폭스 처럼) 리턴 문 이후에 코드가 있다면 개발자 콘솔에 에러 메세지를 줍니다. 파이어폭스는 "unreachable code after return statement" 라고 알려줍니다.
@@ -77,7 +77,7 @@ const myObject = {
## 기본 정의
-- [자바스크립트란 무엇인가?](/ko/docs/Learn/JavaScript/First_steps/What_is_JavaScript#a_high-level_definition)
+- [JavaScript란 무엇인가?](/ko/docs/Learn/JavaScript/First_steps/What_is_JavaScript#a_high-level_definition)
- [변수는 무엇인가?](/ko/docs/Learn/JavaScript/First_steps/Variables#what_is_a_variable)
- [문자열은 무엇인가?](/ko/docs/Learn/JavaScript/First_steps/Strings)
- [배열은 무엇인가?](/ko/docs/Learn/JavaScript/First_steps/Arrays#what_is_an_array)
diff --git a/files/ko/learn/javascript/index.md b/files/ko/learn/javascript/index.md
index 6a57d8ba3b103b..899108ba71b888 100644
--- a/files/ko/learn/javascript/index.md
+++ b/files/ko/learn/javascript/index.md
@@ -25,14 +25,14 @@ JavaScript 는 [HTML](/ko/docs/Learn/HTML) 이나 [CSS](/ko/docs/Learn/CSS) 와
JavaScript 의 기본적인 것들이 익숙해진 이후에, 여러분은 더 고급 주제들을 배울 준비가 되어 있어야 합니다. 예를 들면 다음과 같습니다.
-- JavaScript 심화, [자바스크립트 안내서](/ko/docs/Web/JavaScript/Guide)
+- JavaScript 심화, [JavaScript 안내서](/ko/docs/Web/JavaScript/Guide)
- [웹 APIs 참조문서](/ko/docs/Web/API)
## 과정
이 주제에는 다음 과정들이 제안된 순서대로 포함되어 있습니다.
-- [자바스크립트 첫걸음](/ko/docs/Learn/JavaScript/First_steps)
+- [JavaScript 첫걸음](/ko/docs/Learn/JavaScript/First_steps)
- : JavaScript 과정에서, JavaScript를 이용해 첫번째 경험을 쌓기 이전에 "JavaScript 는 무엇인가요?", "어떻게 생겼나요?", 그리고 "그것으로 무엇을 할 수 있죠?" 와 같은 질문에 대답 할 수 있어야 합니다. 그 이후에, 변수, 문자열, 숫자 그리고 배열과 같은 JavaScript 의 기능에 대해 살펴봅시다.
- [JavaScript 구성 요소](/ko/docs/Learn/JavaScript/Building_blocks)
- : 이 과정에서는, 조건문, 반복문, 함수, 그리고 이벤트와 같이 일반적으로 쓰이며 괄호로 감싸여진 형태인 JavaScript 의 핵심적인 기본 기능들을 살펴볼 것입니다. 여러분은 이미 이것들에 대해 이미 보셨겟지만, 그저 지나쳤을 것이니, 우리는 이것에 대해 자세히 살펴볼 것입니다.
diff --git a/files/ko/learn/javascript/objects/classes_in_javascript/index.md b/files/ko/learn/javascript/objects/classes_in_javascript/index.md
index a5f93016144e22..0dca78a8e53721 100644
--- a/files/ko/learn/javascript/objects/classes_in_javascript/index.md
+++ b/files/ko/learn/javascript/objects/classes_in_javascript/index.md
@@ -12,7 +12,7 @@ OOJS에 대한 개념을 설명했으니, 이 글에서는 부모 클래스에
선수조건:
- 컴퓨터 기본지식, HTML과 CSS에 대한 기본적인 이해,자바스크립트에 어느
+ 컴퓨터 기본지식, HTML과 CSS에 대한 기본적인 이해,JavaScript에 어느
정도 익숙할 것 (see
First steps and
Building blocks **알림:** #### 프론트엔드 웹 개발자가 되고자 하시나요?목표를 달성하기 위한 모든 필수 정보가 들어있는 교육 과정을 준비했습니다.[**시작하기**](/ko/docs/Learn/Front-end_web_developer)
@@ -21,14 +21,14 @@ JavaScript 객체에 대해 자세히 알아보려면, 기본 문법에 대해
- [객체 기본](/ko/docs/Learn/JavaScript/Objects/Basics)
- : JavaScript 객체 소개의 첫 장에서는, 기본적인 JavaScript 객체 문법을 볼 것이며, 이전 과정에서 이미 봐왔던 몇몇 JavaScript 특징들을 다시 들여다 볼 것입니다. 이를 통해 우리는 이전에 다루었던 많은 특징들이 사실상 객체였다는 사실을 알게 될 것입니다.
-- [입문자를 위한 객체지향 자바스크립트](/ko/docs/Learn/JavaScript/Objects/Object-oriented_JS)
+- [입문자를 위한 객체지향 JavaScript](/ko/docs/Learn/JavaScript/Objects/Object-oriented_JS)
- : 가장 기본적인 것으로, 우리는 객체 지향 JavaScript(OOJS) 에 초점을 둘 것입니다. 이 글에서는 객체 지향 프로그래밍(OOP) 이론의 기본 관점을 보여주고, JavaScript 가 생성자함수를 이용하여 객체 클래스를 에뮬레이트 하는 방법과 객체 인스턴스를 생성하는 방법에 대해 탐구합니다.
- [객체 프로토타입](/ko/docs/Learn/JavaScript/Objects/Object_prototypes)
- : 프로토타입은 JavaScript 객체가 또다른 객체로 특성을 상속시키기 위한 메커니즘이고, 그것들은 고전적인 객체 지향 프로그래밍 언어들의 상속 메커니즘과 다르게 작동합니다. 이 글에서는 그 다름을 탐구하고, 프로토타입 체인이 동작하는 방식을 설명하며 프로토타입의 속성이 기본 생성자들로 메소드를 추가하기 위해 사용되는 방법을 보여줍니다.
-- [자바스크립트에서의 상속](/ko/docs/Learn/JavaScript/Objects/Inheritance)
+- [JavaScript에서의 상속](/ko/docs/Learn/JavaScript/Objects/Inheritance)
- : 이제 OOJS 에 대한 대부분의 세부사항들에 대해서 설명이 되었으므로, 본 장에서는 "부모" 클래스로부터 특성을 상속받은 "자식" 오브젝트 클래스를 생성하는 방법을 보여줍니다. 뿐만 아니라, OOJS 를 언제 또는 어디서 사용하면 좋을 지에 대한 몇몇 조언도 기술되어있습니다.
- [JSON 데이터와 작업](/ko/docs/Learn/JavaScript/Objects/JSON)
- - : JSON(JavaScript Object Notation) 은 JavaScript 객체 문법상의 구조화된 데이터를 표현하기 위한 표준 텍스트기반 포맷입니다. 그래서 주로 웹사이트 상에 데이터를 표현하고 전송하는 데 사용되고 있습니다(예를 들면, 웹페이지 상에 데이터를 디스플레이할 수 있도록 서버에서 클라이언트로의 데이터 전송). 이 글에서는 데이터에 접근하기 위해 JSON 을 파싱하고, 또 자신만의 JSON 을 작성하는 것처럼 자바스크립트를 사용하여 JSON 과 연동할 필요가 있는 모든 것들을 보여드릴 것입니다.
+ - : JSON(JavaScript Object Notation) 은 JavaScript 객체 문법상의 구조화된 데이터를 표현하기 위한 표준 텍스트기반 포맷입니다. 그래서 주로 웹사이트 상에 데이터를 표현하고 전송하는 데 사용되고 있습니다(예를 들면, 웹페이지 상에 데이터를 디스플레이할 수 있도록 서버에서 클라이언트로의 데이터 전송). 이 글에서는 데이터에 접근하기 위해 JSON 을 파싱하고, 또 자신만의 JSON 을 작성하는 것처럼 JavaScript를 사용하여 JSON 과 연동할 필요가 있는 모든 것들을 보여드릴 것입니다.
- [객체 생성 실습](/ko/docs/Learn/JavaScript/Objects/Object_building_practice)
- : 이전 글들에서 우리는 JavaScript 객체 이론과 문법 세부사항의 중요한 것들을 보았습니다. 본 장에서는 커스텀 JavaScript 객체를 생성하는 다양한 연습을 하면서 실용적인 예들을 깊이 다룹니다.
diff --git a/files/ko/learn/javascript/objects/json/index.md b/files/ko/learn/javascript/objects/json/index.md
index bf62b9fd0c97d7..4d1c4c0b05893a 100644
--- a/files/ko/learn/javascript/objects/json/index.md
+++ b/files/ko/learn/javascript/objects/json/index.md
@@ -113,7 +113,7 @@ superHeroes["members"][1]["powers"][2];
### JSON에서의 배열
-앞서 JSON 텍스트는 기본적으로 자바스크립트의 오브젝트와 비슷하게 생겼다고 언급하였습니다. 그리고 그것은 대부분 맞습니다. "대부분 맞다"라고 말한 이유는 자바스크립트의 배열 또한 JSON에서 유효하기 때문입니다.
+앞서 JSON 텍스트는 기본적으로 JavaScript의 오브젝트와 비슷하게 생겼다고 언급하였습니다. 그리고 그것은 대부분 맞습니다. "대부분 맞다"라고 말한 이유는 JavaScript의 배열 또한 JSON에서 유효하기 때문입니다.
```json
[
@@ -144,7 +144,7 @@ superHeroes["members"][1]["powers"][2];
- JSON은 문자열과 프로퍼티의 이름 작성시 큰 따옴표만을 사용해야 합니다. 작은 따옴표는 사용불가합니다.
- 콤마나 콜론을 잘못 배치하는 사소한 실수로 인해 JSON파일이 잘못되어 작동하지 않을 수 있습니다. [JSONLint](http://jsonlint.com/)같은 어플리케이션을 사용해 JSON 유효성 검사를 할 수 있습니다.
- JSON은 JSON내부에 포함할 수 있는 모든 형태의 데이터 타입을 취할 수 있습니다. 즉, 배열이나 오브젝트 외에도 단일 문자열이나 숫자또한 유효한 JSON 오브젝트가 됩니다.
-- 자바스크립트에서 오브젝트 프로퍼티가 따옴표로 묶이지 않을 수도 있는 것과는 달리, JSON에서는 따옴표로 묶인 문자열만이 프로퍼티로 사용될 수 있습니다.
+- JavaScript에서 오브젝트 프로퍼티가 따옴표로 묶이지 않을 수도 있는 것과는 달리, JSON에서는 따옴표로 묶인 문자열만이 프로퍼티로 사용될 수 있습니다.
## 해보면서 배우기: JSON을 다뤄 보자
@@ -160,7 +160,7 @@ superHeroes["members"][1]["powers"][2];
```
-자바스크립트 코드를 담기 위한{{HTMLElement("script")}} 요소를 추가해 주세요. 현재는 두 줄의 코드만 작성되어 있습니다. {{HTMLElement("header")}} 와 {{HTMLElement("section")}} 요소를 참조하여 변수에 담는 코드입니다. :
+JavaScript 코드를 담기 위한{{HTMLElement("script")}} 요소를 추가해 주세요. 현재는 두 줄의 코드만 작성되어 있습니다. {{HTMLElement("header")}} 와 {{HTMLElement("section")}} 요소를 참조하여 변수에 담는 코드입니다. :
```js
var header = document.querySelector("header");
@@ -201,7 +201,7 @@ JSON을 가져오기 위해서는, {{domxref("XMLHttpRequest")}} (때론 **XHR**
- HTTP 메서드는 네트워크 요청을 만들 때 사용됩니다. 이 경우 [`GET`](/ko/docs/Web/HTTP/Methods/GET) 을 사용하는게 좋겠어요. 우린 그저 데이터를 가져오면 되니깐요.
- URL은 요청을 보낼 곳을 지정합니다. 우리가 저장해 둔 JSON 파일의 URL로 지정할게요.
-4. 다음으로, 아래의 두 줄을 추가해 주세요. [`responseType`](/ko/docs/Web/API/XMLHttpRequest/responseType) 을 JSON으로 설정했어요. XHR로 하여금 서버가 JSON 데이터를 반환할 것이며, 자바스크립트 객체로서 변환될 것이라는 걸 알게 하기 위해서죠. 이제 [`send()`](/ko/docs/Web/API/XMLHttpRequest/send) 메서드를 이용해 요청을 보냅시다.
+4. 다음으로, 아래의 두 줄을 추가해 주세요. [`responseType`](/ko/docs/Web/API/XMLHttpRequest/responseType) 을 JSON으로 설정했어요. XHR로 하여금 서버가 JSON 데이터를 반환할 것이며, JavaScript 객체로서 변환될 것이라는 걸 알게 하기 위해서죠. 이제 [`send()`](/ko/docs/Web/API/XMLHttpRequest/send) 메서드를 이용해 요청을 보냅시다.
```js
request.responseType = "json";
@@ -218,13 +218,13 @@ JSON을 가져오기 위해서는, {{domxref("XMLHttpRequest")}} (때론 **XHR**
};
```
-우리는 요청에 대한 응답을 `superHeroes`라는 변수에 저장할 겁니다.([`response`](/ko/docs/Web/API/XMLHttpRequest/response) 프로퍼티로 가능) 이 변수는 이제 JSON 데이터에 기반한 자바스크립트 객체를 포함하게 됩니다! 두 개의 함수를 호출해 이 객체를 전달합시다. 하나는 <`header>` 를 적절한 데이터로 채울 것이고, 다른 하나는 팀의 각 히어로에 대한 정보 카드를 생성하여 ``내에 집어넣을 겁니다.
+우리는 요청에 대한 응답을 `superHeroes`라는 변수에 저장할 겁니다.([`response`](/ko/docs/Web/API/XMLHttpRequest/response) 프로퍼티로 가능) 이 변수는 이제 JSON 데이터에 기반한 JavaScript 객체를 포함하게 됩니다! 두 개의 함수를 호출해 이 객체를 전달합시다. 하나는 <`header>` 를 적절한 데이터로 채울 것이고, 다른 하나는 팀의 각 히어로에 대한 정보 카드를 생성하여 ``내에 집어넣을 겁니다.
우리는 로드 이벤트가 request 객체에 발생할 때에 작동하는 이벤트 핸들러 내에 코드를 넣었습니다. ([`onload`](/ko/docs/Web/API/XMLHttpRequestEventTarget/onload) 참고) 왜냐하면 응답이 성공적으로 돌아왔을 때만 로드 이벤트가 작동하기 때문입니다. 이러한 방식은 우리가 무언가를 시도하려고 할 때 `request.response` 가 확실히 가능하다는 것을 보장해 줍니다.
### 헤더 조작하기
-우린 JSON 데이터를 가져왔고, 그것을 자바스크립트 객체로 변환했어요. 이제 우리가 위에서 언급한 두 개의 함수를 사용함으로써 이것을 활용해 봅시다. 우선, 이전 코드 아래에 다음 함수 정의를 추가해 주세요.
+우린 JSON 데이터를 가져왔고, 그것을 JavaScript 객체로 변환했어요. 이제 우리가 위에서 언급한 두 개의 함수를 사용함으로써 이것을 활용해 봅시다. 우선, 이전 코드 아래에 다음 함수 정의를 추가해 주세요.
```js
function populateHeader(jsonObj) {
@@ -239,7 +239,7 @@ function populateHeader(jsonObj) {
}
```
-우리는 이 매개변수를 `jsonObj`라고 이름 붙였습니다. 여러분으로 하여금 이 자바스크립트 객체가 JSON으로 부터 생겨났다는 걸 상기시켜 주기 위해서죠. 첫번째로 [`createElement()`](/ko/docs/Web/API/Document/createElement)로 {HTMLElement("h1")}} 요소를 생성하고, 이것의 [`textContent`](/ko/docs/Web/API/Node/textContent)를 객체의 `squadName` 프로퍼티와 같도록 만들어 준 뒤, [`appendChild()`](/ko/docs/Web/API/Node/appendChild)를 사용해서 헤더에 붙이도록 했습니다. We then do a very similar 이와 비슷한 과정을 paragraph에도 적용했죠. 생성하고,그것의 text content를 설정하고 헤더에 붙이도록요. 차이점이라면 그것의 텍스트가 객체의 `homeTown` 과 `formed` 프로퍼티를 포함한 문자열로 설정된 거예요.
+우리는 이 매개변수를 `jsonObj`라고 이름 붙였습니다. 여러분으로 하여금 이 JavaScript 객체가 JSON으로 부터 생겨났다는 걸 상기시켜 주기 위해서죠. 첫번째로 [`createElement()`](/ko/docs/Web/API/Document/createElement)로 {HTMLElement("h1")}} 요소를 생성하고, 이것의 [`textContent`](/ko/docs/Web/API/Node/textContent)를 객체의 `squadName` 프로퍼티와 같도록 만들어 준 뒤, [`appendChild()`](/ko/docs/Web/API/Node/appendChild)를 사용해서 헤더에 붙이도록 했습니다. We then do a very similar 이와 비슷한 과정을 paragraph에도 적용했죠. 생성하고,그것의 text content를 설정하고 헤더에 붙이도록요. 차이점이라면 그것의 텍스트가 객체의 `homeTown` 과 `formed` 프로퍼티를 포함한 문자열로 설정된 거예요.
### 히어로 정보 카드 만들기
@@ -280,7 +280,7 @@ function showHeroes(jsonObj) {
}
```
-우선, 새로운 변수 내의 자바스크립트 객체에 `members` 프로퍼티를 저장해 주세요. 이 배열은 각 히어로에 대한 정보를 가진 여러 개의 객체를 포함합니다.
+우선, 새로운 변수 내의 JavaScript 객체에 `members` 프로퍼티를 저장해 주세요. 이 배열은 각 히어로에 대한 정보를 가진 여러 개의 객체를 포함합니다.
다음으로, 우리는 [for loop](/ko/docs/Learn/JavaScript/Building_blocks/Looping_code#The_standard_for_loop)를 사용하여 배열 내의 각 객체에 반복 실행을 걸겁니다.
@@ -297,15 +297,15 @@ function showHeroes(jsonObj) {
## 객체와 문자 사이의 변환
-위의 예제는 자바스크립트 객체에 접근한다는 관점에서 단순한 편이었죠. 왜냐하면 자바스크립트 객체를 사용해 우리는 XHR 요청을 곧장 JSON 응답으로 변환했으니깐요.
+위의 예제는 JavaScript 객체에 접근한다는 관점에서 단순한 편이었죠. 왜냐하면 JavaScript 객체를 사용해 우리는 XHR 요청을 곧장 JSON 응답으로 변환했으니깐요.
```js
request.responseType = "json";
```
-하지만 우리는 이따금 재수 없어요. 때때로 우리는 날것의 JSON 문자열을 받기도 하고, 그것을 우리 스스로가 객체로 변환시켜야 할 때도 생기거든요. 그리고 네트워크를 통해 자바스크립트 객체를 보내고 싶을 때도 우리는 전송 전에 그걸 JSON(문자열)로 변환시켜야 해요. 다행히도, 이 두가지 문제가 웹 개발에 있어서 매우 흔한 덕에 다음과 같은 두가지 방법을 포함한 JSON 내장 객체가 브라우저 내에서 이용 가능합니다.
+하지만 우리는 이따금 재수 없어요. 때때로 우리는 날것의 JSON 문자열을 받기도 하고, 그것을 우리 스스로가 객체로 변환시켜야 할 때도 생기거든요. 그리고 네트워크를 통해 JavaScript 객체를 보내고 싶을 때도 우리는 전송 전에 그걸 JSON(문자열)로 변환시켜야 해요. 다행히도, 이 두가지 문제가 웹 개발에 있어서 매우 흔한 덕에 다음과 같은 두가지 방법을 포함한 JSON 내장 객체가 브라우저 내에서 이용 가능합니다.
-- [`parse()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse): JSON 문자열을 매개변수로서 수용하고, 일치하는 자바스크립트 객체로서 변환합니다.
+- [`parse()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse): JSON 문자열을 매개변수로서 수용하고, 일치하는 JavaScript 객체로서 변환합니다.
- [`stringify()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify): 객체를 매개변수로서 수용하고, JSON 문자열 형태로 변환합니다.
당신은 예제인 [heroes-finished-json-parse.html](http://mdn.github.io/learning-area/javascript/oojs/json/heroes-finished-json-parse.html)에서 첫번째 동작을 확인할 수 있습니다.(아래 코드 참고-[source code](https://github.com/mdn/learning-area/blob/master/javascript/oojs/json/heroes-finished-json-parse.html)) — JSON 텍스트를 반환하기 위한 추가한 XHR와 JavaScript 객체로 전환하기 위해 사용된 `parse()`제외하면 이 코드는 이전에 우리가 빌드한 것과 완전히 같은 코드입니다. 다음은중요한 코드의 일부입니다.:
diff --git a/files/ko/learn/javascript/objects/object_prototypes/index.md b/files/ko/learn/javascript/objects/object_prototypes/index.md
index 5f625cd320593d..6c5c378eb62fac 100644
--- a/files/ko/learn/javascript/objects/object_prototypes/index.md
+++ b/files/ko/learn/javascript/objects/object_prototypes/index.md
@@ -12,7 +12,7 @@ Javascript에서는 객체를 상속하기 위하여 프로토타입이라는
선수조건:
- 컴퓨터 기본지식, HTML과 CSS에 대한 기본적인 이해,자바스크립트에 어느
+ 컴퓨터 기본지식, HTML과 CSS에 대한 기본적인 이해,JavaScript에 어느
정도 익숙할 것 (see
First steps and
Building blocks **참고:** 아래에 있는 편집기를 사용해보세요. 테스트 중 막히면, 도움을 요청할 수 있습니다. 페이지 하단의 "평가 또는 추가 도움말" 을 참고하세요.
-> **참고:** 작성한 코드에 오류가 발생하는 경우, 결과창에서 정답을 알아낼 수 있도록 돕기 위해 결과값을 보여줄 것입니다. (또는 브라우저의 자바스크립트 콘솔로도 확인 가능합니다.)
+> **참고:** 작성한 코드에 오류가 발생하는 경우, 결과창에서 정답을 알아낼 수 있도록 돕기 위해 결과값을 보여줄 것입니다. (또는 브라우저의 JavaScript 콘솔로도 확인 가능합니다.)
## JSON 1
@@ -31,7 +31,7 @@ slug: Learn/JavaScript/Objects/Test_your_skills:_JSON
{{EmbedGHLiveSample("learning-area/javascript/oojs/tasks/json/json1.html", '100%', 400)}}
-> **경고:** 이번 테스트를 치를 때 코드를 위에 있는 편집기에 작성하세요. 로컬환경이나 CodePen 또는 JSFiddle 에서는 이 예제가 작동하지 않을 수 있는데, _cross-origin_ 라고 불리는 보안정책 때문일 것입니다. 이는 현재 환경과 다른 출처의 리소스의 요청을 제한하는 정책입니다. 위 편집기는 자바스크립트 코드와 요청된 JSON 파일을 모두 동일한 출처에서 요청하고 있습니다. (Github 저장소의 \
@@ -43,11 +43,11 @@ Svelte가 어떻게 작동하는지, 지금까지 본 나머지 프레임워크
## Svelte: 풍부한 사용자 인터페이스를 구축하기 위한 새로운 접근
-Svelte는 모듈에서 다루는 다른 프레임워크와는 다른 웹앱 구축 방식을 제공합니다. React와 Vue와 같은 프레임 워크는 앱이 실행되는 동안 사용자의 브라우저에서 대부분의 작업을 수행하지만 Svelte는 해당 작업을 앱을 빌드하는 컴파일 단계로 전환하여 고도로 최적화된 바닐라 자바스크립트를 생성합니다.
+Svelte는 모듈에서 다루는 다른 프레임워크와는 다른 웹앱 구축 방식을 제공합니다. React와 Vue와 같은 프레임 워크는 앱이 실행되는 동안 사용자의 브라우저에서 대부분의 작업을 수행하지만 Svelte는 해당 작업을 앱을 빌드하는 컴파일 단계로 전환하여 고도로 최적화된 바닐라 JavaScript를 생성합니다.
이 접근 방식의 결과는 더 작은 어플리케이션 번들과 더 좋은 성능을 낼 뿐만 아니라 개발자들이 최신 도구적 생태계에 제한된 경험을 가진 사람들에게 더욱 다가가는 경험을 합니다.
-Svelte는 HTML, CSS 및 자바스크립트의 고전적인 웹 개발 모델을 고수하면서 HTML과 자바스크립트에 몇 가지 확장을 추가합니다. 스벨트는 다른 프레임워크 선택지보다 배워야 할 개념과 도구가 적습니다.
+Svelte는 HTML, CSS 및 JavaScript의 고전적인 웹 개발 모델을 고수하면서 HTML과 JavaScript에 몇 가지 확장을 추가합니다. 스벨트는 다른 프레임워크 선택지보다 배워야 할 개념과 도구가 적습니다.
현재 주요한 단점은 신생 프레임워크라는 것입니다. 따라서 생태계는 성숙한 프레임워크보다 도구, 지원, 플러그인, 명확한 사용 패턴 등의 측면에서 더 제한적이며 일자리도 적습니다. 그러나 Svelte의 장점은 당신이 그것에 대해 관심을 갖도록 만들기에 충분할 것입니다.
@@ -69,13 +69,13 @@ Svelte는 특히 다음 상황을 해결하는 데 적합합니다.
## Svelte는 어떻게 작동하나요?
-컴파일러이기 때문에 Svelte는 HTML, CSS 및 자바스크립트를 확장하여 런타임 오버헤드 없이 최적의 JavaScript 코드를 생성할 수 있습니다. 이를 달성하기 위해 Svelte는 다음과 같은 방식으로 바닐라 웹 기술을 확장합니다.
+컴파일러이기 때문에 Svelte는 HTML, CSS 및 JavaScript를 확장하여 런타임 오버헤드 없이 최적의 JavaScript 코드를 생성할 수 있습니다. 이를 달성하기 위해 Svelte는 다음과 같은 방식으로 바닐라 웹 기술을 확장합니다.
-- 마크업에서 자바스크립트 표현식을 허용하고 핸들바와 유사한 방식으로 조건 및 루프를 사용하는 지시문을 제공하여 HTML을 확장합니다.
+- 마크업에서 JavaScript 표현식을 허용하고 핸들바와 유사한 방식으로 조건 및 루프를 사용하는 지시문을 제공하여 HTML을 확장합니다.
- 범위 지정 메커니즘을 추가해 CSS를 확장함으로 각 컴포넌트가 다른 컴포넌트의 스타일과 충돌할 위험 없이 자체 스타일을 정의할 수 있도록 합니다.
-- 진정한 반응성을 달성하고 컴포넌트 상태 관리를 용이하게 하기 위해 언어의 특정 지시문을 재해석하여 자바스크립트를 확장합니다.
+- 진정한 반응성을 달성하고 컴포넌트 상태 관리를 용이하게 하기 위해 언어의 특정 지시문을 재해석하여 JavaScript를 확장합니다.
-컴파일러는 매우 특정한 상황과 Svelte 컴포넌트의 컨텍스트에서만 개입합니다. 자바스크립트 언어에 대한 확장은 최소한이며 자바스크립트 구문을 위반하거나 개발자를 소외시키지 않도록 신중하게 선택됩니다. 사실, 대부분 바닐라 자바스크립트로 작업하게 될 것입니다.
+컴파일러는 매우 특정한 상황과 Svelte 컴포넌트의 컨텍스트에서만 개입합니다. JavaScript 언어에 대한 확장은 최소한이며 JavaScript 구문을 위반하거나 개발자를 소외시키지 않도록 신중하게 선택됩니다. 사실, 대부분 바닐라 JavaScript로 작업하게 될 것입니다.
## Svelte의 첫 단계
@@ -218,7 +218,7 @@ moz-todo-svelte
### `
```
-Svelte는 [`export`](/ko/docs/Web/JavaScript/Reference/Statements/export) 키워드를 사용하여 변수 선언을 속성으로 표시합니다. 이는 컴포넌트의 사용자가 액세스할 수 있음을 의미합니다. (예: 다른 컴포넌트). 이것은 Svelte가 자바스크립트 구문을 확장하여 친숙함을 유지하면서 더 유용하게 만드는 한 예입니다.
+Svelte는 [`export`](/ko/docs/Web/JavaScript/Reference/Statements/export) 키워드를 사용하여 변수 선언을 속성으로 표시합니다. 이는 컴포넌트의 사용자가 액세스할 수 있음을 의미합니다. (예: 다른 컴포넌트). 이것은 Svelte가 JavaScript 구문을 확장하여 친숙함을 유지하면서 더 유용하게 만드는 한 예입니다.
### 마크업 부분
-마크업 섹션에서 원하는 HTML을 삽입할 수 있으며 추가로 단일 중괄호(`{}`) 안에 유효한 자바스크립트 표현식을 삽입할 수 있습니다. 이 경우 `안녕` 텍스트 바로 뒤에 `name` 속성의 값을 삽입합니다.
+마크업 섹션에서 원하는 HTML을 삽입할 수 있으며 추가로 단일 중괄호(`{}`) 안에 유효한 JavaScript 표현식을 삽입할 수 있습니다. 이 경우 `안녕` 텍스트 바로 뒤에 `name` 속성의 값을 삽입합니다.
```html
@@ -328,7 +328,7 @@ Svelte에서 반응성은 컴포넌트의 최상위 변수에 새 값을 할당
버튼을 클릭할 때마다 Svelte는 `toggleName()` 함수를 실행하여 `name` 변수의 값을 업데이트합니다.
-보시다시피 `` 레이블이 자동으로 업데이트됩니다. 뒤의 내용에서 Svelte는 가상 DOM이나 기타 복잡한 조정 메커니즘을 사용하지 않고 name 변수의 값이 변경될 때마다 DOM을 업데이트하는 자바스크립트 코드를 만들었습니다.
+보시다시피 `` 레이블이 자동으로 업데이트됩니다. 뒤의 내용에서 Svelte는 가상 DOM이나 기타 복잡한 조정 메커니즘을 사용하지 않고 name 변수의 값이 변경될 때마다 DOM을 업데이트하는 JavaScript 코드를 만들었습니다.
`on:click`에서 `:`의 사용에 유의하십시오. 이것이 DOM 이벤트를 수신하기 위한 Svelte의 구문입니다.
@@ -384,7 +384,7 @@ Svelte 컴파일러는 모든 컴포넌트의 `
-
-
- Update
-
-
-
-
-
-
-```
-
-{{ EmbedLiveSample('Hidden_code', '100%', 400, "", "", "hide-codepen-jsfiddle") }}
-
-No tienes que entender todo el código por ahora, pero vamos a echar un vistazo a la parte de código que dibuja los 100 círculos:
+btn.addEventListener("click", draw);
+```
+
+### Con y sin bucles
+
+No tienes que entender todo el código por ahora, pero veamos la parte del código que realmente dibuja los 100 círculos:
```js
-for (var i = 0; i < 100; i++) {
+for (let i = 0; i < 100; i++) {
ctx.beginPath();
ctx.fillStyle = "rgba(255,0,0,0.5)";
- ctx.arc(random(WIDTH), random(HEIGHT), random(50), 0, 2 * Math.PI);
+ ctx.arc(
+ random(canvas.width),
+ random(canvas.height),
+ random(50),
+ 0,
+ 2 * Math.PI,
+ );
ctx.fill();
}
```
-Debes quedarte con la idea básica. — utilizamos un bucle para ejecutar 100 iteracciones de este código, cada una de las cuales dibuja un círculo en una posición aleatoria de la página. La cantidad de código necesario sería el mismo si dibujáramos 100, 1000, o 10,000 círculos. Solo necesitamos cambiar un número.
+- `random(x)`, definido anteriormente en el código, devuelve un número entero entre `0` y `x-1`.
-Si no usáramos un bucle aquí, tendríamos que repetir el siguiente código por cada círculo que quisiéramos dibujar:
+Deberías tener la idea básica: estamos usando un bucle para ejecutar 100 iteraciones de este código, cada una de las cuales dibuja un círculo en una posición aleatoria en la página.
+La cantidad de código necesaria sería la misma si estuviéramos dibujando 100 círculos, 1000 o 10.000.
+Solo un número tiene que cambiar.
+
+Si no estuviéramos usando un bucle aquí, tendríamos que repetir el siguiente código para cada círculo que quisiéramos dibujar:
```js
ctx.beginPath();
ctx.fillStyle = "rgba(255,0,0,0.5)";
-ctx.arc(random(WIDTH), random(HEIGHT), random(50), 0, 2 * Math.PI);
+ctx.arc(
+ random(canvas.width),
+ random(canvas.height),
+ random(50),
+ 0,
+ 2 * Math.PI,
+);
ctx.fill();
```
-Esto sería muy aburrido y difícil de mantener de forma rápida. Los bucles son realmente lo mejor.
+Esto sería muy aburrido y difícil de mantener.
+
+## Recorriendo una colección
-## El bucle estándar `for`
+La mayoría de las veces, cuando usas un bucle, tendrás una colección de artículos y querrás hacer algo con cada artículo.
-Exploremos algunos constructores de bucles específicos. El primero, que usarás la mayoría de las veces, es el bucle [for](/es/docs/Web/JavaScript/Referencia/Sentencias/for) - este tiene la siguiente sintaxis:
+Un tipo de colección es el {{jsxref("Array","Arreglo")}}, que conocimos en el capítulo de [Arreglos](/es/docs/Learn/JavaScript/First_steps/Arrays) de este curso.
+Pero también hay otras colecciones en JavaScript, como {{jsxref ("Set")}} y {{jsxref("Map")}}.
+### El bucle for...of
+
+La herramienta básica para recorrer una colección es el bucle {{jsxref("statements/for...of","for...of")}}:
+
+```js
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
+
+for (const cat of cats) {
+ console.log(cat);
+}
```
-for (inicializador; condición de salida; expresión final) {
+
+En este ejemplo, `for (const cat of cats)` dice:
+
+1. Dada la colección `cats`, consigue el primer artículo de la colección.
+2. Asignarlo a la variable `cat` y luego ejecutar el código entre las llaves `{}`.
+3. Obtén el siguiente elemento y repite (2) hasta que hayas llegado al final de la colección.
+
+### map() y filter()
+
+JavaScript también tiene bucles más especializados para colecciones, y mencionaremos dos de ellos aquí.
+
+Puede usar `map()` para hacer algo con cada elemento de una colección y crear una nueva colección que contenga los elementos modificados:
+
+```js
+function toUpper(string) {
+ return string.toUpperCase();
+}
+
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
+
+const upperCats = cats.map(toUpper);
+
+console.log(upperCats);
+// [ "LEOPARDO", "SERVAL", "JAGUAR", "TIGRE", "CARACAL", "LEÓN" ]
+```
+
+Aquí pasamos una función a {{jsxref("Array.prototype.map()","cats.map()")}}, y `map()` llama a la función una vez por cada elemento de la matriz, pasando el elemento. A continuación, añade el valor devuelto de cada llamada de función a un nuevo arreglo y, finalmente, devuelve el nuevo arreglo. En este caso, la función que proporcionamos convierte el elemento en mayúsculas, por lo que la matriz resultante contiene todos nuestros gatos en mayúsculas:
+
+```js-nolint
+[ "LEOPARDO", "SERVAL", "JAGUAR", "TIGRE", "CARACAL", "LEÓN" ]
+```
+
+Puede usar {{jsxref("Array.prototype.filter()","filter()")}} para probar cada elemento de una colección y crear una nueva colección que contenga solo elementos que coincidan:
+
+```js
+function lCat(cat) {
+ return cat.startsWith("L");
+}
+
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
+
+const filtered = cats.filter(lCat);
+
+console.log(filtrado);
+// [ "Leopardo", "León" ]
+```
+
+Esto se parece mucho a `map()`, excepto que la función que pasamos devuelve un [booleano](/es/docs/Learn/JavaScript/First_steps/Variables#booleans): si devuelve `true`, entonces el elemento se incluye en el nuevo arreglo.
+Nuestra función prueba que el elemento comienza con la letra "L", por lo que el resultado es una matriz que contiene solo gatos cuyos nombres comienzan con "L":
+
+```js-nolint
+[ "Leopardo", "León" ]
+```
+
+Tenga en cuenta que `map()` y `filter()` se usan a menudo con _expresiones de funciones_, que aprenderemos en el módulo [Functions](/es/docs/Learn/JavaScript/Building_blocks/Functions).
+Usando expresiones de función podríamos reescribir el ejemplo anterior para que sea mucho más compacto:
+
+```js
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
+
+const filter = cats.filter((cat) => cat.startsWith("L"));
+console.log(filtrado);
+// [ "Leopardo", "León" ]
+```
+
+## El bucle estándar for
+
+En el ejemplo anterior de "círculos de dibujo", no tiene una colección de elementos para recorrer: realmente solo desea ejecutar el mismo código 100 veces.
+En un caso como ese, debes usar el bucle {{jsxref("statements/for","for")}}.
+Tiene la siguiente sintaxis:
+
+```js-nolint
+for (inicializador; condición; expresión-final) {
// código a ejecutar
}
```
Aquí tenemos:
-1. La palabra reservada `for`, seguida por algunos paréntesis.
-2. Dentro de los paréntesis tenemos tres ítems, separados por punto y coma (;):
+1. La palabra clave `for`, seguida de algunos paréntesis.
+2. Dentro de los paréntesis tenemos tres ítems, separados por punto y coma:
+
+ 1. Un **inicializador**: generalmente es una variable establecida en un número, que se incrementa para contar el número de veces que se ha ejecutado el bucle.
+ También se denomina a veces **variable de contador**.
+ 2. Una **condición**: define cuándo el bucle debe dejar de funcionar.
+ Esta es generalmente una expresión que presenta un operador de comparación, una prueba para ver si se ha cumplido la condición de salida.
+ 3. Una **expresión-final**: siempre se evalúa (o ejecuta) cada vez que el bucle ha pasado por una iteración completa.
+ Por lo general, sirve para incrementar (o en algunos casos disminuir) la variable contadora, para acercarla al punto en que la condición ya no es `true`.
- 1. Un **inicializador** - Este es usualmente una variable con un número asignado, que aumenta el número de veces que el bucle ha sijo ejecutado. También se le llama **contador** o **variable de conteo**.
- 2. Una **condición de salida** - como se mencionó previamente, ésta define cuando el bucle debería detenerse. Generalmente es una expresión que contiene un operador de comparación, una prueba para verificar ue la condición de término o salida ha sido cumplida.
- 3. Una **expresión final** - que es siempre evaluada o ejecutada cada vez que el bucle ha completado una iteración. Usualmente sirve para modificar al contador (incrementando su valor o algunas veces disminuyendolo), para aproximarse a la condición de salida.
+3. Algunas llaves que contienen un bloque de código: este código se ejecutará cada vez que el bucle se repita.
-3. Algunos corchetes curvos que contienen un bloque de código - este código se ejecutará cada vez que se repita el bucle.
+### Cálculo de cuadrados
-Observa un ejemplo real para poder entender esto más claramente.
+Veamos un ejemplo real para que podamos visualizar lo que estos hacen con mayor claridad.
+
+```html oculto
+Calcular
+Borrar
+
+```
```js
-var cats = ["Bill", "Jeff", "Pete", "Biggles", "Jasmin"];
-var info = "My cats are called ";
-var para = document.querySelector("p");
+const results = document.querySelector("#results");
-for (var i = 0; i < cats.length; i++) {
- info += cats[i] + ", ";
+function calculate() {
+ for (let i = 1; i < 10; i++) {
+ const newResult = `${i} x ${i} = ${i * i}`;
+ results.textContent += `${newResult}\n`;
+ }
+ results.textContent += "\n¡Finalizado!";
}
-para.textContent = info;
+const calculateBtn = document.querySelector("#calculate");
+const clearBtn = document.querySelector("#clear");
+
+calculateBtn.addEventListener("click", calculate);
+clearBtn.addEventListener("click", () => (results.textContent = ""));
```
Esto nos da el siguiente resultado:
-```html hidden
-
-
-
-
- Basic for loop example
-
-
-
-
+{{ EmbedLiveSample('cálculo_de_cuadrados', '100%', 250) }}
-
-
-
+1. `let i = 1`: la variable del contador, `i`, comienza en `1`. Tenga en cuenta que tenemos que usar `let` para el contador, porque lo estamos reasignando cada vez que damos la vuelta al bucle.
+2. `i < 10`: sigue dando la vuelta al bucle mientras `i` sea menor que `10`.
+3. `i++`: añade uno a `i` cada vez que recorras el bucle.
+
+Dentro del bucle, calculamos el cuadrado del valor actual de `i`, es decir: `i * i`. Creamos una cadena que expresa el cálculo que realizamos y el resultado, y añadimos esta cadena al texto de salida. También añadimos `\n`, por lo que la siguiente cadena que añadamos comenzará en una nueva línea. De manera que:
+
+1. Durante la primera ejecución, `i = 1`, por lo que añadiremos `1 x 1 = 1`.
+2. Durante la segunda ejecución, `i = 2`, por lo que añadiremos `2 x 2 = 4`.
+3. Y así sucesivamente...
+4. Cuando `i` sea igual a `10`, dejaremos de ejecutar el bucle y pasaremos directamente al siguiente código debajo del bucle, imprimiendo el mensaje `¡Finalizado!` en una nueva línea.
+
+### Recorriendo colecciones con un bucle for
+
+Puede usar un bucle `for` para iterar a través de una colección, en lugar de un bucle `for...of`.
+
+Echemos un vistazo de nuevo a nuestro ejemplo anterior "for...of":
+
+```js
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
+
+for (const cat of cats) {
+ console.log(cat);
+}
```
-{{ EmbedLiveSample('Hidden_code_2', '100%', 60, "", "", "hide-codepen-jsfiddle") }}
+Podríamos reescribir ese código así:
-> **Nota:** Puedes encontrar este [ejemplo de código en GitHub](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/basic-for.html) también (además puedes [verlo ejecutar en vivo](http://mdn.github.io/learning-area/javascript/building-blocks/loops/basic-for.html)).
+```js
+const cats = ["Leopardo", "Serval", "Jaguar", "Tigre", "Caracal", "León"];
-Esto muestra un bucle siendo usado para iterar sobre los elementos de un arreglo (matriz), y hacer algo con cada uno de ellos - un patrón muy común en JavaScript. Aquí:
+for (let i = 0; i < cats.length; i++) {
+ console.log(cats[i]);
+}
+```
+
+En este bucle, comenzamos `i` en `0` y nos detenemos cuando `i` alcanza la longitud del arreglo.
+Luego, dentro del bucle, estamos usando `i` para acceder a cada elemento del arreglo a su vez.
+
+Esto funciona muy bien, y en las primeras versiones de JavaScript, `for...of` no existía, por lo que esta era la forma estándar de iterar a través de un arreglo.
+Sin embargo, ofrece más posibilidades de introducir errores en tu código. Por ejemplo:
+
+- puede comenzar `i` en `1`, olvidando que el primer índice del arreglo es cero, no 1.
+- puede detenerse en `i <= cats.length`, olvidando que el último índice de matriz está en `length - 1`.
-1. El iterador, `i`, inicia en `0` (`var i = 0`).
-2. Se le ha dicho que debe ejecutarse hasta que no sea menor que la longitud del arreglo `cats`. Esto es importante - la condición de salida muestra la condicion bajo la cual el bucle seguirá iterando. Así, en este caso, mientras `i < cats.length` sea verdadero, el bucle seguirá ejecutándose.
-3. Dentro del bucle, concatenamos el elemento del bucle actual (`cats[i]` es `cats[lo que sea i en ese momento]`) junto con una coma y un espacio, al final de la variable `info`. Así:
+Por razones como esta, generalmente es mejor usar `for...of` si puedes.
- 1. Durante la primera ejecución, `i = 0`, así `cats[0] + ', '` se concatenará con la información ("Bill, ").
- 2. Durante la segunda ejecución, `i = 1`, así `cats[1] + ', '` agregará el siguiente nombre ("Jeff, ").
- 3. Y así sucesivamente. Después de cada vez que se ejecute el bucle, se incrementará en 1 el valod de i (`i++`), entonces el proceso comenzará de nuevo.
+A veces todavía necesitas usar un bucle `for` para iterar a través de un arreglo.
+Por ejemplo, en el siguiente código queremos registrar un mensaje que enumere a nuestros gatos:
+
+```js
+const cats = ["Pete", "Biggles", "Jasmine"];
+
+let myFavoriteCats = "Mis gatos se llaman ";
+
+for (const cat of cats) {
+ myFavoriteCats += `${cat}, `;
+}
-4. Cuando `i` sea igual a `cats.length`, el bucle se detendrá, y el navegador se moverá al siguiente segmento de código bajo el bucle.
+console.log(myFavoriteCats); // "Mis gatos se llaman Pete, Biggles, Jasmine, "
+```
-> **Nota:** Hemos programado la condición de salidad como `i < cats.length`, y no como `i <= cats.length`, porque los computadores cuentan desde 0, no 1 - inicializamos la variable i en 0, para llegar a `i = 4` (el índice del último elemento del arreglo). `cats.length` responde 5, ya que existen 5 elementos en el arreglo, pero no queremos que i = 5, dado que respondería `undefined` para el último elemento (no existe un elemento en el arreglo con un índice 5). for the last item (there is no array item with an index of 5). Por ello, queremos llegar a 1 menos que `cats.length` (`i <`), que no es lo mismo que `cats.length` (`i <=`).
+La oración de salida final no está muy bien formada:
-> **Nota:** Un error común con la condición de salida es utilizar el comparador "igual a" (`===`) en vez de "menor o igual a" (`<=`). Si queremos que nuestro bucle se ejecute hasta que `i = 5`, la condición de salida debería ser `i <= cats.length`. Si la declaramos `i === cats.length`, el bucle no debería ejecutarse , porque `i` no es igual a `5` en la primera iteración del bucle, por lo que debería detenerse inmediatamente.
+```plain
+Mis gatos se llaman Pete, Biggles, Jasmine,
+```
-Un pequeño problema que se presenta es que la frase de salida final no está muy bien formada:
+Preferiríamos que manejara al último gato de manera diferente, así:
-> My cats are called Bill, Jeff, Pete, Biggles, Jasmin,
+```plain
+Mis gatos se llaman Pete, Biggles y Jasmine.
+```
-Idealmente querríamos cambiar la concatenacion al final de la última iteracion del bucle, así no tendríamos una coma en el final de la frase. Bueno, no hay problema - podemos insertar un condicional dentro de nuestro bucle para solucionar este caso especial:
+Pero para hacer esto necesitamos saber cuándo estamos en la iteración final del bucle, y para hacerlo podemos usar un bucle `for` y examinar el valor de `i`:
```js
-for (var i = 0; i < cats.length; i++) {
+const cats = ["Pete", "Biggles", "Jasmine"];
+
+let myFavoriteCats = "Mis gatos se llaman ";
+
+for (let i = 0; i < cats.length; i++) {
if (i === cats.length - 1) {
- info += "and " + cats[i] + ".";
+ // Estamos al final del arreglo
+ myFavoriteCats += `y ${cats[i]}.`;
} else {
- info += cats[i] + ", ";
+ myFavoriteCats += `${cats[i]}, `;
}
}
-```
-
-> **Nota:** You can find this [example code on GitHub](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/basic-for-improved.html) too (also [see it running live](http://mdn.github.io/learning-area/javascript/building-blocks/loops/basic-for-improved.html)).
-> **Advertencia:** **Importante**: Con `for` - como con todos los bucles - debes estar seguro de que el inicializador es repetido hasta que eventualemtne alcance la condición de salida. Si no, el bucle seguirá repitiéndose indefinidamente, y puede que el navegador lo fuerce a detenerse o se interrumpa. Esto se denomina **bucle infinito**.
+console.log(myFavoriteCats); // "Mis gatos se llaman Pete, Biggles y Jasmine."
+```
-## Salir de un bucle con `break`
+## Saliendo de bucles con break
-Si deseas salir de un bucle antes de que se hayan completado todas las iteraciones, puedes usar la declaración [break](/es/docs/Web/JavaScript/Referencia/Sentencias/break). Ya la vimos en el artículo previo cuando revisamos la declaración [switch](/es/docs/Web/JavaScript/Referencia/Sentencias/switch) - cuando un caso en una declaración `switch` coincide con la expresión de entrada, la declaración `break` inmediatamente sale de la declaración `switch` y avanza al código que se encuentra después.
+Si desea salir de un bucle antes de que se hayan completado todas las iteraciones, puede usar la instrucción [break](/es/docs/Web/JavaScript/Reference/Statements/break).
+Ya vimos esto en el artículo anterior cuando analizamos las [sentencias switch](/es/docs/Learn/JavaScript/Building_blocks/conditionals#switch_statements): cuando se cumple un caso en una sentencia switch que coincide con la expresión de entrada, la sentencia `break` sale inmediatamente de la sentencia switch y pasa al código después de ella.
-Ocurre lo mismo con los bucles - una declaración `break` saldrá inmediatamente del bucle y hará que el navegador siga con el código que sigue después.
+Es lo mismo con los bucles: una instrucción `break` saldrá inmediatamente del bucle y hará que el navegador pase a cualquier código que lo siga.
-Digamos que queremos buscar a través de un arreglo de contactos y números telefónicos y retornar sólo el número que queríamos encontrar. primero, un simple HTML - un {{htmlelement("input")}} de texto que nos permita ingresar un nombre para buscar, un elemento {{htmlelement("button")}} para enviar la búsqueda, y un elemento {{htmlelement("p")}} para mostrar el resultado:
+Digamos que queríamos buscar a través de una serie de contactos y números de teléfono y devolver solo el número que queríamos encontrar.
+Primero, un HTML simple: un {{htmlelement("input")}} de texto que nos permite ingresar un nombre para buscar, un elemento {{htmlelement ("button")}} para enviar una búsqueda y un elemento {{htmlelement("p")}} para mostrar los resultados en:
```html
-Search by contact name:
+Buscar por nombre de contacto:
-Search
+Buscar
```
-Ahora en el JavaScript:
+Ahora pasemos a JavaScript:
```js
-var contacts = [
+const contacts = [
"Chris:2232322",
"Sarah:3453456",
"Bill:7654322",
"Mary:9998769",
"Dianne:9384975",
];
-var para = document.querySelector("p");
-var input = document.querySelector("input");
-var btn = document.querySelector("button");
+const para = document.querySelector("p");
+const input = document.querySelector("input");
+const btn = document.querySelector("button");
-btn.addEventListener("click", function () {
- var searchName = input.value;
+btn.addEventListener("click", () => {
+ const searchName = input.value.toLowerCase();
input.value = "";
input.focus();
- for (var i = 0; i < contacts.length; i++) {
- var splitContact = contacts[i].split(":");
- if (splitContact[0] === searchName) {
- para.textContent =
- splitContact[0] + "'s number is " + splitContact[1] + ".";
+ para.textContent = "";
+ for (const contact of contacts) {
+ const splitContact = contact.split(":");
+ if (splitContact[0].toLowerCase() === searchName) {
+ para.textContent = `El número de ${splitContact[0]} es ${splitContact[1]}.`;
break;
- } else {
- para.textContent = "Contact not found.";
}
}
+ if (para.textContent === "") {
+ para.textContent = "Contacto no encontrado.";
+ }
});
```
-{{ EmbedLiveSample('Hidden_code_3', '100%', 100, "", "", "hide-codepen-jsfiddle") }}
-
-1. First of all we have some variable definitions — we have an array of contact information, with each item being a string containing a name and phone number separated by a colon.
-2. Next, we attach an event listener to the button (`btn`), so that when it is pressed, some code is run to perform the search and return the results.
-3. We store the value entered into the text input in a variable called `searchName`, before then emptying the text input and focusing it again, ready for the next search.
-4. Now onto the interesting part, the for loop:
+{{ EmbedLiveSample('saliendo_de_bucles_con_break', '100%', 100) }}
- 1. We start the counter at `0`, run the loop until the counter is no longer less than `contacts.length`, and increment `i` by 1 after each iteration of the loop.
- 2. Inside the loop we first split the current contact (`contacts[i]`) at the colon character, and store the resulting two values in an array called `splitContact`.
- 3. We then use a conditional statement to test whether `splitContact[0]` (the contact's name) is equal to the inputted `searchName`. If it is, we enter a string into the paragraph to report what the contact's number is, and use `break` to end the loop.
+1. En primer lugar, tenemos algunas definiciones de variables: tenemos una variedad de información de contacto, y cada elemento es una cadena que contiene un nombre y un número de teléfono separados por dos puntos.
+2. A continuación, adjuntamos un detector de eventos al botón (`btn`) para que cuando se pulse se ejecute algún código para realizar la búsqueda y devolver los resultados.
+3. Almacenamos el valor introducido en la entrada de texto en una variable llamada `searchName`, antes de vaciar la entrada de texto y volver a enfocarla, listos para la siguiente búsqueda.
+ Tenga en cuenta que también ejecutamos el método [`toLowerCase()`](/es/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase) en la cadena, de modo que las búsquedas no distingan entre mayúsculas y minúsculas.
+4. Ahora pasemos a la parte interesante, el bucle `for...of`:
-5. If the contact name does not match the entered search, the paragraph text is set to "Contact not found.", and the loop continues iterating.
+ 1. Dentro del bucle, primero dividimos el contacto actual en el carácter de dos puntos y almacenamos los dos valores resultantes en un arreglo llamado `splitContact`.
+ 2. Luego usamos una instrucción condicional para probar si `splitContact [0]` (el nombre del contacto, nuevamente en minúsculas con [`toLowerCase()`](/es/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)) es igual al `searchName` ingresado.
+ Si es así, introducimos una cadena en el párrafo para informar cuál es el número del contacto y usamos `break` para finalizar el bucle.
-> **Nota:** Note: You can view the [full source code on GitHub](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/contact-search.html) too (also [see it running live](http://mdn.github.io/learning-area/javascript/building-blocks/loops/contact-search.html)).
+5. Después del bucle, verificamos si configuramos un contacto y, de lo contrario, configuramos el texto del párrafo como "Contacto no encontrado".
-## Skipping iterations with continue
+> **Nota:** También puedes ver el [código fuente completo en GitHub](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/loops/contact-search.html) (también [verlo en vivo](https://mdn.github.io/learning-area/javascript/building-blocks/loops/contact-search.html)).
-The [continue](/es/docs/Web/JavaScript/Reference/Statements/continue) statement works in a similar manner to `break`, but instead of breaking out of the loop entirely, it skips to the next iteration of the loop. Let's look at another example that takes a number as an input, and returns only the numbers that are squares of integers (whole numbers).
+## Omitir iteraciones con continue
-The HTML is basically the same as the last example — a simple text input, and a paragraph for output. The JavaScript is mostly the same too, although the loop itself is a bit different:
+La instrucción [continue](/es/docs/Web/JavaScript/Reference/Statements/continue) funciona de manera similar a `break`, pero en lugar de salir del bucle por completo, salta a la siguiente iteración del bucle.
+Veamos otro ejemplo que toma un número como entrada y devuelve solo los números que son cuadrados de enteros (números enteros).
-```js
-var num = input.value;
+El HTML es básicamente el mismo que el último ejemplo: una entrada numérica simple y un párrafo para la salida.
-for (var i = 1; i <= num; i++) {
- var sqRoot = Math.sqrt(i);
- if (Math.floor(sqRoot) !== sqRoot) {
- continue;
- }
+```html
+Introducir número:
+
+Generar cuadrados enteros
- para.textContent += i + " ";
-}
+Resultado:
```
-Here's the output:
-
-```html hidden
-
-
-
-
- Integer squares generator
-
-
-
- Enter number:
-
- Generate integer squares
-
- Output:
-
-
-
-
+btn.addEventListener("click", () => {
+ para.textContent = "Resultado: ";
+ const num = input.value;
+ input.value = "";
+ input.focus();
+ for (let i = 1; i <= num; i++) {
+ let sqRoot = Math.sqrt(i);
+ if (Math.floor(sqRoot) !== sqRoot) {
+ continue;
+ }
+ para.textContent += `${i} `;
+ }
+});
```
-{{ EmbedLiveSample('Hidden_code_4', '100%', 100, "", "", "hide-codepen-jsfiddle") }}
+Este es el resultado:
-1. In this case, the input should be a number (`num`). The `for` loop is given a counter starting at 1 (as we are not interested in 0 in this case), an exit condition that says the loop will stop when the counter becomes bigger than the input `num`, and an iterator that adds 1 to the counter each time.
-2. Inside the loop, we find the square root of each number using [Math.sqrt(i)](/es/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt), then check whether the square root is an integer by testing whether it is the same as itself when it has been rounded down to the nearest integer (this is what [Math.floor()](/es/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) does to the number it is passed).
-3. If the square root and the rounded down square root do not equal one another (`!==`), it means that the square root is not an integer, so we are not interested in it. In such a case, we use the `continue` statement to skip on to the next loop iteration without recording the number anywhere.
-4. If the square root IS an integer, we skip past the if block entirely so the `continue` statement is not executed; instead, we concatenate the current `i` value plus a space on to the end of the paragraph content.
+{{ EmbedLiveSample('omitir_iteraciones_con_continue', '100%', 100) }}
-> **Nota:** You can view the [full source code on GitHub](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/integer-squares.html) too (also [see it running live](http://mdn.github.io/learning-area/javascript/building-blocks/loops/integer-squares.html)).
+1. En este caso, la entrada debe ser un número (`num`). Al bucle `for` se le da un contador que comienza en 1 (ya que no estamos interesados en 0 en este caso), una condición de salida que dice que el bucle se detendrá cuando el contador se vuelva más grande que la entrada `num`, y un iterador que suma 1 al contador cada vez.
+2. Dentro del bucle, encontramos la raíz cuadrada de cada número usando [Math.sqrt(i)](/es/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt), luego verificamos si la raíz cuadrada es un entero probando si es igual a sí misma cuando se ha redondeado al entero más cercano (esto es lo que [Math.floor()](/es/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) hace al número que se pasa).
+3. Si la raíz cuadrada y la raíz cuadrada redondeada hacia abajo no son iguales entre sí (`!==`), significa que la raíz cuadrada no es un número entero, por lo que no nos interesa. En tal caso, usamos la instrucción `continue` para saltar a la siguiente iteración de bucle sin registrar el número en ninguna parte.
+4. Si la raíz cuadrada es un número entero, omitimos por completo el bloque `if`, por lo que no se ejecuta la instrucción `continue`; en su lugar, concatenamos el valor `i` actual más un espacio al final del contenido del párrafo.
-## while and do ... while
+> **Nota:** También puedes ver el [código fuente completo en GitHub](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/loops/integer-squares.html) (también [verlo en vivo](https://mdn.github.io/learning-area/javascript/building-blocks/loops/integer-squares.html)).
-`for` is not the only type of loop available in JavaScript. There are actually many others and, while you don't need to understand all of these now, it is worth having a look at the structure of a couple of others so that you can recognize the same features at work in a slightly different way.
+## while y do...while
-First, let's have a look at the [while](/es/docs/Web/JavaScript/Reference/Statements/while) loop. This loop's syntax looks like so:
+`for` no es el único tipo de bucle disponible en JavaScript. En realidad, hay muchos otros y, aunque no es necesario que entiendas todos estos ahora, vale la pena echar un vistazo a la estructura de un par de otros para que puedas reconocer las mismas características en el trabajo de una manera ligeramente diferente.
-```
-initializer
-while (exit-condition) {
- // code to run
+Primero, echemos un vistazo al bucle [while](/es/docs/Web/JavaScript/Reference/Statements/while). La sintaxis de este bucle se ve así:
- final-expression
+```js-nolint
+inicializador
+while(condición) {
+ // código a ejecutar
+
+ expresión-final
}
```
-This works in a very similar way to the for loop, except that the initializer variable is set before the loop, and the final-expression is included inside the loop after the code to run — rather than these two items being included inside the parentheses. The exit-condition is included inside the parentheses, which are preceded by the `while` keyword rather than `for`.
+Esto funciona de una manera muy similar al bucle `for`, excepto que la variable inicializadora se establece antes del bucle, y la expresión final se incluye dentro del bucle después del código a ejecutar, en lugar de que estos dos elementos se incluyan dentro de los paréntesis.
+La condición se incluye dentro de los paréntesis, que están precedidos por la palabra clave `while` en lugar de `for`.
-The same three items are still present, and they are still defined in the same order as they are in the for loop — this makes sense, as you still have to have an initializer defined before you can check whether it has reached the exit-condition; the final-condition is then run after the code inside the loop has run (an iteration has been completed), which will only happen if the exit-condition has still not been reached.
+Los mismos tres elementos todavía están presentes, y todavía están definidos en el mismo orden en que están en el bucle for.
+Esto se debe a que debe tener un inicializador definido antes de poder verificar si la condición es verdadera o no.
+La expresión final se ejecuta después de que se haya ejecutado el código dentro del bucle (se ha completado una iteración), lo que solo ocurrirá si la condición sigue siendo cierta.
-Let's have a look again at our cats list example, but rewritten to use a while loop:
+Echemos un vistazo de nuevo a nuestro ejemplo de lista de gatos, pero reescrito para usar un bucle while:
```js
-var i = 0;
+const cats = ["Pete", "Biggles", "Jasmine"];
+
+let myFavoriteCats = "Mis gatos se llaman ";
+
+let i = 0;
while (i < cats.length) {
if (i === cats.length - 1) {
- info += "and " + cats[i] + ".";
+ myFavoriteCats += `y ${cats[i]}.`;
} else {
- info += cats[i] + ", ";
+ myFavoriteCats += `${cats[i]}, `;
}
i++;
}
+
+console.log(myFavoriteCats); // "Mis gatos se llaman Pete, Biggles y Jasmine."
```
-> **Nota:** This still works just the same as expected — have a look at it [running live on GitHub](http://mdn.github.io/learning-area/javascript/building-blocks/loops/while.html) (also view the [full source code](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/while.html)).
+> **Nota:** Esto sigue funcionando exactamente como se esperaba: échale un vistazo al [código fuente completo](https://mdn.github.io/learning-area/javascript/building-blocks/loops/while.html) (también puedes ver el [código fuente completo](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/loops/while.html)).
-The [do...while](/es/docs/Web/JavaScript/Reference/Statements/do...while) loop is very similar, but provides a variation on the while structure:
+El bucle [do...while](/es/docs/Web/JavaScript/Reference/Statements/do...while) es muy similar, pero proporciona una variación en la estructura while:
-```
-initializer
+```js-nolint
+inicializador
do {
- // code to run
+ // código a ejecutar
- final-expression
-} while (exit-condition)
+ expresión-final
+} while (condición)
```
-In this case, the initializer again comes first, before the loop starts. The `do` keyword directly precedes the curly braces containing the code to run and the final-expression.
+En este caso, el inicializador vuelve a aparecer primero, antes de que comience el bucle. La palabra clave precede directamente a las llaves que contienen el código a ejecutar y la expresión final.
-The differentiator here is that the exit-condition comes after everything else, wrapped in parentheses and preceded by a `while` keyword. In a `do...while` loop, the code inside the curly braces is always run once before the check is made to see if it should be executed again (in while and for, the check comes first, so the code might never be executed).
+La principal diferencia entre un bucle `do...while` y un bucle `while` es que _el código dentro de un bucle `do...while` siempre se ejecuta al menos una vez_. Esto se debe a que la condición viene después del código dentro del bucle. Así que siempre ejecutamos ese código, luego verificamos si necesitamos ejecutarlo de nuevo. En los bucles `while` y `for`, la comprobación es lo primero, por lo que es posible que el código nunca se ejecute.
-Let's rewrite our cat listing example again to use a `do...while` loop:
+Volvamos a escribir nuestro ejemplo de listado de gatos para usar un bucle de "do...while":
```js
-var i = 0;
+const cats = ["Pete", "Biggles", "Jasmine"];
+
+let myFavoriteCats = "Mis gatos se llaman ";
+
+let i = 0;
do {
if (i === cats.length - 1) {
- info += "and " + cats[i] + ".";
+ myFavoriteCats += `y ${cats[i]}.`;
} else {
- info += cats[i] + ", ";
+ myFavoriteCats += `${cats[i]}, `;
}
i++;
} while (i < cats.length);
+
+console.log(myFavoriteCats); // "Mis gatos se llaman Pete, Biggles y Jasmine."
```
-> **Nota:** Again, this works just the same as expected — have a look at it [running live on GitHub](http://mdn.github.io/learning-area/javascript/building-blocks/loops/do-while.html) (also view the [full source code](https://github.com/mdn/learning-area/blob/master/javascript/building-blocks/loops/do-while.html)).
+> **Nota:** De nuevo, esto funciona igual que lo esperado: échale un vistazo al [código fuente completo](https://mdn.github.io/learning-area/javascript/building-blocks/loops/do-while.html) (también puedes ver el [código fuente completo](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/loops/do-while.html)).
-> **Advertencia:** **Important**: With while and do...while — as with all loops — you must make sure that the initializer is iterated so that it eventually reaches the exit condition. If not, the loop will go on forever, and either the browser will force it to stop, or it will crash. This is called an **infinite loop**.
+> **Advertencia:** Con while y do...while, como con todos los bucles, debe asegurarse de que el inicializador se incremente o, según el caso, se disminuya, para que la condición finalmente se vuelva falsa.
+> Si no, el bucle continuará para siempre y el navegador lo obligará a detenerse o se bloqueará. Esto se llama un **bucle infinito**.
-## Active learning: Launch countdown!
+## Aprendizaje activo: iniciar cuenta regresiva
-In this exercise, we want you to print out a simple launch countdown to the output box, from 10 down to Blast off. Specifically, we want you to:
+En este ejercicio, queremos que imprima una cuenta regresiva de lanzamiento simple para la caja de salida, desde 10 hasta Blastoff.
+En concreto, queremos:
-- Loop from 10 down to 0. We've provided you with an initializer — `var i = 10;`.
-- For each iteration, create a new paragraph and append it to the output ``, which we've selected using `var output = document.querySelector('.output');`. In comments, we've provided you with three code lines that need to be used somewhere inside the loop:
+- Bucle de 10 a 0. Te hemos proporcionado un inicializador: `let i = 10;`.
+- Para cada iteración, cree un nuevo párrafo y añádalo a la salida `
`, que hemos seleccionado usando `const output = document.querySelector('.output');`.
+ En los comentarios, le proporcionamos tres líneas de código que deben usarse en algún lugar dentro del bucle:
- - `var para = document.createElement('p');` — creates a new paragraph.
- - `output.appendChild(para);` — appends the paragraph to the output `
`.
- - `para.textContent =` — makes the text inside the paragraph equal to whatever you put on the right hand side, after the equals sign.
+ - `const para = document.createElement('p');`: crea un nuevo párrafo.
+ - `output.appendChild(para);`: añade el párrafo a la salida `
`.
+ - `para.textContent =`: hace que el texto dentro del párrafo sea igual a lo que pongas en el lado derecho, después del signo igual.
-- Different iteration numbers require different text to be put in the paragraph for that iteration (you'll need a conditional statement and multiple `para.textContent =` lines):
+- Los diferentes números de iteración requieren que se coloque un texto diferente en el párrafo para esa iteración (necesitarás una instrucción condicional y varias líneas de `para.textContent =`):
- - If the number is 10, print "Countdown 10" to the paragraph.
- - If the number is 0, print "Blast off!" to the paragraph.
- - For any other number, print just the number to the paragraph.
+ - Si el número es 10, imprima "Cuenta regresiva 10" en el párrafo.
+ - Si el número es 0, imprima "Blast off!" en el párrafo.
+ - Para cualquier otro número, imprime solo el número en el párrafo.
-- Remember to include an iterator! However, in this example we are counting down after each iteration, not up, so you **don't** want `i++` — how do you iterate downwards?
+- ¡Recuerda incluir un iterador! Sin embargo, en este ejemplo estamos contando hacia atrás después de cada iteración, no hacia arriba, por lo que **no** quieres `i++`: ¿cómo iteras hacia abajo?
-If you make a mistake, you can always reset the example with the "Reset" button. If you get really stuck, press "Show solution" to see a solution.
+> **Nota:** Si comienza a escribir el bucle (por ejemplo, (while(i>=0)), es posible que el navegador se atasque porque aún no ha ingresado la condición final. Así que ten cuidado con esto. Puedes empezar a escribir tu código en un comentario para hacer frente a este problema y eliminar el comentario después de terminar.
-###### Active learning
+Si comete un error, siempre puede restablecer el ejemplo con el botón "Restablecer".
+Si te quedas realmente atascado, pulsa "Mostrar solución" para ver una solución.
-```html hidden
-
Live output
+```html oculto
+
Salida en vivo
-
Editable code
+
Código editable
- Press Esc to move focus away from the code area (Tab inserts a tab character).
+ Pulse Esc para alejar el foco del área de código (Tab inserta un carácter de
+ tabulación).
-var output = document.querySelector('.output');
+let output = document.querySelector('.output');
output.innerHTML = '';
-// var i = 10;
+// let i = 10;
-// var para = document.createElement('p');
+// const para = document.createElement('p');
// para.textContent = ;
// output.appendChild(para);
-
-
+
+
```
-```css hidden
+```css
html {
font-family: sans-serif;
}
@@ -516,11 +654,11 @@ body {
```
```js hidden
-var textarea = document.getElementById("code");
-var reset = document.getElementById("reset");
-var solution = document.getElementById("solution");
-var code = textarea.value;
-var userEntry = textarea.value;
+const textarea = document.getElementById("code");
+const reset = document.getElementById("reset");
+const solution = document.getElementById("solution");
+let code = textarea.value;
+let userEntry = textarea.value;
function updateCode() {
eval(textarea.value);
@@ -530,30 +668,48 @@ reset.addEventListener("click", function () {
textarea.value = code;
userEntry = textarea.value;
solutionEntry = jsSolution;
- solution.value = "Show solution";
+ solution.value = "Mostrar solución";
updateCode();
});
solution.addEventListener("click", function () {
- if (solution.value === "Show solution") {
+ if (solution.value === "Mostrar solución") {
textarea.value = solutionEntry;
- solution.value = "Hide solution";
+ solution.value = "Ocultar solución";
} else {
textarea.value = userEntry;
- solution.value = "Show solution";
+ solution.value = "Mostrar solución";
}
updateCode();
});
-var jsSolution =
- "var output = document.querySelector('.output');\noutput.innerHTML = '';\n\nvar i = 10;\n\nwhile(i >= 0) {\n var para = document.createElement('p');\n if(i === 10) {\n para.textContent = 'Countdown ' + i;\n } else if(i === 0) {\n para.textContent = 'Blast off!';\n } else {\n para.textContent = i;\n }\n\n output.appendChild(para);\n\n i--;\n}";
-var solutionEntry = jsSolution;
+let jsSolution = `const output = document.querySelector('.output');
+output.innerHTML = '';
+
+let i = 10;
+
+while (i >= 0) {
+ const para = document.createElement('p');
+ if (i === 10) {
+ paragraphtextContent = \`Cuenta atrás \${i}\`;
+ } else if (i === 0) {
+ para.textContent = 'Blast off!';
+ } else {
+ para.textContent = i;
+ }
+
+ output.appendChild(para);
+
+ i--;
+}`;
+
+let solutionEntry = jsSolution;
textarea.addEventListener("input", updateCode);
window.addEventListener("load", updateCode);
-// stop tab key tabbing out of textarea and
-// make it write a tab at the caret position instead
+// detener la tabulación de la tecla tabulación fuera del área de texto y
+// hacer que escriba una tabulación en la posición del cursor en su lugar
textarea.onkeydown = function (e) {
if (e.keyCode === 9) {
@@ -567,28 +723,28 @@ textarea.onkeydown = function (e) {
};
function insertAtCaret(text) {
- var scrollPos = textarea.scrollTop;
- var caretPos = textarea.selectionStart;
-
- var front = textarea.value.substring(0, caretPos);
- var back = textarea.value.substring(
+ const scrollPos = textarea.scrollTop;
+ let caretPos = textarea.selectionStart;
+ const front = textarea.value.substring(0, caretPos);
+ const back = textarea.value.substring(
textarea.selectionEnd,
textarea.value.length,
);
+
textarea.value = front + text + back;
- caretPos = caretPos + text.length;
+ caretPos += text.length;
textarea.selectionStart = caretPos;
textarea.selectionEnd = caretPos;
textarea.focus();
textarea.scrollTop = scrollPos;
}
-// Update the saved userCode every time the user updates the text area code
+// Actualizar el userCode guardado cada vez que el usuario actualice el código de área de texto
-textarea.onkeyup = function () {
- // We only want to save the state when the user code is being shown,
- // not the solution, so that solution is not saved over the user code
- if (solution.value === "Show solution") {
+textarea.onkeyup = () => {
+ // Solo queremos guardar el estado cuando se muestra el código de usuario,
+ // no la solución, para que la solución no se guarde sobre el código de usuario
+ if (solution.value === "Mostrar solución") {
userEntry = textarea.value;
} else {
solutionEntry = textarea.value;
@@ -598,50 +754,53 @@ textarea.onkeyup = function () {
};
```
-{{ EmbedLiveSample('Active_learning', '100%', 880, "", "", "hide-codepen-jsfiddle") }}
+{{ EmbedLiveSample('aprendizaje_activo_iniciar_cuenta_regresiva', '100%', 900) }}
-## Active learning: Filling in a guest list
+## Aprendizaje activo: rellenar una lista de invitados
-In this exercise, we want you to take a list of names stored in an array, and put them into a guest list. But it's not quite that easy — we don't want to let Phil and Lola in because they are greedy and rude, and always eat all the food! We have two lists, one for guests to admit, and one for guests to refuse.
+En este ejercicio, queremos que tomes una lista de nombres almacenados en un arreglo y los pongas en una lista de invitados. Pero no es tan fácil: ¡no queremos dejar entrar a Phil y Lola porque son codiciosos y groseros, y siempre comen toda la comida! Tenemos dos listas, una para que los huéspedes la admitan y otra para que los huéspedes la rechacen.
-Specifically, we want you to:
+En concreto, queremos:
-- Write a loop that will iterate from 0 to the length of the `people` array. You'll need to start with an initializer of `var i = 0;`, but what exit condition do you need?
-- During each loop iteration, check if the current array item is equal to "Phil" or "Lola" using a conditional statement:
+- Escribe un bucle que itere a través del arreglo `people`.
+- Durante cada iteración de bucle, compruebe si el elemento del arreglo actual es igual a "Phil" o "Lola" utilizando una instrucción condicional:
- - If it is, concatenate the array item to the end of the `refused` paragraph's `textContent`, followed by a comma and a space.
- - If it isn't, concatenate the array item to the end of the `admitted` paragraph's `textContent`, followed by a comma and a space.
+ - Si es así, concatene el elemento del arreglo al final de `textContent` del párrafo `refused`, seguido de una coma y un espacio.
+ - Si no es así, concatene el elemento del arreglo hasta el final del `textContent` del párrafo `admitted`, seguido de una coma y un espacio.
-We've already provided you with:
+Ya te hemos proporcionado:
-- `var i = 0;` — Your initializer.
-- `refused.textContent +=` — the beginnings of a line that will concatenate something on to the end of `refused.textContent`.
-- `admitted.textContent +=` — the beginnings of a line that will concatenate something on to the end of `admitted.textContent`.
+- `refused.textContent +=`: los inicios de una línea que concatenará algo al final de `refused.textContent`.
+- `admitted.textContent +=`; los inicios de una línea que concatenará algo al final de `admitted.textContent`.
-Extra bonus question — after completing the above tasks successfully, you will be left with two lists of names, separated by commas, but they will be untidy — there will be a comma at the end of each one. Can you work out how to write lines that slice the last comma off in each case, and add a full stop to the end? Have a look at the [Useful string methods](/es/docs/Learn/JavaScript/First_steps/Useful_string_methods) article for help.
+Pregunta de bonificación adicional: después de completar las tareas anteriores con éxito, te quedarán dos listas de nombres, separadas por comas, pero estarán desordenadas: habrá una coma al final de cada una.
+¿Puedes averiguar cómo escribir líneas que corten la última coma en cada caso y añadir un punto al final?
+Consulta el artículo [Métodos de cadenas útiles](/es/docs/Learn/JavaScript/First_steps/Useful_string_methods) para obtener ayuda.
-If you make a mistake, you can always reset the example with the "Reset" button. If you get really stuck, press "Show solution" to see a solution.
+Si comete un error, siempre puede restablecer el ejemplo con el botón "Restablecer".
+Si te quedas realmente atascado, pulsa "Mostrar solución" para ver una solución.
-```html hidden
-
Live output
+```html oculto
+
Salida en vivo
-
Admit:
-
Refuse:
+
Admitir:
+
Rechazar:
-
Editable code
+
Código editable
- Press Esc to move focus away from the code area (Tab inserts a tab character).
+ Pulse Esc para alejar el foco del área de código (Tab inserta un carácter de
+ tabulación).
-var people = ['Chris', 'Anne', 'Colin', 'Terri', 'Phil', 'Lola', 'Sam', 'Kay', 'Bruce'];
+const people = ['Chris', 'Anne', 'Colin', 'Terri', 'Phil', 'Lola', 'Sam', 'Kay', 'Bruce'];
-var admitted = document.querySelector('.admitted');
-var refused = document.querySelector('.refused');
-admitted.textContent = 'Admit: ';
-refused.textContent = 'Refuse: '
+const admitted = document.querySelector('.admitted');
+const refused = document.querySelector('.refused');
+admitted.textContent = 'Admitir: ';
+refused.textContent = 'Rechazar: ';
-// var i = 0;
+// El bucle comienza aquí
// refused.textContent += ;
// admitted.textContent += ;
@@ -649,8 +808,8 @@ refused.textContent = 'Refuse: '
-
-
+
+
```
@@ -677,11 +836,11 @@ body {
```
```js hidden
-var textarea = document.getElementById("code");
-var reset = document.getElementById("reset");
-var solution = document.getElementById("solution");
-var code = textarea.value;
-var userEntry = textarea.value;
+const textarea = document.getElementById("code");
+const reset = document.getElementById("reset");
+const solution = document.getElementById("solution");
+let code = textarea.value;
+let userEntry = textarea.value;
function updateCode() {
eval(textarea.value);
@@ -691,30 +850,48 @@ reset.addEventListener("click", function () {
textarea.value = code;
userEntry = textarea.value;
solutionEntry = jsSolution;
- solution.value = "Show solution";
+ solution.value = "Mostrar solución";
updateCode();
});
solution.addEventListener("click", function () {
- if (solution.value === "Show solution") {
+ if (solution.value === "Mostrar solución") {
textarea.value = solutionEntry;
- solution.value = "Hide solution";
+ solution.value = "Ocultar solución";
} else {
textarea.value = userEntry;
- solution.value = "Show solution";
+ solution.value = "Mostrar solución";
}
updateCode();
});
-var jsSolution =
- "var people = ['Chris', 'Anne', 'Colin', 'Terri', 'Phil', 'Lola', 'Sam', 'Kay', 'Bruce'];\n\nvar admitted = document.querySelector('.admitted');\nvar refused = document.querySelector('.refused');\n\nadmitted.textContent = 'Admit: ';\nrefused.textContent = 'Refuse: '\nvar i = 0;\n\ndo {\n if(people[i] === 'Phil' || people[i] === 'Lola') {\n refused.textContent += people[i] + ', ';\n } else {\n admitted.textContent += people[i] + ', ';\n }\n i++;\n} while(i < people.length);\n\nrefused.textContent = refused.textContent.slice(0,refused.textContent.length-2) + '.';\nadmitted.textContent = admitted.textContent.slice(0,admitted.textContent.length-2) + '.';";
-var solutionEntry = jsSolution;
+const jsSolution = `
+const people = ['Chris', 'Anne', 'Colin', 'Terri', 'Phil', 'Lola', 'Sam', 'Kay', 'Bruce'];
+
+const admitted = document.querySelector('.admitted');
+const refused = document.querySelector('.refused');
+
+admitted.textContent = 'Admitir: ';
+refused.textContent = 'Rechazar: ';
+
+for (const person of people) {
+ if (person === 'Phil' || person === 'Lola') {
+ refused.textContent += \`\${person}, \`;
+ } else {
+ admitted.textContent += \`\${person}, \`;
+ }
+}
+
+refused.textContent = refused.textContent.slice(0,refused.textContent.length-2) + '.';
+admitted.textContent = admitted.textContent.slice(0,admitted.textContent.length-2) + '.';`;
+
+let solutionEntry = jsSolution;
textarea.addEventListener("input", updateCode);
window.addEventListener("load", updateCode);
-// stop tab key tabbing out of textarea and
-// make it write a tab at the caret position instead
+// detener la tabulación de la tecla tabulación fuera del área de texto y
+// hacer que escriba una tabulación en la posición del cursor en su lugar
textarea.onkeydown = function (e) {
if (e.keyCode === 9) {
@@ -728,28 +905,28 @@ textarea.onkeydown = function (e) {
};
function insertAtCaret(text) {
- var scrollPos = textarea.scrollTop;
- var caretPos = textarea.selectionStart;
-
- var front = textarea.value.substring(0, caretPos);
- var back = textarea.value.substring(
+ const scrollPos = textarea.scrollTop;
+ let caretPos = textarea.selectionStart;
+ const front = textarea.value.substring(0, caretPos);
+ const back = textarea.value.substring(
textarea.selectionEnd,
textarea.value.length,
);
+
textarea.value = front + text + back;
- caretPos = caretPos + text.length;
+ caretPos += text.length;
textarea.selectionStart = caretPos;
textarea.selectionEnd = caretPos;
textarea.focus();
textarea.scrollTop = scrollPos;
}
-// Update the saved userCode every time the user updates the text area code
+// Actualizar el userCode guardado cada vez que el usuario actualice el código de área de texto
-textarea.onkeyup = function () {
- // We only want to save the state when the user code is being shown,
- // not the solution, so that solution is not saved over the user code
- if (solution.value === "Show solution") {
+textarea.onkeyup = () => {
+ // Solo queremos guardar el estado cuando se muestra el código de usuario,
+ // no la solución, para que la solución no se guarde sobre el código de usuario
+ if (solution.value === "Mostrar solución") {
userEntry = textarea.value;
} else {
solutionEntry = textarea.value;
@@ -759,58 +936,75 @@ textarea.onkeyup = function () {
};
```
-{{ EmbedLiveSample('Active_learning_2', '100%', 680, "", "", "hide-codepen-jsfiddle") }}
+{{ EmbedLiveSample('aprendizaje_activo_rellenar_una_lista_de_invitados', '100%', 680) }}
+
+## ¿Qué tipo de bucle debes usar?
+
+Si está iterando a través de un arreglo o algún otro objeto que lo admita, y no necesita acceder a la posición de índice de cada elemento, entonces `for...of` es la mejor opción. Es más fácil de leer y hay menos para equivocarse.
-## Which loop type should you use?
+Para otros usos, los bucles `for`, `while` y `do...while` son en gran medida intercambiables.
+Todos se pueden usar para resolver los mismos problemas, y cuál uses dependerá en gran medida de tus preferencias personales: cuál te resulta más fácil de recordar o más intuitivo.
+Recomendaríamos `for`, al menos para empezar, ya que es probablemente el más fácil para recordar todo: el inicializador, la condición y la expresión final tienen que ir perfectamente entre paréntesis, por lo que es fácil ver dónde están y comprobar que no te los estás perdiendo.
-For basic uses, `for`, `while`, and `do...while` loops are largely interchangeable. They can all be used to solve the same problems, and which one you use will largely depend on your personal preference — which one you find easiest to remember or most intuitive. Let's have a look at them again.
+Echémosles un vistazo a todos de nuevo.
-First `for`:
+Primero `for...of`:
+```js-nolint
+for (const elemento of arreglo) {
+ // código a ejecutar
+}
```
-for (initializer; exit-condition; final-expression) {
- // code to run
+
+`for`:
+
+```js-nolint
+for (inicializador; condición; expresión-final) {
+ // código a ejecutar
}
```
`while`:
-```
-initializer
-while (exit-condition) {
- // code to run
+```js-nolint
+inicializador
+while(condición) {
+ // código a ejecutar
- final-expression
+ expresión-final
}
```
-and finally `do...while`:
+y finalmente `do...while`:
-```
-initializer
+```js-nolint
+inicializador
do {
- // code to run
+ // código a ejecutar
- final-expression
-} while (exit-condition)
+ expresión-final
+} while (condición)
```
-We would recommend `for`, at least to begin with, as it is probably the easiest for remembering everything — the initializer, exit-condition, and final-expression all have to go neatly into the parentheses, so it is easy to see where they are and check that you aren't missing them.
+> **Nota:** También hay otros tipos/características de bucle, que son útiles en situaciones avanzadas/especializadas y más allá del alcance de este artículo. Si quieres ir más allá con tu aprendizaje en bucle, lee nuestra [Guía de bucles e iteraciones](/es/docs/Web/JavaScript/Guide/Loops_and_iteration) avanzada.
+
+## Pon a prueba tus habilidades
-> **Nota:** There are other loop types/features too, which are useful in advanced/specialized situations and beyond the scope of this article. If you want to go further with your loop learning, read our advanced [Loops and iteration guide](/es/docs/Web/JavaScript/Guide/Loops_and_iteration).
+Has llegado al final de este artículo, pero ¿puedes recordar la información más importante? Puedes encontrar algunas pruebas adicionales para verificar que has conservado esta información antes de continuar. Consulta [Pon a prueba tus habilidades: bucles](/es/docs/Learn/JavaScript/Building_blocks/Test_your_skills:_Loops).
-## Conclusion
+## Conclusión
-This article has revealed to you the basic concepts behind, and different options available when, looping code in JavaScript. You should now be clear on why loops are a good mechanism for dealing with repetitive code, and be raring to use them in your own examples!
+Este artículo te ha revelado los conceptos básicos que hay detrás y las diferentes opciones disponibles al hacer bucles de código en JavaScript.
+¡Ahora deberías tener claro por qué los bucles son un buen mecanismo para lidiar con el código repetitivo y tener ganas de usarlos en tus propios ejemplos!
-If there is anything you didn't understand, feel free to read through the article again, or [contact us](/es/Learn#Contact_us) to ask for help.
+Si hay algo que no entendiste, vuelve a leer el artículo o [ponte en contacto con nosotros](/es/docs/Learn#contact_us) para pedir ayuda.
-## See also
+## Vease también
-- [Loops and iteration in detail](/es/docs/Web/JavaScript/Guide/Loops_and_iteration)
-- [for statement reference](/es/docs/Web/JavaScript/Reference/Statements/for)
-- [while](/es/docs/Web/JavaScript/Reference/Statements/while) and [do...while](/es/docs/Web/JavaScript/Reference/Statements/do...while) references
-- [break](/es/docs/Web/JavaScript/Reference/Statements/break) and [continue](/es/docs/Web/JavaScript/Reference/Statements/continue) references
-- [What's the Best Way to Write a JavaScript For Loop?](https://www.impressivewebs.com/javascript-for-loop/) — some advanced loop best practices
+- [Bucles e iteración en detalle](/es/docs/Web/JavaScript/Guide/Loops_and_iteration)
+- [for...of referencia](/es/docs/Web/JavaScript/Reference/Statements/for...of)
+- [Referencia de la declaración for](/es/docs/Web/JavaScript/Reference/Statements/for)
+- Referencias de [while](/es/docs/Web/JavaScript/Reference/Statements/while) y [do...while](/es/docs/Web/JavaScript/Reference/Statements/do...while)
+- Referencias de [break](/es/docs/Web/JavaScript/Reference/Statements/break) y [continue](/es/docs/Web/JavaScript/Reference/Statements/continue)
{{PreviousMenuNext("Learn/JavaScript/Building_blocks/conditionals","Learn/JavaScript/Building_blocks/Functions", "Learn/JavaScript/Building_blocks")}}
From cbcbd24c85ab4ee5a3ed82860488abf83db82fb0 Mon Sep 17 00:00:00 2001
From: Leonid Vinogradov
Date: Fri, 27 Oct 2023 21:57:41 +0300
Subject: [PATCH 061/126] chore(gitignore): add .vscode (#16732)
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index bf14aa8a6b5866..c8e645ae63bbdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
_githistory.json
.DS_Store
.idea
+.vscode
mdn/content
yarn-debug.log*
yarn-error.log*
From 808d3f4acb736b0cdcece5f28522b13c2c3d09ba Mon Sep 17 00:00:00 2001
From: gkswngh05 <49218038+gkswngh05@users.noreply.github.com>
Date: Sat, 28 Oct 2023 13:52:57 +0900
Subject: [PATCH 062/126] =?UTF-8?q?[ko]=20HTTP=20413,=20422=20=EC=9D=91?=
=?UTF-8?q?=EB=8B=B5=20=EC=BD=94=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B0=8F?=
=?UTF-8?q?=20=EB=B3=B8=EB=AC=B8=20=EC=88=98=EC=A0=95=20(#16599)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 422 응답 코드 이름 수정
* 413 상태 코드 이름 수정
* Update index.md
* Update index.md
* 413 3차 수정
* 413.md: 제안 반영 및 오타 수정
---
files/ko/web/http/status/413/index.md | 22 +++++++++++++---------
files/ko/web/http/status/422/index.md | 12 +++++++-----
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/files/ko/web/http/status/413/index.md b/files/ko/web/http/status/413/index.md
index bf11daf1310410..b4f084df14c08b 100644
--- a/files/ko/web/http/status/413/index.md
+++ b/files/ko/web/http/status/413/index.md
@@ -1,23 +1,27 @@
---
-title: 413 Payload Too Large
+title: 413 Content Too Large
slug: Web/HTTP/Status/413
+l10n:
+ sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c
---
-{{HTTPSidebar}}HTTP 413 Payload Too Large 응답 상태 코드는 요청 엔터티가 서버에 의해 정의된 제한보다 크다는 것을 나타낸다. 서버가 연결을 닫거나 헤더 필드({{HTTPHeader("Retry-After")}})를 반환할 수 있다.
+{{HTTPSidebar}}
+
+HTTP **`413 Content Too Large`** 응답 상태 코드는 요청 엔터티가 서버에 의해 정의된 제한보다 크다는 것을 나타냅니다. 서버는 연결을 닫거나 {{HTTPHeader("Retry-After")}} 헤더 필드를 반환할 수 있습니다.
+
+RFC 9110 이전에는 이 상태 코드 이름이 **`Payload Too Large`** 였습니다. 이 이름은 아직도 널리 사용되고 있습니다.
## 상태
-```
-413 Payload Too Large
+```http
+413 Content Too Large
```
-## 정의
+## 명세서
-| 정의 | 제목 |
-| --------------------------------------------------- | ------------------------------------------------------------- |
-| {{RFC("7231", "413 Payload Too Large" , "6.5.11")}} | Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content |
+{{Specifications}}
-## 참조
+## 같이 보기
- {{HTTPHeader("Connection")}}
- {{HTTPHeader("Retry-After")}}
diff --git a/files/ko/web/http/status/422/index.md b/files/ko/web/http/status/422/index.md
index 35a24ee49fc12d..dd654115ac4a94 100644
--- a/files/ko/web/http/status/422/index.md
+++ b/files/ko/web/http/status/422/index.md
@@ -1,18 +1,20 @@
---
-title: 422 Unprocessable Entity
+title: 422 Unprocessable Content
slug: Web/HTTP/Status/422
+l10n:
+ sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c
---
{{HTTPSidebar}}
-이 응답은 서버가 요청을 이해하고 요청 문법도 올바르지만 요청된 지시를 따를 수 없음을 나타냅니다.
+하이퍼텍스트 전송 프로토콜(HTTP) **`422 Unprocessable Content`** 응답 상태 코드는 서버가 요청 엔티티의 컨텐츠 형식을 이해했고 요청 엔티티의 문법도 올바르지만 요청된 지시를 처리할 수 없음을 나타냅니다.
-> **경고:** **중요**: 클라이언트는 요청을 수정하지 않고 동일한 형태로 다시 보내서는 안됩니다.
+> **경고:** 클라이언트는 요청을 수정하지 않고 동일한 형태로 다시 보내서는 안됩니다.
## 상태
-```
-422 Unprocessable Entity
+```http
+422 Unprocessable Content
```
## 명세서
From f5ba6cc08237507188754970c96e2d9694f8dd44 Mon Sep 17 00:00:00 2001
From: Sijin <39406271+skd6150@users.noreply.github.com>
Date: Sat, 28 Oct 2023 16:14:25 +0900
Subject: [PATCH 063/126] [ko] update index.md for
`/web/css/css_positioned_layout/understanding_z-index/stacking_context`
(#16643)
* Update stacking context formation scenario on description section
* Remove original document information
* Translate links to related page in the see also section into Korean
* Correct discrepancies compared to the original text
* Change some sentences to honorifics
---------
Co-authored-by: Yeji Choi <61399588+yechoi42@users.noreply.github.com>
---
.../stacking_context/index.md | 74 +++++++++----------
1 file changed, 36 insertions(+), 38 deletions(-)
diff --git a/files/ko/web/css/css_positioned_layout/understanding_z-index/stacking_context/index.md b/files/ko/web/css/css_positioned_layout/understanding_z-index/stacking_context/index.md
index 5ee163c800099c..ed2a2396591d01 100644
--- a/files/ko/web/css/css_positioned_layout/understanding_z-index/stacking_context/index.md
+++ b/files/ko/web/css/css_positioned_layout/understanding_z-index/stacking_context/index.md
@@ -1,37 +1,41 @@
---
title: 쌓임 맥락
slug: Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context
+l10n:
+ sourceCommit: 9a06522ff323403f707ddad2cb45e27b53cee41e
---
{{CSSRef}}
**쌓임 맥락**(stacking context)은 가상의 Z축을 사용한 HTML 요소의 3차원 개념화입니다. Z축은 사용자 기준이며, 사용자는 뷰포트 혹은 웹페이지를 바라보고 있을 것으로 가정합니다. 각각의 HTML 요소는 자신의 속성에 따른 우선순위를 사용해 3차원 공간을 차지합니다.
-## 쌓임 맥락
+## 설명
-이전 글 [z-index 사용하기](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Adding_z-index)에서 보았듯, 특정 요소의 렌더링 순서는 자신의 `z-index` 속성 값에 영향을 받습니다. 이는 그 요소들이 가진 특별한 속성으로 인해 **쌓임 맥락**이 생성되기 때문입니다.
+이전 글 [z-index 사용하기](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Using_z-index)에서 보았듯, 특정 요소의 렌더링 순서는 자신의 `z-index` 속성 값에 영향을 받습니다. 이는 그 요소들이 가진 특별한 속성으로 인해 **쌓임 맥락**이 생성되기 때문입니다.
쌓임 맥락은, 문서 어디에서나, 다음 조건을 만족하는 요소가 생성합니다.
- 문서의 루트 요소. (``)
- {{cssxref("position")}}이 `absolute` 또는 `relative`이고, {{cssxref("z-index")}}가 `auto`가 아닌 요소.
- {{cssxref("position")}}이 `fixed` 또는 `sticky`인 요소. (`sticky`는 모든 모바일 브라우저에서는 해당하지만 구형 데스크톱 브라우저에서는 해당하지 않음)
+- [container queries](/ko/docs/Web/CSS/CSS_container_queries)를 위한 {{cssxref("container-type")}}이 `size` 또는 `inline-size`인 요소.
- 플렉스({{cssxref("flexbox")}}) 컨테이너의 자식 중 {{cssxref("z-index")}}가 `auto`가 아닌 요소.
- 그리드({{cssxref("grid")}}) 컨테이너의 자식 중 {{cssxref("z-index")}}가 `auto`가 아닌 요소.
-- {{cssxref("opacity")}}가 1보다 작은 요소. ([불투명도 명세](http://www.w3.org/TR/css3-color/#transparency) 참고)
+- {{cssxref("opacity")}}가 1보다 작은 요소. ([불투명도 명세](https://www.w3.org/TR/css3-color/#transparency) 참고)
- {{cssxref("mix-blend-mode")}}가 `normal`이 아닌 요소.
- 다음 속성 중 하나라도 `none`이 아닌 값을 가진 요소.
- {{cssxref("transform")}}
- {{cssxref("filter")}}
+ - {{cssxref("backdrop-filter")}}
- {{cssxref("perspective")}}
- {{cssxref("clip-path")}}
- {{cssxref("mask")}} / {{cssxref("mask-image")}} / {{cssxref("mask-border")}}
- {{cssxref("isolation")}}이 `isolate`인 요소.
-- {{cssxref("-webkit-overflow-scrolling")}}이 `touch`인 요소.
- {{cssxref("will-change")}}의 값으로, 초깃값이 아닐 때 새로운 쌓임 맥락을 생성하는 속성을 지정한 요소.
- {{cssxref("contain")}}이 `layout`, `paint`, 또는 둘 중 하나를 포함하는 값(`strict`, `content` 등)인 요소.
+- [top layer](/ko/docs/Glossary/Top_layer)에 배치된 요소와 이에 상응하는 {{cssxref("::backdrop")}}. [fullscreen](/ko/docs/Web/API/Fullscreen_API) 및 [popover](/ko/docs/Web/API/Popover_API) 요소들을 예로 들 수 있습니다.
쌓임 맥락 안의 자식 요소는 이전에 설명했던 규칙을 동일하게 사용해 쌓입니다. 중요한 것은, 자식의 `z-index` 값은 부모에게만 의미가 있다는 점입니다. 하나의 쌓임 맥락은 부모 쌓임 맥락 안에서 통째로 하나의 단위로 간주됩니다.
@@ -43,7 +47,7 @@ slug: Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context
> **참고:** 모든 요소가 쌓임 맥락을 생성하는 건 아니므로, 쌓임 맥락의 계층 구조는 HTML 요소 계층 구조의 부분집합입니다. 자신의 쌓임 맥락을 만들지 않은 요소는 '부모 쌓임 맥락에 의해 **동화된다**'라고 표현할 수 있겠습니다.
-## 예시
+## 예제
![Example of stacking rules modified using z-index](understanding_zindex_04.png)
@@ -59,27 +63,26 @@ slug: Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context
- DIV #5
- DIV #6
-DIV #4, DIV #5, DIV #6은 DIV #3의 자식이므로, DIV #3 내부에서만 셋의 쌓임을 처리했다는 것을 이해하는게 중요합니다. DIV #3 내부의 요소의 쌓기와 렌더링이 끝난 후에는, 전체 DIV #3을 루트 요소의 쌓임 맥락 하에서 형제 DIV와 쌓습니다.
-
-> **참고:**
->
-> - DIV #4는 DIV #1보다 z-index 속성 값이 더 크지만 DIV #1보다 아래에 렌더링 되었다. 왜냐하면 DIV #1의 z-index 속성 값인 5는 뿌리 엘리먼트의 쌓임 맥락 안에서 유효하나 DIV #4의 z-index 속성 값인 6은 DIV #3의 쌓임 맥락 안에서만 유효하기 때문이다. DIV #4는 자신이 속하는 DIV #3의 z-index 속성 값이 4이므로 DIV #1 아래에 쌓였다.
-> - 같은 이유로 DIV #2는 DIV #5 아래에 렌더링 되었다. DIV #5는 DIV #2보다 z-index 값이 작지만 뿌리 엘리먼트의 쌓임 맥락안에서 유효한 DIV #5가 속한 DIV #3의 z-index 값이 DIV #2의 z-index 값 보다 더 크기 때문이다.
-> - DIV #3의 z-index 속성 값인 4는 DIV #4, DIV #5, DIV #6의 z-index 속성값과 독립적이다. 왜냐하면 다른 쌓임 맥락에 속해있기 때문이다.
-> - 렌더링 순서를 이해하는 쉬운 방법은 z-index를 "버전 번호" 처럼 생각하는 것이다. 자식 엘리먼트는 부모 엘리먼트 버전 번호의 마이너 버전이다. 이 방법은 왜 z-index가 1인 DIV #5가 z-index가 2인 DIV #2 위에 쌓였는지, z-index가 6인 DIV #4가 z-index가 5인 DIV #1 아래에 쌓였는지 이해하게 해준다. 우리 예제에서는
->
-> - 뿌리 엘리먼트
->
-> - DIV #2 - z-index가 2
-> - DIV #3 - z-index가 4
->
-> - DIV #5 - z-index가 1인데 z-index가 4인 엘리먼트 아래에서 쌓였으므로 렌더링 순서는 4.1이다.
-> - DIV #6 - z-index가 3인데 z-index가 4인 엘리먼트 아래에서 쌓였으므로 렌더링 순서는 4.3이다.
-> - DIV #4 - z-index가 6인데 z-index가 4인 엘리먼트 아래에서 쌓였으므로 렌더링 순서는 4.6이다.
->
-> - DIV #1 - z-index가 5
+DIV #4, DIV #5, DIV #6은 DIV #3의 자식이므로, DIV #3 내부에서만 셋의 쌓임을 처리했다는 것을 이해하는 게 중요합니다. DIV #3 내부의 요소의 쌓기와 렌더링이 끝난 후에는, 전체 DIV #3을 루트 요소의 쌓임 맥락 아래에서 형제 DIV와 쌓습니다.
+
+DIV #4는 DIV #1보다 z-index 속성값이 더 크지만, DIV #1보다 아래에 렌더링 되었습니다. 왜냐하면 DIV #1의 z-index 속성값인 5는 루트 요소의 쌓임 맥락 안에서 유효하나 DIV #4의 z-index 속성값인 6은 DIV #3의 쌓임 맥락 안에서만 유효하기 때문입니다. 그러므로, DIV #4는 더 낮은 z-index 속성값을 갖는 DIV #3에 속하게 되어 DIV #1 아래에 위치합니다.
+
+같은 이유로 DIV #2 (`z-index`: 2)는 DIV #5 (`z-index`: 1) 아래에 렌더링 되었습니다. DIV #5가 그보다 더 큰 z-index 속성값을 갖는 DIV #3에 속해있기 때문입니다.
+
+DIV #3의 z-index 속성값인 4는 DIV #4, DIV #5, DIV #6의 z-index 속성값과 독립적입니다. 왜냐하면 다른 쌓임 맥락에 속해있기 때문입니다.
+
+Z축 상에 쌓인 요소들의 렌더링 순서를 이해하는 쉬운 방법은 z-index를 "버전 번호" 처럼 생각하는 것입니다. 자식 요소는 부모 요소의 메이저 버전 번호 아래 마이너 버전 번호를 갖습니다. 이 방법은 왜 z-index가 1인 DIV #5가 z-index가 2인 DIV #2위에 쌓였는지, z-index가 6인 DIV #4가 z-index가 5인 DIV #1 아래에 쌓였는지 이해하기 쉽도록 만들어줍니다.
+
+우리 예제는 다음과 같습니다. (최종 렌더링 순서에 따라 정렬됨)
+
+- 루트
+ - DIV #2: (`z-index`: 2)
+ - DIV #3: (`z-index`: 4)
+ - DIV #5: (`z-index`: 1), (`z-index`: 4)인 요소 아래에서 쌓였으므로 렌더링 순서는 4.1입니다.
+ - DIV #6: (`z-index`: 3), (`z-index`: 4)인 요소 아래에서 쌓였으므로 렌더링 순서는 4.3입니다.
+ - DIV #4: (`z-index`: 6), (`z-index`: 4)인 요소 아래에서 쌓였으므로 렌더링 순서는 4.6입니다.
+ - DIV #1: (`z-index`: 5)
-## 예제
### HTML
@@ -206,21 +209,16 @@ h1 {
}
```
-### 결과
+## 결과
{{ EmbedLiveSample('예제', '100%', '396') }}
## 같이 보기
-- [Stacking without the z-index property](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_without_z-index): The stacking rules that apply when `z-index` is not used.
-- [Stacking with floated blocks](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_and_float): How floating elements are handled with stacking.
-- [Using z-index](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Adding_z-index): How to use `z-index` to change default stacking.
-- [Stacking context example 1](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_context_example_1): 2-level HTML hierarchy, `z-index` on the last level
-- [Stacking context example 2](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_context_example_2): 2-level HTML hierarchy, `z-index` on all levels
-- [Stacking context example 3](/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/Stacking_context_example_3): 3-level HTML hierarchy, `z-index` on the second level
-
-## Original Document Information
-
-- Author(s): Paolo Lombardi
-- This article is the English translation of an article I wrote in Italian for [YappY](http://www.yappy.it). I grant the right to share all the content under the [Creative Commons: Attribution-Sharealike license](http://creativecommons.org/licenses/by-sa/2.0/).
-- Last Updated Date: July 9, 2005
+- [z-index가 없는 경우의 쌓임](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_without_z-index) : 기본 쌓임 규칙
+- [floating 엘리먼트의 쌓임](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_floating_elements) : floating 엘리먼트들은 어떻게 다루어지는가
+- [z-index 적용](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Using_z-index) : 기본 쌓임 순서를 변경하기 위해 z-index 사용하기
+- [쌓임 맥락 예제1](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context_example_1) : 2레벨 HTML 계층구조, 마지막 레벨에서 z-index가 지정된 경우
+- [쌓임 맥락 예제2](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context_example_2) : 2레벨 HTML 계층구조, 모든 레벨에서 z-index가 지정된 경우
+- [쌓임 맥락 예제3](/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context_example_3) : 3레벨 HTML 계층구조, 두번째 레벨에서 z-index가 지정된 경우
+- [Top layer](/ko/docs/Glossary/Top_layer)
From 320b20dd797a7928bed4e83645d621c05998671f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EA=B9=80=EC=A7=84=EB=B2=94?=
<59330110+jinbekim@users.noreply.github.com>
Date: Sat, 28 Oct 2023 16:16:18 +0900
Subject: [PATCH 064/126] files/ko/web/api/history/replacestate/index.md
(#16692)
Update index.md
---
files/ko/web/api/history/replacestate/index.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/files/ko/web/api/history/replacestate/index.md b/files/ko/web/api/history/replacestate/index.md
index cbdf37e1d1cb29..bed07df159846a 100644
--- a/files/ko/web/api/history/replacestate/index.md
+++ b/files/ko/web/api/history/replacestate/index.md
@@ -7,6 +7,8 @@ slug: Web/API/History/replaceState
**`History.replaceState()`** 메서드는 현재 history를 수정해 메소드의 매개 변수에 전달 된 `stateObj`, `title`, `URL`로 대체합니다. 이 방법은 특히 일부 유저의 동작에 대한 응답으로 history 객체의 상태나 현재 history의 URL을 업데이트하려는 경우에 유용합니다.
+이 메서드는 {{glossary("asynchronous", "비동기")}}로 동작합니다. 네비게이션이 언제 완료되었는지 결정하기 위해 {{domxref("Window/popstate_event", "popstate")}} 이벤트에 대한 수신기를 추가합니다. 이때 `state` 매개변수를 사용할 수 있습니다.
+
## 구문
```js
From 4e2b16ae76bc548779131c9150b9468c07217757 Mon Sep 17 00:00:00 2001
From: SphinxKnight
Date: Sat, 28 Oct 2023 10:18:45 +0200
Subject: [PATCH 065/126] Initial translation for
Web/Progressive_web_apps/Tutorials/CycleTracker/Service_workers (#16681)
Initial translation
---
.../cycletracker/service_workers/edge_sw.jpg | Bin 0 -> 88666 bytes
.../service_workers/firefox_sw.jpg | Bin 0 -> 40541 bytes
.../cycletracker/service_workers/index.md | 403 ++++++++++++++++++
3 files changed, 403 insertions(+)
create mode 100644 files/fr/web/progressive_web_apps/tutorials/cycletracker/service_workers/edge_sw.jpg
create mode 100644 files/fr/web/progressive_web_apps/tutorials/cycletracker/service_workers/firefox_sw.jpg
create mode 100644 files/fr/web/progressive_web_apps/tutorials/cycletracker/service_workers/index.md
diff --git a/files/fr/web/progressive_web_apps/tutorials/cycletracker/service_workers/edge_sw.jpg b/files/fr/web/progressive_web_apps/tutorials/cycletracker/service_workers/edge_sw.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a2a00575fc5f6e298dbb402b52d893e699c13c74
GIT binary patch
literal 88666
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