<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>홍싸리</title>
        <link>https://velog.io/</link>
        <description>그럴싸한건 다 따라해보는 프론트엔드 개발자 준비중인 6년차 퍼블리셔</description>
        <lastBuildDate>Thu, 15 Feb 2024 01:09:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>홍싸리</title>
            <url>https://velog.velcdn.com/images/ssarr_i/profile/d2b48b11-0d22-481b-a3f6-c26ab6521ac9/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 홍싸리. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ssarr_i" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[java] 국영수 점수 구하기]]></title>
            <link>https://velog.io/@ssarr_i/java-%EA%B5%AD%EC%98%81%EC%88%98-%EC%A0%90%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ssarr_i/java-%EA%B5%AD%EC%98%81%EC%88%98-%EC%A0%90%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 15 Feb 2024 01:09:27 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">//        사용자에게 국영수 점수를 입력 받아 총점과 평균을 구한다. 평균(실수)
//        등급:
//        90점 이상 : &#39;A&#39;
//        80점 이상 : &#39;B&#39;        
//        70점 이상 : &#39;C&#39;
//        60점 이상 : &#39;D&#39;
//        나머지는 : &#39;F&#39;

//        출력 예시
//        총점: 270점
//        평균 : 90.00점
//        등급 : A

        int kor = 0, eng = 0, math = 0, sum = 0;
        double avg = 0.0;
        char grade = &#39; &#39;;

        Scanner sc = new Scanner(System.in);
        System.out.println(&quot;엔터를 기준으로 국영수 점수를 순서대로 기입하세요.&quot;);
        kor = sc.nextInt();
        eng = sc.nextInt();
        math = sc.nextInt();
        sum = kor + eng + math;
        avg = sum / 3.0;

        if(avg &gt;= 90) {
            grade = &#39;A&#39;;
        }else if(avg &gt;= 80) {
            grade = &#39;B&#39;;
        }else if(avg &gt;= 70) {
            grade = &#39;C&#39;;
        }else if(avg &gt;= 60) {
            grade = &#39;D&#39;;
        }else {
            grade = &#39;F&#39;;
        }

        System.out.printf(&quot;총점: %d점\n평균: %.2f점\n등급: %c&quot;, sum, avg, grade);    </code></pre>
<p>자바스크립트를 이미 어느 정도 알고 있어서 처음 문제를 들었을 때 어떻게 짜야할지는 바로 생각이 나서 다행이었다.
근데 문제는.. 내가 printf나 println, print가 아직 익숙하지 않고
특히 printf 안의 <code>%c</code>, <code>%d</code>, <code>%.2f</code>와 같은 표기가 낯설다는 것인듯..</p>
<p>얼른 미묘하게 헷갈리는 내용들을 티스토리 블로그에 정리해야겠다 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[console에서 undefined가 나오는 이유 ]]></title>
            <link>https://velog.io/@ssarr_i/001console.log%EB%A1%9C-%EA%B0%92%EC%9D%84-%EB%9D%84%EC%9B%A0%EC%9D%84-%EB%95%8C-%EC%97%B0%EB%8B%AC%EC%95%84-undefined%EA%B0%80-%EB%82%98%EC%98%A4%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@ssarr_i/001console.log%EB%A1%9C-%EA%B0%92%EC%9D%84-%EB%9D%84%EC%9B%A0%EC%9D%84-%EB%95%8C-%EC%97%B0%EB%8B%AC%EC%95%84-undefined%EA%B0%80-%EB%82%98%EC%98%A4%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Wed, 11 Oct 2023 08:00:55 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-javascript">var { firstname, age } = {firstname: &#39;kim&#39;, age: 30 };</code></pre>
<p>라고 코드를 작성한 뒤, 콘솔창에</p>
<pre><code class="language-javascript">console.log(firstname);
console.log(age);</code></pre>
<p>를 작성하면 변수값이 잘 할당된 것을 확인할 수 있는데,
문제는 아래에 뜨는 <code>undefined</code>이다.</p>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/f39e1d82-c134-4900-948d-77ef624ab2ce/image.png" alt=""></p>
<p>대체 이게 왜 뜨는 걸까...
혼자 머리를 굴려봐도 이유가 떠오르지 않았다.</p>
<hr>
<p>궁금해서 검색해보았더니 (검색 키워드: <code>console창에 undefined가 연달아</code>)
위 현상을 이해하기 위해서는 자바스크립트에서 <code>문</code>과 <code>표현식</code>에 대해서 이해가 필요하다고 한다.</p>
<blockquote>
<h3 id="문이란">문이란?</h3>
</blockquote>
<ul>
<li>문이란 <strong>프로그램을 구성하는 기본 단위이자 실행 단위</strong>로, 명령문이라고도 부른다.
조건문, 선언문, 반복문 등등 문을 실행하면 해당 프로그램에서 명령이 실행된다.<blockquote>
<h3 id="표현식expression이란">표현식(expression)이란?</h3>
</blockquote>
</li>
<li>표현식이란 <strong>값으로 평가될 수 있는 문</strong>을 말한다.
예를 들어 <b style="font-weight:bold; color:#20C997;">1+2=3</b>이라는 수식에서
1+2와 3은 동치이므로 1+2는 3으로 표현될 수 있다는 말과 비슷하다.</li>
</ul>
<pre><code class="language-javascript">//값으로 평가될 수 있는 문들
1+2 //3
a = 1 //1
b = [1,2,3] //[1,2,3]
b[1] //2</code></pre>
<hr>
<h2 id="표현식이-아닌-문들">표현식이 아닌 문들</h2>
<p>표현식 값으로 평가될 수 있는 문이란 뜻이기 때문에
<strong>표현식이 아니라는 뜻</strong>은 <strong>값으로 평가될 수 없다</strong>는 뜻이다.</p>
<p>다음과 같은 코드들은 값으로 평가될 수 없다.
그리고 이러한 문들은 <strong>변수에 직접 대입해봄으로써 판단할 수 있다.</strong>
값으로 평가될 수 없기 떄문에 변수에 할당할 수 없기 때문이다.</p>
<pre><code class="language-javascript">//값으로 평가될 수 없는 문들
var a;
var a = 10;

//표현식이 아닌 문들은 할당할 수 없다.
var b = var a; //Unexpected token &#39;var&#39;</code></pre>
<hr>
<h2 id="그래서-왜-undefined가-나오는-것인가">그래서 왜 undefined가 나오는 것인가</h2>
<p>표현식은 값으로 평가될 수 있는 문이라고 했는데,
크롬의 콘솔창에서는 <strong>표현식의 평가된 값을 반환하기 때문에 표현식이 아닌 문을 실행했을 때 undefined를 반환한다.</strong></p>
<p>마지막에 작성한 코드가 <b style="color:#20C997; font-weight:bold;">아무런 리턴 값이 없을 경우</b>(console, 단순 변수 선언 등)에 undefined가 찍힌다고 보면 될 것 같다.</p>
<pre><code class="language-javascript">//아웃풋이 있는 예시
function add(a,b){
  return a + b;
}
add(2,5);</code></pre>
<p>위 코드를 콘솔창에 붙여넣으면 7이라는 아웃풋이 나오면서 undefined가 뜨지 않는다.</p>
<p>하지만 만약</p>
<pre><code class="language-javascript">function add(a,b){
  return a + b;
}
console.log(add(a,b));</code></pre>
<p>이렇게 작성한다면,
console.log로 인해서 7이 출력되고
console.log의 리턴값인 undefined가 콘솔에 찍히게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본함수, 화살표함수, 람다함수(익명함수)]]></title>
            <link>https://velog.io/@ssarr_i/%EA%B8%B0%EB%B3%B8%ED%95%A8%EC%88%98-%ED%99%94%EC%82%B4%ED%91%9C%ED%95%A8%EC%88%98-%EB%9E%8C%EB%8B%A4%ED%95%A8%EC%88%98%EC%9D%B5%EB%AA%85%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@ssarr_i/%EA%B8%B0%EB%B3%B8%ED%95%A8%EC%88%98-%ED%99%94%EC%82%B4%ED%91%9C%ED%95%A8%EC%88%98-%EB%9E%8C%EB%8B%A4%ED%95%A8%EC%88%98%EC%9D%B5%EB%AA%85%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 11 Oct 2023 06:36:30 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트의 일반함수, 익명함수, 람다함수, 화살표함수를 이해하고 넘어가려 한다.</p>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/633b1a26-0007-4b73-a0d6-a58d1674ee9b/image.png" alt=""></p>
<h3 id="함수의-형태">함수의 형태</h3>
<pre><code class="language-javascript">//일반함수
function 함수명(){
  함수내용
}

//익명함수
function(){
  함수내용
}</code></pre>
<p>일반함수와 익명함수의 차이는 <strong>함수명이 있느냐 없느냐</strong>의 차이를 가지고 있다.
익명함수는 메모리를 따로 차지하지 않기 때문에 재사용하기보다는 일회용으로 많이 사용이 되는 편이다. 따라서 익명함수를 사용할 때에는 <strong>변수에 담아서 사용하는 형태를 갖추고 있다.</strong></p>
<pre><code class="language-javascript">const 변수 = function(){
  함수내용
}</code></pre>
<p>▲위와 같이 익명함수를 변수에 저장하는 방식을 <b style="color:red; font-weight:bold">리터럴 방식</b>이라고 한다.
<strong>리터럴 방식</strong>은 변수를 선언함과 동시에 그 값을 저장해주는 방식이라고 생각하면 된다.</p>
<hr>
<p>익명함수는 리터럴 방식으로 변수에 담겨 작성될 때,
호이스팅 시 위로 올라가지 않고 <strong>익명함수를 저장한 변수만 올라가게 된다.</strong></p>
<p>따라서 아래의 상황에서는 에러가 발생하게 된다.</p>
<pre><code class="language-javascript">익명함수();

var 익명함수 = function(){
  console.log(&#39;익명함수를 담은 변수를 상단에서 호출하면 어떻게 될까&#39;);
}

익명함수();</code></pre>
<p>첫번쨰 줄 익명함수()에서 에러가 뜬다.
<b style="color:red">ReferenceError: Cannot access &#39;익명함수&#39; before initialization</b></p>
<p>일반함수를 선언하면 함수 자체가 호이스팅 되어서 함수가 선언되기 이전 줄에서도 해당 함수를 부를 수 있는데
익명함수는 그게 불가능하다.</p>
<p>따라서 익명함수는 한 번 사용하고 쓰지 않을 함수에 한해서 사용하는 것이 좋다.
(일회성 함수로 사용될 불필요한 메모리를 줄일 수 있기 때문이다)</p>
<blockquote>
<h3 id="💡참고사항">💡참고사항</h3>
<p>일반함수와 익명함수 모두 함수 안에서 <code>this</code>를 호출하면 <code>window</code>가 뜨게 된다.
특정한 다른 함수(ex. eventListener 등) 안에서 function이 새롭게 작성되면 <code>this</code> 값을 다시 재정의한다.
만약 재정의하고 싶지 않다면(상위의 <code>this</code> 값을 가지고 오고 싶다면) 화살표 함수로 교체하는 것이 좋다.</p>
</blockquote>
<hr>
<h3 id="화살표-함수람다함수">화살표 함수(=람다함수)</h3>
<pre><code class="language-javascript">//일반함수
function 일반함수(){
  console.log(&#39;일반함수&#39;);
}

//화살표함수
var 화살표함수 = () =&gt; {
  console.log(&#39;화살표함수&#39;);
}</code></pre>
<p>화살표 함수는 짧아서 사용하기가 간편하다.
화살표 함수에는 별도로 함수명을 쓰지 않기 때문에 <strong>익명함수</strong>라고도 한다.
화살표 함수는 효율적인 메모리 관리가 가능하다는 익명함수의 특징을 포함하고 있다.</p>
<p>화살표 함수가 한 줄일 경우에는 아래와 같이 더 짧게 선언하는 것도 가능하다.</p>
<pre><code class="language-javascript">var 화살표함수 = () =&gt; console.log(&#39;화살표함수&#39;);</code></pre>
<hr>
<hr>
<h3 id="화살표-함수에서의-this">화살표 함수에서의 this</h3>
<p>아래 예시를 통해서 이해도를 높여보자.</p>
<pre><code class="language-javascript">var target = &#39;전역변수&#39;;

function 일반함수(){
  console.log(this.target);
}

var 오브젝트 = {
  target: &#39;지역변수&#39;,
  action: 일반함수,
}

오브젝트.action(); //결과값은?</code></pre>
<p>위 코드의 결과값은 &#39;지역변수&#39; 이다.</p>
<p>오브젝트 내에서 this를 부르면 this를 포함하고 있는(감싸고 있는) 부모 요소를 가리키게 된다.
결국 this.target 은 오브젝트.target 과 동일한 표현이 된다.</p>
<pre><code class="language-javascript">var target = &#39;전역변수&#39;;

var 화살표함수 = () =&gt; {
  console.log(this.target)
};

var 오브젝트 = {
  target: &#39;지역변수&#39;,
  action: 화살표함수,
}

오브젝트.action(); //결과값은?</code></pre>
<p>위의 결과 값은 &#39;전역변수&#39;인데,
<b style="red"><strong>화살표 함수의 경우 내부의 this는 선언이 된 시점에서 this를 호출한다.</strong></b>
따라서 target 변수는 밖에서 받아온 this(=window)라는 전역 설정한 값이 들어오게 되는 것이다.</p>
<hr>
<p>이렇게 예시를 들어가면서 공부하니까 확실히 이해가 빠르게 된다.</p>
<p>this값을 선언할 때마다 화살표 함수/일반함수/익명함수 별로 어떻게 관리를 해야하는지 좀 헷갈렸었는데 정리가 되는 기분이다.</p>
<hr>
<p>참고:: <a href="https://han-py.tistory.com/473">[javascript] 쉽게 이해하는 화살표 함수와 람다 함수 (익명함수) - HAN_PY 티스토리 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[.sort() 숫자정렬하기]]></title>
            <link>https://velog.io/@ssarr_i/.sort-%EC%88%AB%EC%9E%90%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ssarr_i/.sort-%EC%88%AB%EC%9E%90%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 11 Oct 2023 05:11:37 GMT</pubDate>
            <description><![CDATA[<p>[1,2,6,4,2].sort();를 했을 때 별 다른 문제 없이
[1,2,2,4,6]으로 정렬이 잘 되어서 몰랐었는데
<code>.sort()</code>는 숫자를 정렬해주는게 아니라 문자를 정렬해주는 메소드라는 것을 알고 숫자 정렬을 할 방법을 찾아야만 했다.</p>
<hr>
<pre><code class="language-javascript">var data = [1,11,14,3,61,4];

data.sort();
// 결과값 [1,11,14,3,4,61];</code></pre>
<p>숫자가 문자 순서대로 정렬되어서 뒤죽박죽이 되어버렸는데 이걸 해결할 방법을 찾아야한다.</p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort">mdn</a>에 <code>.sort()</code>를 검색해보았다.</p>
<pre><code class="language-javascript">arr.sort([ compareFunction ]);</code></pre>
<p>매개변수 <code>compareFunction</code>
정렬 순서를 정의하는 함수인데 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 정렬이 된다.</p>
<blockquote>
<p><code>compareFunction</code>이 제공되지 않으면 요소를 문자열로 변환하고,
유니코드 코드 포인트 순서로 문자열을 비교하여 정렬된다.
예를 들어 &quot;바나나&quot;는 &quot;체리&quot; 앞에 온다.
숫자 정렬에서는 9가 80보다 앞에 오지만 숫자는 문자열로 변환되기 떄문에 &quot;80&quot;은 유니코드 순서에서 &quot;9&quot; 앞에 오게 된다.</p>
</blockquote>
<pre><code class="language-javascript"></code></pre>
<p><code>compareFunction</code>이 제공되지 않으면.. 이라는 가정은 결국
array.sort()의 경우를 말하는 것이고,
compareFunction을 제공해주려면 .sort()의 괄호 안에 무엇인가 적어주면 되는 것 같다.</p>
<blockquote>
<h3 id="💡규칙">💡규칙</h3>
<p><code>compareFunction</code>이 제공되면 배열 요소는 <strong>compare 함수의 반환 값에 따라 정렬</strong>된다.
a와 b가 비교되는 두 요소라면,</p>
<ul>
<li><p><code>compareFunction(a, b)</code>이 <strong>0보다 작은 경우</strong> a를 b보다 낮은 색인으로 정렬한다. 즉 a가 먼저 온다.</p>
</li>
<li><p><code>compareFunction(a, b)</code>이 <strong>0보다 큰 경우</strong> b를 a보다 낮은 인덱스로 소트한다.</p>
</li>
<li><p><code>compareFunction(a, b)</code>은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야한다.
일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않는다.</p>
</li>
</ul>
</blockquote>
<p>따라서 compare 함수의 형식은 다음과 같다.</p>
<pre><code class="language-javascript">function comapare(a,b){
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
      return 1;
  }
  // a must be equal to b
  return 0;
}</code></pre>
<hr>
<p>문자열 대신 숫자를 비교하기 위해 compare 함수는 a에서 b를 뺼 수 있는데, 다음 함수는 배열을 <strong>오름차순으로 정렬한다.</strong>
(Infinity 및 NaN이 포함되어 있지 않은 경우)</p>
<pre><code class="language-javascript">function compareNumbers(a, b){
  return a - b;
}</code></pre>
<p><strong>내림차순으로 정렬</strong>하고 싶을 경우엔 compareNumbers() 함수 안의 return 값을 조금 수정하면 된다.</p>
<pre><code class="language-javascript">
function compareNumbers(a, b){
  return b - a;
}</code></pre>
<hr>
<hr>
<p>sort메소드는 함수식(및 클로저)와 함께 편리하게 사용할 수 있다.</p>
<pre><code class="language-javascript">var numbers = [4, 2, 5, 1, 3];
numbers.sort(function (a,b){
  return a - b;
});
console.log(numbers); //[1, 2, 3, 4, 5]</code></pre>
<hr>
<p>개체는 해당 속성 중 하나의 값을 기준으로 정렬할 수 있다.</p>
<pre><code class="language-javascript">var items = [
  { name: &quot;Edward&quot;, value: 21 },
  { name: &quot;Sharpe&quot;, value: 37 },
  { name: &quot;And&quot;, value: 45 },
  { name: &quot;The&quot;, value: -12 },
  { name: &quot;Magnetic&quot;, value: 13 },
  { name: &quot;Zeros&quot;, value: 37},
];

//value 기준으로 정렬
items.sort(function (a, b){
  if (a.value &gt; b.value){
    return 1;
  }
  if (a.value &lt; b.value){
    return -1;
  }
  //a must be equal to b
  return 0;
});

//name 기준으로 정렬
items.sort(function(a, b){
  var nameA = a.name.toUpperCase(); //ignore upper and lower case
  var nameB = b.name.toUpperCase(); //ignore upper and lower case

  if (nameA &lt; nameB){
    return -1;
  }
  if (nameA &gt; nameB){
    return 1;
  }

  //이름이 같을 경우
  return 0;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Arrow function과 function]]></title>
            <link>https://velog.io/@ssarr_i/Arrow-function%EA%B3%BC-function</link>
            <guid>https://velog.io/@ssarr_i/Arrow-function%EA%B3%BC-function</guid>
            <pubDate>Mon, 25 Sep 2023 07:55:14 GMT</pubDate>
            <description><![CDATA[<h2 id="function을-사용하는-이유">function을 사용하는 이유</h2>
<p>아래 두 가지 상황에서 함수를 써야 한다</p>
<blockquote>
<ol>
<li>여러 가지 기능을 하는 코드를 한 단어로 묶고 싶을 때(그리고 나중에 재사용할 때)</li>
<li>입출력 기능을 만들 때</li>
</ol>
</blockquote>
<p><code>arrow function</code>을 사용하는 데에는 몇 가지 이유가 있는데
** 1. 첫번째로 함수 본연의 <u>입출력 기능</u>을 아주 직관적으로 잘 표현해줌 **</p>
<pre><code class="language-javascript">var 두배만들기 = (x) =&gt; { return x * 2 };

console.log( 두배만들기(4) );
console.log( 두배만들기(8) );</code></pre>
<p>화살표 모양을 사용함으로써 함수의 기능을 파악하는 데에 쉬워짐</p>
<pre><code class="language-javascript"></code></pre>
<p>** 2. 두번째로 소괄호 생략이 가능함 **</p>
<pre><code class="language-javascript">var 두배만들기 = x =&gt; { return x * 2 };

console.log( 두배만들기(4) );
console.log( 두배만들기(8) );</code></pre>
<p><code>파라미터</code>가 한 개일 경우 소괄호를 생략할 수 있음</p>
<pre><code class="language-javascript"></code></pre>
<p>** 3. 세번째로 중괄호 생략이 가능함 **</p>
<p>중괄호 안에 <code>return</code> 한 줄 뿐이라면 중괄호와 <code>return</code> 모두 생략 가능함</p>
<pre><code class="language-javascript">var 두배만들기 = x =&gt; x * 3;

console.log( 두배만들기(4) );
console.log( 두배만들기(8) );</code></pre>
<hr>
<p><code>arrow function</code>을 쓰면 내부에서 <code>this</code>값을 쓸 때 <u><strong>밖에 있던 <code>this</code>값을 그대로 사용함</strong></u></p>
<p><code>arrow function</code>은 어디서 쓰던지 내부의 <code>this</code>값을 변화시키지 않음
따라서 바깥에 있던 this의 의미를 그대로 내부에서도 사용하는 함수가 <code>arrow function</code></p>
<blockquote>
<p>이것이 네번째 장점이자 <code>arrow function</code>을 사용하는 핵심 이유</p>
</blockquote>
<pre><code class="language-javascript"></code></pre>
<pre><code class="language-javascript">var 오브젝트1 = {
  함수 : function(){ console.log(this);
}

오브젝트1.함수();</code></pre>
<p>위의 코드를 실행시키면
함수()를 가지고 있는 오브젝트인 <code>오브젝트1</code>이 콘솔창에 출력됨</p>
<pre><code class="language-javascript"></code></pre>
<pre><code class="language-javascript">var 오브젝트1 = {
    함수 : () =&gt; { console.log(this); }
}

오브젝트1.함수();</code></pre>
<p>위의 코드를 실행시키면
<code>this</code>의 값으로 <code>window</code>가 나옴</p>
<p><code>arrow function</code>은 외부에 있던 <code>this</code>를 그대로 내부로 가져와서 사용하는 함수이기 때문에 일반 <code>function</code>과 용도가 다름</p>
<p>일반 <code>function</code>을 대체하여 <code>arrow function</code>을 사용하는 일이 없도록 하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[this를 함수와 Object에서 사용하면]]></title>
            <link>https://velog.io/@ssarr_i/js%EC%A4%91%EA%B8%89-this%EB%A5%BC-%ED%95%A8%EC%88%98%EC%99%80-Object%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4</link>
            <guid>https://velog.io/@ssarr_i/js%EC%A4%91%EA%B8%89-this%EB%A5%BC-%ED%95%A8%EC%88%98%EC%99%80-Object%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4</guid>
            <pubDate>Sun, 27 Aug 2023 10:01:33 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-js">console.log(this); //Window...</code></pre>
<p>아무데서나 일반(전역)함수로 <code>this</code>를 호출하면 <code>window</code>를 가지고 옴</p>
<blockquote>
<p><strong>Q. <code>window</code>가 무엇인가요?
A. <code>window</code>는 모든 전역변수, 함수, DOM을 보고나하고 관리하는 전역 객체입니다</strong></p>
</blockquote>
<p>그러나 strict mode일 때 함수 안에서 쓰면 <code>this</code>는 <code>undefined</code>가 나옴</p>
<hr>
<pre><code class="language-js">var object = {
    data : &#39;kim&#39;,
      함수 : function(){
        console.log(this);
    }
}

object.함수(); //{data: &#39;Kim&#39;, 함수: ƒ}</code></pre>
<p>오브젝트 내 함수 안에서 쓰면
<strong>그 함수를 가지고 있는 오브젝트</strong>를 뜻함</p>
<blockquote>
<h3 id="🎈문제1">🎈문제1</h3>
<pre><code class="language-js">var 오브젝트 = {
    data: {
        함수: function(){
            console.log(this);
        }
    },    
}

오브젝트.data.함수();</code></pre>
<h3 id="정답1">정답1</h3>
<pre><code class="language-js">{함수: f};</code></pre>
</blockquote>
<hr>
<h3 id="📌신-문법---arrow-function-특징">📌신 문법 - <code>Arrow Function</code> 특징</h3>
<p><code>this</code>값을 함수 밖에 있던 것을 그대로 가져와서 씀</p>
<pre><code class="language-js"></code></pre>
<pre><code class="language-js">var 오브젝트 = {
    data: {
        함수: ()=&gt; {
            console.log(this);
        }
    },    
}

오브젝트.data.함수(); //Window {window: Window, self: Window, document: document, name: &#39;&#39;, location: Location, …}</code></pre>
<p>함수 밖에 있던 <code>window</code>값이 <code>console</code>로 출력됨
(상위요소가 가지고 있던 <code>this</code>값을 가지고 오는 것)</p>
<hr>
<h3 id="📌신-문법---오브젝트-안에-함수-넣을-때">📌신 문법 - 오브젝트 안에 함수 넣을 때</h3>
<p>메소드 안에 함수를 넣고 싶을 때</p>
<pre><code class="language-js">var 오브젝트 = {
    data: {
        함수(){
        //함수: function(){..} 에서 &#39;: function: 생략
            console.log(this);
        }
    },    
}

오브젝트.data.함수();</code></pre>
<hr>
<hr>
<p>✨
결국 <code>this</code>는 <strong>나를 담고 있는 <code>오브젝트(상위 주인공)</code>를 담고 있는 것임</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] 파일 또는 폴더 이동하기(git mv)]]></title>
            <link>https://velog.io/@ssarr_i/git-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ssarr_i/git-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 18 Jul 2023 06:54:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ssarr_i/post/b3b2c90e-03e3-4b6b-896a-01d866d4f5fa/image.png" alt=""></p>
<p>git을 사용해서 이것저것 테스트하던 와중에,
폴더명을 바꾸고 새로 생성할 일이 있었다</p>
<p>아무 생각 없이 직접 폴더를 옮겼다가 에러가 잔뜩 떠서 뭐가 문제지 했는데</p>
<ol>
<li>파일의 이름을 변경하거나</li>
<li>디렉토리 구조를 바꿔야하는 경우가 발생할 때에는</li>
</ol>
<p>이럴 땐 직접 이동시키지 않고 <strong>git mv</strong> 명령어를 사용하면 되는 것이었다😓</p>
<pre><code class="language-javascript">git mv [원래 파일명] [변경할 파일명]
git mv [원래 폴더] [이동할 폴더]</code></pre>
<p><code>폴더 이동</code>의 경우, 이동할 폴더가 존재하지 않으면 <strong>원래 폴더의 이름만 변경되고, 존재하면 해당 폴더 안으로 들어간다</strong></p>
<p>그냥 이동시키면 사진과 같이 <code>deleted</code>라고 뜨는데
<img src="https://velog.velcdn.com/images/ssarr_i/post/86d57e3c-6fe6-4d1c-a16b-2d03a5bdd420/image.png" alt=""></p>
<p>git mv 명령을 사용하여서 옮기면 아래와 같이 renamed라고 뜬다
<img src="https://velog.velcdn.com/images/ssarr_i/post/effb050c-e549-4f55-b355-17748d648768/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] 다양한 merge 방법]]></title>
            <link>https://velog.io/@ssarr_i/git-%EB%8B%A4%EC%96%91%ED%95%9C-merge-%EB%B0%A9%EB%B2%95-ntbiipjk</link>
            <guid>https://velog.io/@ssarr_i/git-%EB%8B%A4%EC%96%91%ED%95%9C-merge-%EB%B0%A9%EB%B2%95-ntbiipjk</guid>
            <pubDate>Tue, 18 Jul 2023 06:46:42 GMT</pubDate>
            <description><![CDATA[<p><code>참조</code> <a href="https://codingapple.com/course-status/">애플코딩: (무료) 매우쉽게 알려주는 git &amp; github</a></p>
<h3 id="1-3-way-merge">(1) 3-way merge</h3>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/6a844a6a-3524-418d-9806-44f21a531b2d/image.png" alt=""></p>
<p>브랜치에 각각 신규 <code>commit</code>이 <strong>1회 이상</strong> 있는 경우, merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 <code>commit</code>을 자동으로 생성해주는 것</p>
<p>이것이 <code>merge</code>의 기본 동작방식</p>
<blockquote>
<p><code>commit2</code> 시점에서 <code>commit2-1</code>이라는 신규 브랜치를 만들고
그 이후 각각 <code>commit3</code>, <code>commit2-2</code>라는 신규 커밋이 1회 이상 생겼을 때 <code>merge</code>를 해주는 것이 <strong><code>3-way-merge</code></strong>이다.</p>
</blockquote>
<pre><code class="language-html"></code></pre>
<h3 id="2-fast-forward-merge">(2) fast-forward merge</h3>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/388c2359-9e6c-479a-a70e-b0c7047e3ae9/image.png" alt=""></p>
<p>새로운 브랜치에만 <code>commit</code>이 되어있고
기준이 되는 브랜치에는 신규 <code>commit</code>이 없는 경우가 있는데,</p>
<p>이럴 경우 <code>merge</code>하게 되면
<strong>&quot;fast-forward merge 되었습니다&quot; 라고 알려줌</strong></p>
<p>기준이 되는 브랜치에 새롭게 합칠 것이 없어서 <strong>분리된 브랜치</strong>를 메인 브랜치처럼 다루는 것</p>
<p>만약, <code>fast-forward merge</code>가 싫다면</p>
<pre><code class="language-javascript">git merge --no-ff 브랜치명</code></pre>
<p>를 사용하여 강제로 <code>3-way merge</code>할 수도 있음</p>
<pre><code class="language-html"></code></pre>
<h3 id="3-브랜치-삭제-방법">(3) 브랜치 삭제 방법</h3>
<p>위의 두 가지 방법으로 <code>merge</code>를 하더라도 브랜치가 자동으로 삭제되진 않는다</p>
<pre><code class="language-javascript">git branch -d 브랜치이름
git branch -D 브랜치이름</code></pre>
<p>둘 중 하나를 사용하면 필요없는 브랜치를 삭제할 수 있다
병합이 완료된 브랜치를 삭제할 땐 <code>-d</code>만 사용해도 되는데
병합하지 않은 브랜치를 삭제할 땐 <code>-D</code>를 사용해야 한다.</p>
<pre><code class="language-html"></code></pre>
<h3 id="4-rebase-and-merge">(4) rebase and merge</h3>
<h4 id="rebase">rebase</h4>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/cf7a94dd-a108-4b0f-8b76-dcd37ee8d1f7/image.png" alt="">
<code>rebase</code>는 브랜치의 시작점을 다른 <code>commit</code>으로 옮겨주는 행위다</p>
<ol>
<li><code>rebase</code>를 이용하여 신규 브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음</li>
<li><code>fast-forward merge</code>를 하는 것</li>
</ol>
<blockquote>
<ol>
<li><code>3-way merge</code> 말고 강제로 <code>fast-forward</code> 하고 싶을 때</li>
<li>브랜치 없이도 코드를 잘 짜는 고수 느낌을 주고 싶을 때
<code>rebase &amp; merge</code>를 사용한다</li>
</ol>
</blockquote>
<pre><code class="language-html"></code></pre>
<h4 id="rebase-and-merge-하는-법">rebase and merge 하는 법</h4>
<ol>
<li>새로운 브랜치로 이동</li>
<li>git rebase main</li>
<li>브랜치가 main 브랜치 끝으로 이동하는데 그걸 <code>fast-forward merge</code> 하면 됨</li>
</ol>
<pre><code class="language-javascript">git switch 새로운브랜치
git rebase main

git switch main
git merge 새로운브랜치</code></pre>
<p>main 브랜치 뿐만 아니라 다른 브랜치끼리도 가능함</p>
<p>단, 브랜치끼리 차이가 너무 많은 경우에 <code>rebase</code>를 하게 되면 충돌이 많이 발생할 수 있음</p>
<pre><code class="language-javascript"></code></pre>
<h3 id="5-squash-and-merge">(5) squash and merge</h3>
<p>모든 브랜치를 <code>3-way merge</code>해버리면 이후에 문제가 생길 수도 있음
<img src="https://velog.velcdn.com/images/ssarr_i/post/7095006f-2bb2-41aa-8f01-e51aca424d55/image.png" alt=""></p>
<ol>
<li>3-way merge 된 것들은 그래프상 복잡해보이고</li>
<li>main 브랜치 git log를 출력해보면 3-way merge된 브랜치들의 commit 내역도 다 출력되어서 더러워지는 현상이 있기 때문</li>
</ol>
<p>그게 싫을 경우,
rebase 또는 squash and merge하면 됨</p>
<p>위와 같이 사용하면 새로운 브랜치에 있던 commit들을 <strong>연결해주는 것이 아니라 똑 떼와서 main 브랜치에 붙여주기 때문에</strong>
1번과 2번 걱정을 하지 않아도 됨</p>
<h4 id="squash">squash</h4>
<p>squash and merge를 하게 될 경우,
3-way merge처럼 선으로 이어주지 않고
새 브랜치에 있던 코드변경사항들이 main 브랜치로 순간이동함</p>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/5e05be80-b059-45ac-b72b-e784fba0380c/image.png" alt=""></p>
<p>main 브랜치의 git log를 출력해볼 때
merge 완료된 브랜치의 commit 같은 것들은 출력되지 않음 (훨씬 깔끔)</p>
<pre><code class="language-javascript">git switch main
git merge --squash 브랜치명
git commit -m &#39;메세지&#39;</code></pre>
<p>git merge 뒤에 --squash 옵션 추가하면 됨</p>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/fde2cccc-1dfc-4463-8049-65cee97b371c/image.png" alt=""></p>
<p>▲ 그냥 merge 했을 경우</p>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/ad87e0f0-be42-49d5-a329-b502e80051eb/image.png" alt=""></p>
<p>▲ merge --squash 했을 경우</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[navigator]]></title>
            <link>https://velog.io/@ssarr_i/js-navigator</link>
            <guid>https://velog.io/@ssarr_i/js-navigator</guid>
            <pubDate>Mon, 19 Jun 2023 06:17:45 GMT</pubDate>
            <description><![CDATA[<h1 id="💻-navigator-객체">💻 navigator 객체</h1>
<p><code>navigator</code> 객체는 브라우저 관련된 정보를 컨트롤 한다. 브라우저에 대한 <strong>버전, 정보, 종류 등 관련된 정보를 제공한다.</strong></p>
<blockquote>
<pre><code class="language-javascript">//javascript
navigator.속성</code></pre>
</blockquote>
<pre><code>
## navigator 객체 속성
* `navigator.appCodeName` : 브라우저의 코드명을 반환
* `navigator.appName` : 브라우저의 이름을 반환
* `navigator.appVersion` : 브라우저의 버전을 반환
* `navigator.cookieEnabled` 브라우저의 쿠키 사용 가능 여부를 반환
* `navigator.language` 브라우저에서 사용되는 언어를 반환
* `navigator.onLine` : 브라우저가 온라인인지의 여부 반환
* `navigator.platform` : 브라우저가 실행되는 플랫폼 정보 반환
* `navigator.product` : 브라우저에서 사용되는 엔진 이름 반환
* `navigator.userAgent` : 브라우저와 운영체제 정보를 반환

_ _ _

#### 📌브라우저 주소 관련 예제1
```javascript
var nowAppCodeName = navigator.appCodeName;
var nowAppName = navigator.appName;
var nowAppVersion = navigator.appVersion;
var nowCookieEnabled = navigator.cookieEnabled;
var nowLanguage = navigator.language;
var nowOnline = navigator.onLine;
var nowPlatform = navigator.platform;
var nowProduct = navigator.product;
var nowUserAgent = navigator.userAgent;

document.write(&quot;브라우저의 코드명[navigator.appCodeName]: &quot; + nowAppCodeName, &quot;&lt;br&gt;&quot;);
document.write(&quot;브라우저의 이름[navigator.appName] : &quot; + nowAppName, &quot;&lt;br&gt;&quot;);
document.write(&quot;브라우저의 버전[navigator.appVersion] : &quot; + nowAppVersion, &quot;&lt;br&gt;&quot;);
document.write(&quot;쿠키 사용 가능 여부[navigator.cookieEnabled] : &quot; + nowCookieEnabled, &quot;&lt;br&gt;&quot;);
document.write(&quot;브라우저에서 사용되는 언어[navigator.language] : &quot; + nowLanguage, &quot;&lt;br&gt;&quot;);
document.write(&quot;온라인인지 여부[navigator.onLine] : &quot; + nowOnLine, &quot;&lt;br&gt;&quot;);
document.write(&quot;플랫폼 정보[navigator.platform] : &quot; + nowPlatform, &quot;&lt;br&gt;&quot;);
document.write(&quot;브라우저 엔진 이름[navigator.product] : &quot; + nowProduct, &quot;&lt;br&gt;&quot;);
document.write(&quot;운영체제 정보[navigator.userAgent] : &quot; + nowUserAgent, &quot;&lt;br&gt;&quot;);</code></pre><blockquote>
<h4 id="📌결과">📌결과</h4>
<p>브라우저의 코드명[navigator.appCodeName] : Mozilla
브라우저의 이름[navigator.appName] : Netscape
브라우저의 버전[navigator.appVersion] : 5.0 (Macintosh; Intel Mac OS X 10_15_0)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
쿠키 사용 가능 여부[navigator.cookieEnabled] : true
브라우저에서 사용되는 언어[navigator.language] : ko-KR
온라인인지 여부[navigator.onLine] : true
플랫폼 정보[navigator.platform] : MacIntel
엔진 이름[navigator.product] : Gecko
운영체제 정보[navigator.userAgent] : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36</p>
</blockquote>
<hr>
<h4 id="📌브라우저-주소-관련-예제2">📌브라우저 주소 관련 예제2</h4>
<pre><code class="language-html">&lt;!--html--&gt;
&lt;div id=&quot;info&quot;&gt;&lt;/div&gt;</code></pre>
<pre><code class="language-javascript">//javascript
var os = navigator.userAgent.toLowerCase();
var sw = screen.width;
var sh = screen.height;
var info = document.getElementById(&quot;info&quot;);

if(os.indexOf(&#39;windows&#39;) &gt;= 0){
  info.innerHTML = &quot;현재 윈도우를 사용하고 있으며 화면 크기는 &quot; + sw + &quot;x&quot; + sh + &quot;px입니다.&quot;;
}else if(os.indexOf(&#39;macintosh&#39;) &gt;= 0){
    info.innerHTML = &quot;현재 맥을 사용하고 있으며 화면 크기는 &quot; + sw + &quot;x&quot; + sh + &quot;px입니다.&quot;;
}else if(os.indexOf(&#39;iphone&#39;) &gt;= 0){
    info.innerHTML = &quot;현재 아이폰을 사용하고 있으며 화면 크기는 &quot; + sw + &quot;x&quot; + sh + &quot;px입니다.&quot;;
}else if(os.indexOf(&#39;android&#39;) &gt;= 0){
    info.innerHTML = &quot;현재 안드로이드 폰을 사용하고 있으며 화면 크기는 &quot; + sw + &quot;x&quot; + sh + &quot;px입니다.&quot;;
}</code></pre>
<pre><code class="language-javascript"></code></pre>
<pre><code class="language-javascript"></code></pre>
<h2 id="호환성">호환성</h2>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/db8a5fbb-ba98-45f0-9518-3628b3a7b8c7/image.png" alt=""></p>
<pre><code class="language-javascript"></code></pre>
<hr>
<p>그 외 <code>navigator</code> 메소드 참고 :: <a href="https://developer.mozilla.org/ko/docs/Web/API/Navigator">MDN JavaScript</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[window객체]]></title>
            <link>https://velog.io/@ssarr_i/js-window%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@ssarr_i/js-window%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Fri, 16 Jun 2023 05:38:21 GMT</pubDate>
            <description><![CDATA[<h1 id="window-객체란">Window 객체란?</h1>
<p>window 객체는 두 가지 역할을 하는데</p>
<ol>
<li>브라우저 안의 모든 요소들이 소속된 객체로, <strong>최상위에 있기 때문에 어디서든 접근이 가능하다고 해서 <code>전역 객체</code> 라고도 부른다.</strong></li>
<li>일반적으로 우리가 알고 있는 <code>브라우저 창(browser window)</code>을 의미하고, <strong>이 창을 제어하는 다양한 메서드를 제공한다.</strong><pre><code class="language-javascript"></code></pre>
</li>
</ol>
<pre><code>

## 1. 전역 객체로써 window

`window` 객체는 문자 그대로 `window`라는 이름으로 접근할 수 있다.
&gt;```javascript
//javascript
window</code></pre><p>브라우저 console에서 <code>window</code>를 찍어보면,
<code>&gt; Window {parent: Window, opener: global, top: Window, length: 3, frames: Window, …}</code> 와 같은 값을 얻을 수 있는데 이 속에 무수히 많은 <code>프로퍼티</code>들이 존재하는 것을 확인할 수 있다.</p>
<p>우리가 작성하는 코드들은 대부분 다 <code>window</code> 객체의 프로퍼티가 된다는 사실을 기억해두자.</p>
<pre><code class="language-javascript">var myName = &quot;Ssari&quot;;

function getMyName(){
    return myName;
}

console.log(window.myName); //Ssarri
console.log(window.getMyname()); //Ssarri;</code></pre>
<p>위와 같이 <code>var</code> 키워드로 변수를 선언하거나 함수를 선언하면, <code>window</code>객체의 프로퍼티가 된다.
그럼에도 불구하고 우리는 변수와 함수를 선언하고서 앞에 <code>window</code>를 붙이지 않는데, 말 그대로 <code>window</code>는 <code>전역 객체</code>로 <strong>페이지 내에 있는 모든 객체를 다 포함하고 있기 때문에 <code>window</code>는 그냥 생략이 가능한 특징을 가지고 있다.</strong></p>
<p>따라서 특별한 경우를 제외하면 <strong><code>window</code>객체를 직접 사용할 일은 드물다.</strong></p>
<blockquote>
<h4 id="💡깨알상식">💡깨알상식</h4>
<p><code>let</code>과 <code>const</code>로 선언한 <code>변수</code>는 <code>블록 스코프</code>이기 때문에 <code>window</code>객체 내부의 블록에서 선언된 것으로 평가되어 <code>전역 객체</code>의 프로퍼티로 활용되기는 어렵다.</p>
<pre><code class="language-javascript">let myName = &quot;Ssarri&quot;;

console.log(window.myName); //undefined</code></pre>
</blockquote>
<hr>
<h2 id="2-브라우저-창으로써의-window">2. 브라우저 창으로써의 window</h2>
<p><code>window</code> 객체는 **브라우저의 창을 대변하고 다양한 메서드를 통해 이 창을 제어할 수 있다.</p>
<ul>
<li><code>.close()</code> : 브라우저 창을 닫음</li>
<li><code>.open()</code> : 브라우저 창을 엶</li>
<li><code>.innerWidth</code> : 브라우저의 안쪽 넓이의 값</li>
<li><code>.innerHeight</code> : 브라우저 안쪽의 높이값 반환</li>
<li><code>.outerWidth</code> : 브라우저의 프레임을 포함한 넓이값 반환</li>
<li><code>.outerHeight</code> : 브라우저의 프레임을 포함한 높이값 반환</li>
<li><code>.scrollY</code> : 현재 스크롤된 브라우저의 Y축 거리값</li>
<li><code>.scrollX</code> : 현재 스크롤된 브라우저의 X축 거리값<blockquote>
<h4 id="📌예제">📌예제</h4>
<pre><code class="language-javascript">window.addEventListener(&#39;resize&#39;, e=&gt;{
 console.log(window.innerWidth);
});</code></pre>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] window.getComputedStyle()]]></title>
            <link>https://velog.io/@ssarr_i/js-window.getComputedStyle</link>
            <guid>https://velog.io/@ssarr_i/js-window.getComputedStyle</guid>
            <pubDate>Thu, 15 Jun 2023 07:05:11 GMT</pubDate>
            <description><![CDATA[<p><code>window.getComputedStyle()</code> 메소드는 인자별로 전달받은 요소의 <strong>모든 CSS 속성값을 담은 객체를 회신한다.</strong>
개별 CSS 속성값은 객체를 통해 제공되는 API 또는 CSS 속성 이름을 사용해서 간단히 색인화하여 액세스 할 수 있다.</p>
<blockquote>
<pre><code class="language-javascript">let style = window.getComputedStyle(element[, pseudoElt]);</code></pre>
</blockquote>
<pre><code>`element`
* 속성값을 얻으려하는 요소
&gt;
&gt;`pseudoElt`
* 일치시킬 의사요소(`pseudo element`)를 지정하는 문자열. 보통의 요소들에 대해서는 생략되거나 `null`이어야 함

_ _ _
#### 📌예제1
해당 예제에서는 간단한 `&lt;div&gt;` 요소에 CSS스타일을 적용하고, `getComputedStyle()`를 사용해서 적용된 스타일 값을 찾아낸 후에 `&lt;div&gt;`의 본문으로 출력한다.

```html
&lt;!--html--&gt;
&lt;p&gt;Hello&lt;/p&gt;</code></pre><pre><code class="language-css">/* css */
p{
    width: 400px;
    margin: 0 auto;
    padding: 20px;
    font-size: 2rem;
    font-family: sans-serif;
    color:white;
    line-height: 2;
    text-align:center;
    background:purple;
}</code></pre>
<pre><code class="language-javascript">//javascript
let para = document.querySelector(&#39;p&#39;);
let compStyles = window.getComputedStyle(para);
para.textContent = &#39;My computed font-size is &#39; + compStyles.getPropertyValue(&#39;font-size&#39;) + &#39;,\nand my computed line-height is &#39;+ compStyles.getPropertyValue(&#39;line-height&#39;) + &#39;.&#39;;</code></pre>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/3ba54449-ada2-4bdb-8539-474ec98af45f/image.png" alt=""></p>
<hr>
<h4 id="📌예제2">📌예제2</h4>
<pre><code class="language-html">&lt;!--html--&gt;
&lt;div class=&quot;box&quot;&gt;&lt;/div&gt;</code></pre>
<pre><code class="language-css">/* css */
.box{
    width:300px;
    height:300px;
    margin:50px;
    background:lightgreen;
}</code></pre>
<p>```javascript
//javascript
const box = document.querySelector(&#39;.box&#39;);</p>
<p>box.addEventListener(&#39;click&#39;, e=&gt; {
    const bg = getComputedStyle(e.currentTarget).backgroundColor;
      const wid = getComputedStyle(e.currentTarget).width;
    console.log(bg);
      console.log(wid);
}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] function(e)에 대하여]]></title>
            <link>https://velog.io/@ssarr_i/js-functione%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@ssarr_i/js-functione%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Thu, 15 Jun 2023 05:26:14 GMT</pubDate>
            <description><![CDATA[<p><code>JavaScript</code>로 <code>event</code>를 받으면 <strong><code>function(e)</code></strong>와 같이 받았었는데 왜 꼭 <code>e</code>가 들어가는 것인지 의문이었다.</p>
<hr>
<h2 id="❓functione를-사용하는-이유">❓function(e)를 사용하는 이유</h2>
<p><code>addEventListener</code>에서 <code>function(e)</code>가 쓰여져있는 위치에는 <strong>이벤트 핸들러가 주어져야 한다. <u>이벤트가 발생했을 때 실행되는 함수가 놓여져야한다는 것이다</u></strong></p>
<p>그래서 <strong>click 이벤트</strong>가 발생하면</p>
<pre><code class="language-javascript">function(e){
  e.preventDefault();
}</code></pre>
<p>가 실행된다.</p>
<p>그리고나서 이벤트가 발생하면 이벤트 객체가 생성이 되는데, <strong>그 이벤트 객체가 <code>e</code>라는 파라미터에 할당이 된다.</strong></p>
<hr>
<h2 id="❓이벤트-객체">❓이벤트 객체</h2>
<h3 id="1-이벤트-객체란">1. 이벤트 객체란?</h3>
<p>이벤트가 발생하면 브라우저는 <strong>발생한 이벤트에 관련된 다양한 정보를 담은 이벤트 객체를 만들어 이벤트 리스너에 전달한다.</strong></p>
<blockquote>
<p>ex) <code>mousedown</code> 이벤트의 경우 (1)마우스 좌표, (2)버튼 번호,
<code>keydown</code> 이벤트의 경우 (1)키 코드 값, <code>shift</code>키가 눌려졌는지 등</p>
</blockquote>
<p>이벤트 리스너는 <strong>이벤트 객체의 프로퍼티 값ㅇ르 통해 발생한 이벤트에 관한 자세한 사항을 알 수 있다.</strong></p>
<hr>
<h3 id="2-이벤트-객체-전달받기">2. 이벤트 객체 전달받기</h3>
<p>이벤트 리스너가 이벤트 객체를 전달받는 방법에는 3가지가 있다.</p>
<h4 id="1-이름을-가진-이벤트-리스너-함수의-경우">1) 이름을 가진 이벤트 리스너 함수의 경우</h4>
<p>이벤트 리스너 함수는 다음과 같이 첫 번째 매개변수를 통해 이벤트 객체를 전달받을 수 있다.
매개변수의 이름은 <code>e</code> 대신 마음대로 붙여도 된다(생략도 가능)</p>
<pre><code class="language-javascript">function f(e){ //매개변수 e에 이벤트 객체를 전달받음. e는 생략 가능
  ...
}
obj.onclick = f; //obj 객체의 onclick리스너로 함수 f 등록</code></pre>
<h4 id="2-익명함수의-경우">2) 익명함수의 경우</h4>
<p>익명함수의 경우에도 다음과 같이 <strong>첫 번째 매개변수(e)를 통해 이벤트 객체를 전달 받는다.</strong></p>
<pre><code class="language-javascript">obj.onclick = function(e){//매개변수 e에 이벤트 객체를 전달받음. e는 생략 가능
    ...
}</code></pre>
<h4 id="3-html-태그의-리스너의-경우">3) HTML 태그의 리스너의 경우</h4>
<p>HTML 태그에 리스너를 만드는 경우엔 이벤트 객체는 <code>event</code>라는 이름으로 전달된다.</p>
<pre><code class="language-javascript">//javascript
function f(e){
    ...
}</code></pre>
<pre><code class="language-html">&lt;!--html--&gt;
&lt;button onclick=&quot;f(event)&quot;&gt;버튼&lt;/button&gt;
&lt;div onclick=&quot;alert(event.type)&quot;&gt;버튼&lt;/div&gt;</code></pre>
<hr>
<h2 id="❓이벤트에-들어있는-정보">❓이벤트에 들어있는 정보</h2>
<ul>
<li>이벤트 객체에는 <strong>발생한 이벤트에 관한 정보를 담고 있는 프로퍼티</strong>와 <strong>이벤트의 흐름 등을 제어하는 여러 메소드</strong>가 들어있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/02237e89-adf5-41ec-b846-c75c3c404e93/image.png" alt="이벤트 객체들의 공통 멤버"></p>
<h4 id="이벤트의-디폴트-행동-무효화">이벤트의 디폴트 행동 무효화</h4>
<ul>
<li>HTML 태그 중 몇몇은 특정 이벤트에 대해 디폴트 행동을 한다. (<code>&lt;a&gt;</code>태그를 클릭하면 웹 페이지를 로드하는 것, <code>&lt;button type=&quot;submit&quot;&gt;</code>을 클릭하면 폼 데이터를 웹 서버로 전송하는 것 등)</li>
<li>위와 같은 디폴트 행동을 취소시킬 수 있는 방법에 두 가지가 있다.</li>
</ul>
<blockquote>
<p><strong>1) 이벤트 리스너에서 false를 리턴</strong></p>
</blockquote>
<pre><code class="language-html">&lt;a href=&quot;http://velog.io/&quot; onclick=&quot;return false&quot;&gt;이동할 수 없는 링크&lt;/a&gt;</code></pre>
<blockquote>
<p><strong>2) 이벤트 객체의 preventDefault()를 호출</strong></p>
</blockquote>
<pre><code class="language-html">&lt;a href=&quot;http://velog.io/&quot; onclick=&quot;event.preventDefault()&quot;&gt;이동할 수 없는 링크&lt;/a&gt;</code></pre>
<p>모든 이벤트의 디폴트를 금지시킬 수 있는 것은 아니나,
<strong>이벤트 객체의 <code>cancelable</code> 프로퍼티가 <code>true</code>인 경우에만 취소가 가능하다.</strong></p>
<blockquote>
<h4 id="📌예제3">📌예제3</h4>
</blockquote>
<pre><code class="language-html">&lt;!--html--&gt;
&lt;h3&gt;이벤트의 디폴트 행동 취소&lt;/h3&gt;
&lt;a href=&quot;http://www.naver.com&quot; onclick=&quot;return query()&quot;&gt;네이버로 이동할 지 물어보는 링크&lt;/a&gt;
&lt;form action=&quot;&quot;&gt;
    &lt;input type=&quot;checkbox&quot;&gt;빵(체크 가능)&lt;br&gt;
    &lt;input type=&quot;checkbox&quot; onclick=&quot;noAction(event)&quot;&gt;술 (체크 불가능)
&lt;/form&gt;</code></pre>
<pre><code class="language-javascript">//javascript
function query(){
    const ret = confirm(&quot;네이버로 이동하시겠습니까?&quot;);
    return ret;
}
/*
confirm();은 확인/취소가 가능하도록 창이 뜨는 함수로,
&#39;확인&#39;을 누르면 true,
&#39;취소&#39;를 누르면 false가 반환되고
그렇게 a태그의 이벤트 디폴트 행동이 막히게 된다.
*/
&gt;
function noAction(e){
    e.preventDefault();
}</code></pre>
<hr>
<h2 id="❓e와-windowevent-둘-다-사용하는-이유">❓e와 window.Event 둘 다 사용하는 이유</h2>
<p>인터넷 익스플로러는 <code>e</code>구문을 이해하지 못해서 <code>window.Event</code> 구문을 함께 작성해주어야한다.</p>
<p>크로스브라우징을 위하여 아래와 같이 작성해주면 된다.</p>
<pre><code class="language-javascript">test.onclick = function(e){
  e = e||window.Event;
  ...
  ...
}</code></pre>
<p>참고로 익스플로러는 <code>화살표 함수</code>도 이해하지 못하기 때문에 크로스브라우징을 위해서는 <code>function(e)</code>와 같이 따로 적어주어야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 비구조화할당/구조분해할당]]></title>
            <link>https://velog.io/@ssarr_i/js-%EB%B9%84%EA%B5%AC%EC%A1%B0%ED%99%94%ED%95%A0%EB%8B%B9%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</link>
            <guid>https://velog.io/@ssarr_i/js-%EB%B9%84%EA%B5%AC%EC%A1%B0%ED%99%94%ED%95%A0%EB%8B%B9%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</guid>
            <pubDate>Tue, 13 Jun 2023 06:12:17 GMT</pubDate>
            <description><![CDATA[<h1 id="비구조화-할당">비구조화 할당</h1>
<p><strong>비구조화할당</strong>이란, 배열이나 객체 속성을 <u>해제하여 개별 변수에 값을 담을 수 있는</u> javascript 표현식을 말한다. <strong>비구조화할당</strong> 또는 <strong>구조 분해 할당</strong>이라고 한다.</p>
<h2 id="💻기본문법">💻기본문법</h2>
<p>: 비구조화 할당의 기본 구조는 <strong>좌측에는 변수, 우측에는 해당 변수에 넣어지는 값</strong>을 표현한다.
<strong>배열의 경우에는 <code>[]</code>를 사용하고, 객체의 경우에는 <code>{}</code>을 사용한다</strong></p>
<blockquote>
<h4 id="📌예제1-배열-비구조화">📌예제1: 배열 비구조화</h4>
</blockquote>
<pre><code class="language-javascript">let [x,y] = [1,2];
&gt;
console.log(x); //1
console.log(y); //2</code></pre>
<blockquote>
<h4 id="📌예제2-객체-비구조화">📌예제2: 객체 비구조화</h4>
</blockquote>
<pre><code class="language-javascript">const object = { a:1, b:2 };
function print({ a, b }){
    console.log(a);
    console.log(b);
}
print(object);
//1
//2</code></pre>
<blockquote>
<h4 id="📌예제3">📌예제3</h4>
<pre><code class="language-javascript">const { red, yellow, green } = {
   red : &#39;RED&#39;,
   yellow : &#39;YELLOW&#39;,
   green : &#39;GREEN&#39;
};</code></pre>
<p>배열 비구조화 다른 점이 있다면,
배열 비구조화의 경우에는 <code>index</code>에 따라 값이 할당되지만,
<strong>객체 비구조화의 경우에는 <code>동일한 key값</code>에 할당된다</strong></p>
</blockquote>
<hr>
<h2 id="💻비구조화-할당의-장점">💻비구조화 할당의 장점</h2>
<ol>
<li>배열, 객체 내 <strong>값을 추출하는 코드</strong>가 매우 <strong>간단</strong>해짐</li>
<li><strong>필요한 객체와 나머지 요소 분리가 매우 간단</strong>하다</li>
<li><strong>기본값 지정</strong>이 가능하다</li>
</ol>
<blockquote>
<h4 id="📌비구조화할당-전-코드-예시1">📌비구조화할당 &#39;전&#39; 코드 예시1</h4>
<pre><code class="language-javascript">//비구조화할당 전 코드
let fruit = [&#39;apple&#39;, &#39;banana&#39;, &#39;peach&#39;];

let apple = fruit[0];
let banana = fruit[1];
let peach = fruit[2];

console.log(apple);        //apple
console.log(banana);    //banana
console.log(peach);        //peach</code></pre>
<hr>
<h4 id="📌비구조화할당-전-코드-예시2">📌비구조화할당 &#39;전&#39; 코드 예시2</h4>
<pre><code class="language-javascript">const colors = {
   red : &#39;RED&#39;,
   yellow : &#39;YELLOW&#39;,
   green : &#39;GREEN&#39;
};
const red = colors.red;
const yellow = colors.yellow;
const green = colors.green;</code></pre>
</blockquote>
<p>각 배열 안에 있는 요소들을 사용하기 위해서는 각각의 변수 안에 배열 내 <code>index</code> 또는 <code>key값</code>을 찾아서 <strong><u>매칭</u></strong>시켜주어야함.</p>
<hr>
<blockquote>
<h4 id="📌비구조화할당-코드-예시">📌비구조화할당 코드 예시</h4>
<pre><code class="language-javascript">//비구조화할당 코드
let fruits = [&#39;apple&#39;, &#39;banana&#39;, &#39;peach&#39;];
let [apple, banana, peach] = fruits;

console.log(apple);        //apple
console.log(banana);    //banana
console.log(peach);        //peach</code></pre>
</blockquote>
<p>한 줄로 <strong>바로 배열 안에 넣어</strong>주는 것이 가능함. <code>비구조화할당 코드</code>를 이용하면 왼쪽의 변수에 오른쪽 배열 값을 <strong>바로 분해해서 할당</strong>해줌</p>
<hr>
<h2 id="💻속성-이름이-유효한-javascript-식별자명이-아닌-경우">💻속성 이름이 유효한 JavaScript 식별자명이 아닌 경우</h2>
<p>구조분해는 <code>JavaScript</code> 식별자 이름으로 적합하지 않은 속성명이 제공된 경우에도 이용할 수 있다. 이 때, <strong>대체할 유효한 식별자명을 제공해야 한다.</strong></p>
<blockquote>
<pre><code class="language-javascript">const foo = { &#39;fizz-buzz&#39; : true };
const { &#39;fizz-buzz&#39;: fizzBuzz } = foo;

console.log(fizzBuzz); //true</code></pre>
</blockquote>
<hr>
<h2 id="💻비구조화-할당-구조-분해">💻비구조화 할당 구조 분해</h2>
<p>: 1:1로 값이 매칭되는 것이 아니라 <strong>하나의 값은 변수에 넣고 나머지는 나머지 변수에 할당하는 것이 가능</strong>.
전개 연산자인 <code>...</code>을 이용하면 <strong>매칭된 값 외의 <u>모든 데이터 값을 할당할 수 있음</u></strong>.</p>
<blockquote>
<pre><code class="language-javascript">let fruit = [&#39;apple&#39;, &#39;banana&#39;, &#39;peach&#39;, pear&#39;];
let [apple, ...etc] = fruit;

console.log(apple); //하나의 값은 변수에 넣음
console.log(etc);     //[&#39;banana&#39;, &#39;peach&#39;, &#39;pear&#39;]
//spread 문법을 사용하면 매칭된 값 외에 모든 데이터 할당 가능</code></pre>
</blockquote>
<ul>
<li><code>...</code>을 이용하면 하나의 변수를 할당하고 나머지 값들을 모두 넣어준다</li>
<li><strong><code>...</code>인 전개 연산자를 사용하기 위해서는 <u>가장 마지막 요소에 넣어주어야함</u></strong></li>
</ul>
<hr>
<h2 id="💻선언에서-분리한-할당-및-변수-값-교환">💻선언에서 분리한 할당 및 변수 값 교환</h2>
<blockquote>
<h4 id="📌배열-비구조화-예시">📌배열 비구조화 예시</h4>
<pre><code class="language-javascript">//선언에서 분리한 할당
const colorList = [&#39;red&#39;, &#39;yellow&#39;, &#39;green&#39;];
let red, yellow, green;

[red, yellow, green] = colorList;

//변수값 교환
let a = 1;
let b = 3;

[a, b] = [b, a];
console.log(a); //3
console.log(b); //1</code></pre>
</blockquote>
<p><strong>미리 선언되어 있는 변수를 통해서도 비구조화 할당이 가능하다</strong></p>
<p>그리고 비구조화 할당을 활용한 변수값의 교환이 가능한데,
이는 두 변수의 값을 서로 교환하기 위해서는 <strong>기존에는 임시 변수가 필요했었으나 비구조화 할당을 통해 임시변수가 필요하지 않고 위 예제처럼 서로 교환이 가능하다</strong></p>
<blockquote>
<h4 id="📌객체-비구조화-예시1">📌객체 비구조화 예시1</h4>
<pre><code class="language-javascript">const colors = {
   red : &#39;RED&#39;,
   yellow : &#39;YELLOW&#39;,
   green : &#39;GREEN&#39;
};

let red, yellow, green;
({ red, yellow, green } = colors);</code></pre>
</blockquote>
<blockquote>
<h4 id="📌객체-비구조화-예시2">📌객체 비구조화 예시2</h4>
<pre><code class="language-javascript">let a, b;
({a, b} = {a:1, b:2}); //let {a, b} = {a:1, b:2}와 동일</code></pre>
</blockquote>
<p>객체 비구조화에서도 선언에서 분리한 할당이 가능하나, 주의해야할 점은 <strong><code>괄호()</code>를 사용해주어야 한다는 점</strong>이다.</p>
<p><strong>스크립트에서는 <code>블록{}</code>으로 간주하기 때문에 위 예제처럼 괄호로 감싸주어야한다.</strong></p>
<ul>
<li>괄호 역시 꼭 <code>세미콜론(;)</code>을 넣어 끝났다는 표시를 해주어야 한다</li>
</ul>
<hr>
<h2 id="💻기본값-지정">💻기본값 지정</h2>
<p>: 만약 지정한 변수 이외에 <strong>매칭할 값이 없다면 <code>undefined</code>가 발생한다.</strong> </p>
<ul>
<li>변수 집합의 길이보다 우측의 할당하려는 배열의 길이가 길면 상관없지만 그 반대로 <strong><u>변수 집합의 길이보다 우측의 할당하려는 배열의 길이가 짧을 경우 문제가 생긴다</u></strong>.</li>
<li><strong>이를 방지하기 위해 <code>기본값</code>을 할당할 수 있다</strong></li>
<li><strong>기본값을 할당할 경우 비구조화 할당을 하려는 값이 <code>undefined</code>일 때 기본값을 대신 사용하여 할당한다.</strong></li>
</ul>
<blockquote>
<h4 id="📌비구조화할당-코드-예시1">📌비구조화할당 코드 예시1</h4>
<pre><code class="language-javascript">let fruit = [&#39;apple&#39;, &#39;banana&#39;, &#39;peach&#39;];
let [apple, banana, peach, pear=&#39;pear&#39;] = fruit;

console.log(apple);        //&#39;apple&#39;
console.log(banana);    //&#39;banana&#39;
console.log(peach);        //&#39;peach&#39;
console.log(pear);        //&#39;pear&#39;</code></pre>
<p>pear은 fruit 배열 안에 없으나, <strong>구조분해할당에서 <code>기본값</code>을 지정해주었기 때문에</strong> 해당값이 콘솔에 찍힌다</p>
</blockquote>
<blockquote>
<h4 id="📌비구조화할당-코드-예시2">📌비구조화할당 코드 예시2</h4>
<pre><code class="language-javascript">const object = { a:1 };

function print({ a, b=2 }){
   console.log(a);
   console.log(b);
}

print(object);
//1
//2</code></pre>
<p><strong>b에게 <code>기본값</code>을 주고 싶</strong>다면 위와 같이 처리도 가능하다</p>
</blockquote>
<blockquote>
<h4 id="📌비구조화할당-코드-예시2-1">📌비구조화할당 코드 예시2</h4>
<pre><code class="language-javascript">//기본값 할당 x
const [ a, b, c ] = [1, 2];
console.log(a); //1
console.log(b); //2
console.log(c); //undefined

//기본값 할당 o
const [ a=4, b=5, c=6] = [1, 2];
console.log(a); //1
console.log(b); //2
console.log(c); //6</code></pre>
</blockquote>
<hr>
<h2 id="💻일부-반환값-무시하기">💻일부 반환값 무시하기</h2>
<p>필요하지 않은 반환값을 무시할 수 있다</p>
<pre><code class="language-javascript">function f(){
    return [1, 2, 3];
}

let [a, , b] = f();
console.log(a); //1
console.log(b); //3</code></pre>
<p>반환값을 모두 무시할 수도 있다</p>
<pre><code class="language-javascript">[, ,] = f();</code></pre>
<hr>
<h2 id="💻원래-key대신-다른-변수명-사용">💻원래 key대신 다른 변수명 사용</h2>
<pre><code class="language-javascript">//새로운 변수명 할당과 기본값 할당의 동시 사용
const {a:aa = 4, b:bb = 5, c:cc = 6} = {a:1, b:2};
console.log(aa); //1
console.log(bb); //2
console.log(cc); //6</code></pre>
<p>객체 비구조화는 동일한 <code>key값</code>을 통해 할당이 되는데
해당 <code>key값</code>은 <strong>할당 받은 후, 새롭게 사용할 변수명을 콜론<code>:</code>을 통해 변경할 수 있다</strong></p>
<p>그리고 <strong>동시에 기본값 할당도 사용할 수 있다</strong></p>
<hr>
<h2 id="💻변수에-배열의-나머지-값들-할당하기">💻변수에 배열의 나머지 값들 할당하기</h2>
<h5 id="배열-결합합치기깊은-복사">(배열 결합/합치기/깊은 복사)</h5>
<p>: 나머지 매개 변수 및 확산 연산자 (Rest parameter and Spread operator)라고도 한다</p>
<pre><code class="language-javascript">//1. 배열의 나머지 값 할당
const [a, ...b] = [1, 2, 3];
console.log(a); //1
console.log(b); //[2, 3]

//2. 배열의 결합
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];
console.log(arr3); //[1, 2, 3, 4, 5, 6]

/*
const arr3 = [arr1, arr2];
위와 같이 선언하면 아래와 같이
배열 자체를 통째로 담아낸 결과값이 나온다

나머지 구문(&#39;...&#39;)을 사용해야
배열이 결합되어 변수 안에 새롭게 담긴다
*/</code></pre>
<p><img src="https://velog.velcdn.com/images/ssarr_i/post/85b56ba2-c033-44f5-998f-555930bac5e0/image.png" alt=""></p>
<pre><code class="language-javascript">//3. 배열의 복사
const arr1 = [1, 2, 3];
const arr2 = arr1;
const arr3 = [...arr1];
const [...arr4] = arr1;

arr1[0] = 7;
console.log(arr1); //[7, 2, 3]
console.log(arr2); //[7, 2, 3]
console.log(arr3); //[1, 2, 3]
console.log(arr4); //[1, 2, 3]

/*
arr1[0] 자리에 7을 대입해서
arr1과 arr2는 [1,2,3]에서 [7,2,3]으로 변하지만

arr3, arr4는 arr1을 나머지 구문(&#39;...&#39;)을 사용하여 복사해두었기 때문에
console로 찍어보면 [1,2,3]의 값을 가진다
*/</code></pre>
<p>나머지 구문 <code>...</code>을 사용하여 배열을 결합하거나 복사할 수 있다</p>
<blockquote>
<p>나머지 요소의 오른쪽 뒤에 쉼표가 있으면 <code>SyntaxError</code>가 발생한다</p>
<pre><code class="language-javascript">var [a, ...b, ] = [1, 2, 3];
//SyntaxError: rest element may not have a trailing comma</code></pre>
</blockquote>
<pre><code>
_ _ _

## 💻변수에 객체의 나머지 값들 할당하기
##### 객체 결합/합치기/깊은복사
: 나머지 매개 변수 및 확산 연산자(Rest parameter and Spread operator)라고도 한다

```javascript
//객체의 나머지 값 할당
const {a, ...b} = {a:1, b:2, c:3};
console.log(a); //1
console.log(b); //{b:2, c:3}

//객체의 결합
const obj1 = {a:1, b:2, c:3};
const obj2 = {c:4, d:5, e:6};
const obj3 = {...obj1, ...obj2};
console.log(obj3); //{a:1, b:2, c:4, d:5, e:6}

//객체의 복사
const obj1 = {a:1, b:2, c:3};
const obj2 = {
  ...obj1,
  c:4,
  d:5
}
console.log(obj2); //{a:1, b:2, c:4, d:5}</code></pre><p><strong>객체의 나머지값 할당</strong>에 대해서는 **객체 비구조화 할당의 원리가 아무리 <code>key값</code> 매칭이라고 하여도 <u>나머지 값을 뜻ㅅ하는 구문 전개연산자(<code>...</code>)는 우항의 <code>key</code>에 영향을 받지 않으므로 <code>b</code>라는 <code>key값</code>에 나머지 값들이 할당</u>되는 것을 볼 수 있다.</p>
<p>그 다음 <u>객체의 결합</u>에 있어서는, <strong>중복되는 <code>key값</code>에 대해서는 마지막으로 결합된 <code>key값</code>을 따르게 된다.</strong>
위 예제에서는 <code>c</code>의 값이 3이 아닌 4로 할당된 것을 볼 수 있다.</p>
<hr>
<h2 id="💻깊은-값-비구조화-할당">💻깊은 값 비구조화 할당</h2>
<p>: 객체의 깊숙한 곳에 들어있는 값을 꺼내는 방법에는 <strong>두 가지</strong>가 있다</p>
<blockquote>
<pre><code class="language-javascript">const deepObject = {
   state: {
       information: {
           name: &#39;velopert&#39;,
           languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
       }
   },
   value: 5
}</code></pre>
</blockquote>
<p>여기서 만약 <code>name</code>, <code>languages</code>, <code>value</code> 값들을 밖으로 꺼내고 싶다면 <strong>첫번째로 <u>비구조화 할당 문법을 두 번 사용</u>한다</strong></p>
<blockquote>
<h4 id="📌깊은-값-꺼내는-비구조화할당-코드-예시1">📌깊은 값 꺼내는 비구조화할당 코드 예시1</h4>
<h5 id="es6-의-object-shorthand-문법">ES6 의 object-shorthand 문법</h5>
<pre><code class="language-javascript">const deepObject = {
    state: {
        information: {
            name: &#39;velopert&#39;,
            languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
        }        
    },
    value: 5
};

const { name, languages } = deepObject.state.information;
const { value } = deepObject;

const extracted = {
    name,
    languages,
   value
}</code></pre>
<p>만약 <code>key</code> 이름으로 선언된 값이 존재한다면 바로 매칭시켜주는 문법이다.</p>
</blockquote>
<p><code>extracted 객체</code>를 선언한 저 코드는 아래의 코드와 동일하다</p>
<pre><code class="language-javascript">const extracted = {
    name: name,
      languages: languages,
      value: value
}</code></pre>
<hr>
<p><code>deepObject</code> 객체에서 <code>names</code>, <code>languages</code>, <code>value</code>를 추출하는 과정에서 구조화할당을 두 번 했는데,
이번에는 <strong>한 번에 모두 추출하는 방법</strong>을 살펴보자</p>
<blockquote>
<h4 id="📌깊은-값-꺼내는-비구조화할당-코드-예시2">📌깊은 값 꺼내는 비구조화할당 코드 예시2</h4>
<pre><code class="language-javascript">const deepObject = {
   state: {
       information: {
           name: &#39;velopert&#39;,
           languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
       }
   },
   value: 5
};

const {
   state: {
       information: { name, languages }
   },
   value
} = deepObject;

const extracted = {
   name,
   languages,
   value
}

console.log(extracted);</code></pre>
</blockquote>
<hr>
<h2 id="💻비구조화-할당-시-이름-바꾸기">💻비구조화 할당 시 이름 바꾸기</h2>
<blockquote>
<pre><code class="language-javascript">const animal = {
   name: &#39;멍멍이&#39;,
     type: &#39;개&#39;
};

const nickname = animal.name;
console.log(nickname); //멍멍이</code></pre>
</blockquote>
<p>위 코드에서 <code>animal.name</code> 값을 <code>nickname</code> 값에 담고 있는 상태임
이름이 같다면 <u>비구조화 할당을 쓰면 되는데 지금은 이름이 다른 상태임</u></p>
<p>이런 상황에서 <strong><code>:</code> 문자를 사용하여 이름을 바꾸어줄 수 있다</strong></p>
<blockquote>
<h4 id="📌비구조화할당-이름-변경-예시1">📌비구조화할당 이름 변경 예시1</h4>
<pre><code class="language-javascript">const animal = {
    name: &#39;멍멍이&#39;,
      type: &#39;개&#39;
};

const { name: nickname } = animal;
console.log(nickname); //멍멍이</code></pre>
</blockquote>
<p>위 코드는 <strong><code>animal</code> 객체 안에 있는 <code>name</code>을 <code>nickname</code>이라고 선언하겠다</strong>는 의미이다</p>
<hr>
<hr>
<p><a href="https://velog.io/@kimhyesu-_-/JavaScript-%EB%B9%84%EA%B5%AC%EC%A1%B0%ED%99%94-%ED%95%A0%EB%8B%B9%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9">참조 블로그1 :: [JavaScript] 비구조화 할당/구조분해할당</a>
<a href="https://learnjs.vlpt.us/useful/06-destructuring.html">참조 블로그2 :: 06. 비구조화 할당 (구조분해) 문법</a>
<a href="https://mine-it-record.tistory.com/466">참조 블로그3 :: [ES6+] 배열 및 객체의 비구조화 할당- Destructuring Assignment (ft. 나머지 매개 변수 및 확산 연산자 - Rest parameter and Spread operator)</a>
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">참조 페이지4 :: (MDN) 구조분해할당</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] Array 내장함수1]]></title>
            <link>https://velog.io/@ssarr_i/js-Array-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%981</link>
            <guid>https://velog.io/@ssarr_i/js-Array-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%981</guid>
            <pubDate>Mon, 12 Jun 2023 08:33:06 GMT</pubDate>
            <description><![CDATA[<ol>
<li><code>toString()</code> : 배열을 문자로 변환</li>
<li><code>join()</code> : 구분자를 활용해 문자열로 이어붙이기</li>
<li><code>pop()</code> : 배열의 마지막요소 제거 (리턴 값으로 잘라낸 요소 반환)</li>
<li><code>push()</code> : 배열의 끝부분에 새로운 요소 추가 (리턴 값으로 배열의 길이 반환)</li>
<li><code>shift()</code> : 배열의 첫부분 요소 제거 (리턴 값으로 잘라낸 요소 반환)</li>
<li><code>unshift()</code> : 배열의 첫부분에 새로운 요소 추가</li>
<li><code>splice(삽입위치, 잘라낼 개수, 추가할 내용)</code> : 배열에 새로운 요소를 잘라서 붙임</li>
<li><code>concat()</code> : 두개의 배열 합치기</li>
<li><code>slice()</code> : 배열 잘라내기</li>
<li><code>sort()</code> : 알파벳 순으로 요소 정렬</li>
<li><code>reverse()</code> : 역순으로 요소 정렬</li>
<li><code>sort((a, b) =&gt; {return a-b})</code> : 올림차순으로 정렬</li>
<li><code>sort((a, b) =&gt; {return b-a})</code> : 내림차순으로 정렬</li>
<li><code>sort((a, b) =&gt; {return a-b})[0]</code> : 최소값 반환</li>
<li><code>sort((a, b) =&gt; {return b-a})[0]</code> : 최대값 반환</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 문자열 내장함수]]></title>
            <link>https://velog.io/@ssarr_i/js-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@ssarr_i/js-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 12 Jun 2023 08:05:20 GMT</pubDate>
            <description><![CDATA[<ol>
<li>문자열<code>.length</code>: 문자열의 길이를 반환</li>
<li>문자열<code>.indexOf()</code>: 찾고자 하는 문자열의 위치 반환</li>
<li>문자열<code>.slice()</code>: 문자열에서 특정 부분을 추출해서 새로운 문자열로 반환</li>
<li>문자열<code>.substr()</code>: 문자열에서 특정 부분을 잘라냄</li>
<li>문자열<code>.replace()</code>: 문자열에서 특정 문자값을 바꿔치기</li>
<li>문자열<code>.split()</code>: 문자열을 배열로 변환</li>
</ol>
<pre><code class="language-javascript">const txt = &quot;Hello World&quot;;

//1. .length
console.log(txt.length);        //11

//2. .indexOf()
console.log(txt.indexOf(&quot;Wo&quot;));    //6
console.log(txt.indexOf(&quot;apple&quot;));//-1

//3. .slice()
const txt2 = txt.slice(0, 4);
console.log(txt2);                //Hell

//4-1. .substr()
const txt3 = txt.substr(6, 3);    //6번째 글자에서부터 3글자 잘라냄
console.log(txt3);                //Wor

//4-2. .substr()
const origin = &quot;학교종이 땡떙땡 어서모이자 선생님이 우리를 기다리신다.&quot;;
let result = &#39;&#39;;

if(origin.length &gt; 15) ? result = origin.substr(0, 15) + &#39;...&#39; : result = origin;

console.log(result);

//5. .replace()
const introduce = &quot;우리 ABC회사는 높은 품질의 제품을 만들고 있으며 ABC라는 회사 브랜드 가치를 높이기 위해서 노력하고 있습니다. 앞으로 우리 ABC회사 제품을 많이 애용해주세요.&quot;;

const introduce2 = introduce.replace(&quot;ABC&quot;, &quot;BBC&quot;);
const introduce2 = introduce.replace(/ABC/g, &quot;BBC&quot;);
console.log(introduce2);    //우리 BBC회사는 높은 품질의 제품을 만들고 있으며 BBC라는 회사 브랜드 가치를 높이기 위해서 노력하고 있습니다. 앞으로 우리 BBC회사 제품을 많이 애용해주세요.

//6. .split()
const colors = &quot;red green blue&quot;;
const arr = colors.split(&#39;&#39;);
console.log(arr);            //[&#39;red&#39;, &#39;green&#39;, &#39;blue&#39;]
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] forEach()와 map()의 차이점]]></title>
            <link>https://velog.io/@ssarr_i/js-forEach%EC%99%80-map%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@ssarr_i/js-forEach%EC%99%80-map%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Mon, 12 Jun 2023 06:29:08 GMT</pubDate>
            <description><![CDATA[<h2 id="1-새로운-배열을-반환하는-map">1. 새로운 배열을 반환하는 map()</h2>
<p><code>forEach()</code>가 배열 요소마다 한 번씩 주어진 함수(콜백)를 실행하는 것과 달리,
<code>map()</code>은 배열 내의 모든 요소 각각에 대하여 <strong>주어진 함수(콜백)를 호출한 결과들을 모아 <u>새로운 배열을 반환한다</u></strong>는 특징을 가지고 있다</p>
<p>그리고 그 함수는</p>
<ol>
<li><strong>currentValue</strong> (배열 원소의 값)</li>
<li><strong>index</strong> (현재 요소의 인덱스)</li>
<li><strong>array</strong> (현재 배열)</li>
</ol>
<p>이 세 개의 인자를 가지고 호출된다.</p>
<hr>
<p>배열의 각 원소에 <code>3</code>을 곱하는 코드를 <code>forEach()</code>와 <code>map()</code>의 특징에 맞게 짜본다면 다음과 같이 작성이 가능하다</p>
<h4 id="예시-foreach">예시: forEach();</h4>
<pre><code class="language-javascript">const arr = [1, 2, 3, 4, 5];
const mulArr = [];

arr.forEach(num =&gt; {
     mulArr.push(num * 3);
});

console.log(mulArr); //[3, 6, 9, 12, 15]</code></pre>
<h4 id="예시-map">예시: map();</h4>
<pre><code class="language-javascript">const arr;
const mulArr = arr.map(num =&gt; num * 3);

console.log(mulArr); //[3, 6, 9, 12, 15]</code></pre>
<hr>
<h2 id="2-return값을-보내지-않는-foreach">2. return값을 보내지 않는 forEach()</h2>
<p>forEach()는 밖으로 <code>return</code>값을 반환하지 못한다.</p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4, 5];
let a = arr.forEach(function(value){
    return value;
});

console.log(a); //undefined</code></pre>
<p>위와 같이 <code>forEach()</code>를 <code>return</code>하면 <code>undefined</code> 값을 얻게 된다.</p>
<p>하지만 같은 경우라도 <code>map()</code>을 이용하면 다르다.</p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4, 5];
let a = arr.map(function(value){
    return value + 1;
});

console.log(a); //[2, 3, 4, 5, 6]</code></pre>
<p>위의 경우에는 <code>[2, 3, 4, 5, 6]</code>이 들어있는 배열이 출력된다.</p>
<p><strong><u><code>map()</code>은 리턴값을 출력할 수 있다.</u></strong></p>
<p>즉, <code>forEach()</code>와 <code>map()</code>의 가장 큰 차이는 리턴값에 있다.</p>
<p>또한, <u><strong><code>forEach()</code>는 기존의 Array를 변경</strong></u>하는 반면, <strong><u><code>map()</code>은 새로운 Array를 반환</u></strong>한다.</p>
<hr>
<h2 id="3-reduce">3. reduce()</h2>
<p><code>reduce()</code>의 문법은 아래와 같다.</p>
<blockquote>
<pre><code class="language-javascript">[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
   return accumulator + currentValue;
});</code></pre>
</blockquote>
<p><code>reduce()</code>의 인자로는 <strong>총 4개</strong>를 받을 수 있는데,
<code>이전값</code>, <code>현재값</code>, <code>index</code>, <code>배열</code>을 받을 수 있다.</p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4, 5];
let a = arr.reduce(function(preValue, currentValue){
    return preValue + currentValue;
});

console.log(a); //15
/*
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
*/</code></pre>
<p>앞과 뒤의 값을 더하여 <code>15</code>라는 값을 도출하는 것을 알 수 있다.</p>
<p><code>preValue</code>만 리턴할 경우, 배열의 첫번째 요소인 <code>1</code>이 리턴된다.
<code>currentValue</code>는 배열의 마지막 요소인 <code>5</code>가 리턴된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] switch문]]></title>
            <link>https://velog.io/@ssarr_i/js-switch%EB%AC%B8</link>
            <guid>https://velog.io/@ssarr_i/js-switch%EB%AC%B8</guid>
            <pubDate>Mon, 12 Jun 2023 05:10:34 GMT</pubDate>
            <description><![CDATA[<h3 id="조건문-switch">조건문 switch</h3>
<ul>
<li>여러 개의 코드블록 중에서 하나를 선택해야할 때 사용</li>
<li><code>if문</code>과 다르게 부등호로 조건이 들어갈 경우 사용할 수 없다</li>
<li><code>switch문</code>은 <code>=</code> 등호 형태의 조건문</li>
<li>모든 <code>switch문</code>은 <code>if문</code>으로 바꿀 수 있지만 <code>if문</code>에서 부등식이 사용된 경우에는 <code>switch문</code>으로 치환할 수 없음</li>
</ul>
<p>그러나 <code>switch문</code>을 사용함으로써 <code>if문</code>보다 좀 더 코드의 가독성이 좋게끔 작성할 수 있으며 <code>if문</code>보다 <code>switch문</code>이 미세하게 빠르기 때문에 <code>switch문</code>으로 작성할 수 있는 코드가 있다면 <code>if문</code>보다 <code>switch문</code>으로 코딩하는 습관을 가지는 것이 좋다</p>
<blockquote>
<pre><code class="language-javascript">swtich(표현식){
    case A:
        //실행할 코드 블록
        break;
    case B:
        //실행할 코드블록
        break;
    default:
        //실행할 코드블록
}
//여기서 A, B는 switch문 안의 표현식의 결과값을 의미함</code></pre>
</blockquote>
<pre><code>
_ _ _
#### 예제
```javascript
//요일을 구하는 switch문
switch(new Date().getDay()){
    case 0:
        console.log(&#39;Sunday&#39;);
        break;
    case 1:
        console.log(&#39;Monday&#39;);
        break;
    case 2:
        console.log(&#39;Tuesday&#39;);
        break;
    case 3:
        console.log(&#39;Wednesday&#39;);
        break;
    case 4:
        console.log(&#39;Thursday&#39;);
        break;
    case 5:
        console.log(&#39;Friday&#39;);
        break;
    case 6:
        console.log(&#39;Saturday&#39;);
        break;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 함수의 종류]]></title>
            <link>https://velog.io/@ssarr_i/js-%ED%95%A8%EC%88%98%EC%9D%98-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@ssarr_i/js-%ED%95%A8%EC%88%98%EC%9D%98-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Mon, 12 Jun 2023 05:03:38 GMT</pubDate>
            <description><![CDATA[<h1 id="함수-function">함수 (function)</h1>
<blockquote>
<p> 자주 쓰는 실행코드들을 블록 단위로 묶어서 패키징 해놓은 형태
 자주 쓰는 코드들을 기능단위로 재사용하기 위함</p>
<p><code>함수정의</code>
: 미리 function 키워드를 이용해서 자주 쓸 코드들을 묶어서 정의하는 행위</p>
<p><code>함수호출</code>
: 정의되어 있는 함수를 호출해야지만 기능이 실행됨</p>
</blockquote>
<hr>
<h1 id="함수의-종류">함수의 종류</h1>
<h3 id="1-선언적-함수">1. 선언적 함수</h3>
<ul>
<li>함수에 미리 이름을 붙여서 정의해놓은 형태</li>
<li>자바스크립트 파일을 읽을 때 선언적함수를 우선적으로 읽어줌</li>
<li>선언적 함수는 호출위치가 자유로움</li>
</ul>
<h3 id="2-익명함수">2. 익명함수</h3>
<ul>
<li>함수에 이름 없이 정의하는 형태</li>
<li>익명함수 자체만으로는 호출이 불가능</li>
<li>변수에 익명함수를 대입하거나(대입형) 특정 이벤트 객체에 대입하는 식으로 호출 가능</li>
</ul>
<h3 id="3-대입형함수">3. 대입형함수</h3>
<ul>
<li>변수에 익명함수가 대입된 형태</li>
</ul>
<h3 id="4-즉시실행함수">4. 즉시실행함수</h3>
<ul>
<li>함수가 자기자신을 정의하자마자 바로 자신을 호출</li>
<li>즉시실행함수를 쓰는 이유<ul>
<li>즉시실행함수 안쪽의 값들을 캡슐화</li>
</ul>
</li>
</ul>
<h3 id="5-화살표-함수">5. 화살표 함수</h3>
<ul>
<li>기존의 익명함수를 좀 더 쓰기 편하게 축약한 형태</li>
<li>내부로 전달되는 파라미터가 하나면 괄호는 생략 가능</li>
<li>코드블록 안에서 실행되는 코드가 한줄이면 코드블록 괄호도 생략 가능</li>
</ul>
<blockquote>
<p>(1) <code>함수 매개변수 (parameter)</code>
: 함수외부에서 함수 내부로 특정 값을 전달하기 위한 통로 이름</p>
<p>(2) <code>인수 (argument)</code>
: 함수를 호출할 때 파라미터를 통해서 전달되는 값</p>
<p>(3) <code>반환값 (return)</code>
: 함수 내부에서 만들어진 값을 함수 호출 시 외부로 반환
: 함수구문 실행 도중 특정 시점에서 강제로 코드가 실행 중단될 때</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 반복문 총정리(for in/for of/forEach 등)]]></title>
            <link>https://velog.io/@ssarr_i/js-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%B4%9D%EC%A0%95%EB%A6%ACfor-infor-offorEach-%EB%93%B1</link>
            <guid>https://velog.io/@ssarr_i/js-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%B4%9D%EC%A0%95%EB%A6%ACfor-infor-offorEach-%EB%93%B1</guid>
            <pubDate>Fri, 09 Jun 2023 04:57:18 GMT</pubDate>
            <description><![CDATA[<h1 id="자바스크립트-반복문의-종류">자바스크립트 반복문의 종류</h1>
<ol>
<li><strong>for</strong>: 고전적 for문</li>
<li><strong>for in</strong>: 객체의 <code>프로퍼티 키 열거</code> 전용</li>
<li><strong>for of</strong>: 이터러블 순회 전용</li>
<li><strong>forEach()</strong>: <code>배열 순회</code> 전용 메서드</li>
<li><strong>while</strong>: 고전적 while문</li>
<li><strong>do while</strong>: 고전적 do...while문</li>
<li><strong>Object 객체 메서드</strong>: 객체 순회 전용</li>
<li><strong>Array.prototype 메서드</strong>: 배열 전용</li>
</ol>
<hr>
<hr>
<h2 id="1-for문">1. for문</h2>
<blockquote>
<p><code>for문</code>은 <code>while문</code>과는 다르게 자체적으로 <strong>초기식</strong>, <strong>표현식</strong>, <strong>증감식</strong>을 모두 포함하고 있는 반복문
따라서 <code>while문</code>보다 더 간결하게 반복문 표현이 가능하다</p>
<pre><code class="language-javascript">for(let i=0; i&lt;10; i++){ ... 반복 수행 코드 ... }</code></pre>
</blockquote>
<pre><code class="language-javascript">for (let i=0; i&lt;10; i++){
  console.log(i);
}
/* 주의: 변수 선언 시, const를 사용하면 값 변경이 불가능하여 에러가 발생함 */</code></pre>
<hr>
<h2 id="2-for-in문">2. for in문</h2>
<blockquote>
<p>해당 객체의 모든 열거할 수 있는 프로퍼티(enumerable properties)를 순회할 수 있도록 해줌</p>
<ul>
<li><em>※ 열거할 수 있는 프로퍼티란 내부적으로 enumerable 플래그가 true로 설정된 프로퍼티를 의미함</em></li>
</ul>
<p>이러한 프로퍼티들은 for in문으로 접근할 수 있음</p>
<pre><code class="language-javascript">for(const key in 객체){ ... 반복 수행 코드 ... }</code></pre>
</blockquote>
<pre><code class="language-javascript">const obj = {
  name: &#39;ssari&#39;,
  job: &#39;publisher&#39;,
}

for (const key in obj){
    console.log(`${key} : ${obj[key]}`);
}
//name: ssari
//job: publisher</code></pre>
<hr>
<pre><code class="language-javascript">var obj = {
    name : &quot;이순신&quot;,
    age : 20
};

for (var i in obj) {
    document.write(i + &quot;&lt;br&gt;&quot;);
}
//name
//age</code></pre>
<hr>
<h2 id="3-for-of문">3. for of문</h2>
<blockquote>
<p>반복할 수 있는 객체(iterable objects)를 순회할 수 있도록 해주는 반복문
자바스크립트에서 반복할 수 있는 객체에는 <code>Array</code>, <code>Map</code>, <code>Set</code>, <code>arguments</code>, <code>String</code>, <code>DOM컬렉션(HTMLCollection, NodeList)</code> 등이 있음
해당 반복문은 루프마다 객체의 열거할 수 있는 프로퍼티 값을 지정된 변수에 대입함
for of문은 <strong><code>익스플로러</code>에서 지원하지 않음</strong></p>
</blockquote>
<pre><code class="language-javascript">const arr = [11, 22, 33];

for(const item of arr){
    console.log(item);
  //11, 22, 33 출력
}

/* 아래와 같이 for of문을 한 줄로 사용할 수도 있다 */
for(const item of arr) console.log(item);</code></pre>
<hr>
<h2 id="4-foreach">4. forEach()</h2>
<blockquote>
<pre><code class="language-javascript">배열.forEach( function(value, index, array){ ... 반복 수행 코드 ... })</code></pre>
<ul>
<li><code>콜백함수</code>의 <code>매개변수</code>로 value에 요소값, index에 인덱스, array에 원본 배열이 들어온다</li>
</ul>
</blockquote>
<pre><code class="language-javascript">[10, 20, 30].forEach((value, index, array) =&gt; {
    console.log(`${index} : ${value}`);
});
//0:10, 1:20, 2:30 출력</code></pre>
<hr>
<h2 id="5-while문">5. while문</h2>
<p>잘 사용하지 않는다</p>
<pre><code class="language-javascript">let num = 0;
while(num &lt; 3){
    console.log(num);
    num++;
}
//0~2까지 출력</code></pre>
<hr>
<h2 id="6-do-while문">6. do while문</h2>
<blockquote>
<pre><code class="language-javascript">do{
   console.log(&#39;일단 한 번은 실행된다); //해당 코드 한 번 실행한 수 
}while </code></pre>
</blockquote>
<p>참고: <a href="https://curryyou.tistory.com/202">https://curryyou.tistory.com/202</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 식별자, 예약어, 실행문]]></title>
            <link>https://velog.io/@ssarr_i/js-%EC%8B%9D%EB%B3%84%EC%9E%90-%EC%98%88%EC%95%BD%EC%96%B4-%EC%8B%A4%ED%96%89%EB%AC%B8</link>
            <guid>https://velog.io/@ssarr_i/js-%EC%8B%9D%EB%B3%84%EC%9E%90-%EC%98%88%EC%95%BD%EC%96%B4-%EC%8B%A4%ED%96%89%EB%AC%B8</guid>
            <pubDate>Wed, 07 Jun 2023 05:39:02 GMT</pubDate>
            <description><![CDATA[<h3 id="식별자">식별자</h3>
<p>사용자가 임의로 만드는 명칭</p>
<blockquote>
<p>ex) <code>const</code>, <code>let</code>
식별자를 작성할 때에는 예약어는 피해야함</p>
</blockquote>
<h3 id="예약어">예약어</h3>
<p>자바스크립트 자체적으로 특정 기능을 실행하기 위해 예약된 명령어</p>
<h3 id="실행문">실행문</h3>
<p>특정 명령어를 실행하기 위한 구문</p>
<blockquote>
<p>ex) <code>document.querySelector();</code>
여러 가지의 예약어가 모여 실행문이 되기도 함</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>