<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>즐거운 코딩 생활 ( funyphp ) &amp;gt; community &amp;gt; javascript&amp;amp;jQuery</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript</link>
<language>ko</language>
<description>javascript&amp;amp;jQuery (2022-01-20 13:28:48)</description>

<item>
<title>[ javascript ] CDATA 사용 이유</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=64</link>
<description><![CDATA[<p>1) CDATA로 감싼 JAVASCRIPT부분이 의도치 않게 XML Parser 에 의해 잘못 인식되는 것을 막기 위함.</p>
<p>2) XHTML이 아닌 HTML로 인식되는 경우에도 JAVASCRIPT가 문제없이 동작하도록 하기 위함.</p>
<p>3) javascript안에서 태그를 사용할 경우 CDATA 선을 해줘서 오류처리를 막기 위함.</p>
<p> </p>
<p>사용예제</p>
<p>&lt;script&gt;</p>
<p>//&lt;![CDATA[</p>
<p> JAVASCRIPT</p>
<p>//]]&gt;</p>
<p>&lt;/script&gt;</p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2022-01-20T13:28:48+09:00</dc:date>
</item>


<item>
<title>[ javascript ] promise 를 async &amp; await 로 쉽게 써보자</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=63</link>
<description><![CDATA[<p>promise 를 async &amp; await 로 쉽게 써보자 </p>
<p>//promise는 chaning가 가능하다.</p>
<p>//체인이 많아 지면 복잡해진다.</p>
<p>//async await 동기식으로 순서를 작성하는 것 처럼 간편하게 작성가능</p>
<p>//기존에 존재하는 promise 위에 간단한 api를 제공하는데</p>
<p>//더 간편하게 제공하는 것을 syntactic sugar </p>
<p>//프로토 타입을 베이스트로한 살짝 덭붙여진 것</p>
<p><br /></p>
<p>//async &amp; await</p>
<p>//clear style of using promise :)</p>
<p><br /></p>
<p><br /></p>
<p>//1. async(비동기)</p>
<p>function fetchUser() {</p>
<p>    //do network request in 10 secs....</p>
<p>    //return 'test';</p>
<p>    return new Promise((resolve, reject) =&gt; {</p>
<p>        //do network request in 10 secs....</p>
<p><br /></p>
<p>        resolve('test');</p>
<p>    })</p>
<p>}</p>
<p>const user = fetchUser();</p>
<p>user.then(console.log);</p>
<p>console.log(user);</p>
<p><br /></p>
<p>//이러한 promise를 async를 통해서 바로 실행이 가능하다.</p>
<p>//syntactic sugar</p>
<p>async function fetchUser2() {</p>
<p>    return 'test2';</p>
<p>}</p>
<p>const user2 = fetchUser2();</p>
<p>user2.then(console.log);</p>
<p>console.log(user2);</p>
<p><br /></p>
<p>//2. await</p>
<p>function delay(ms) {</p>
<p>    //promise를 리턴하는데, </p>
<p>    //정해진 ms(밀리세컨드)가 지나면 resolve를 호출하는 promise를 리턴하게 된다.</p>
<p>    return new Promise(resolve =&gt; setTimeout(resolve, ms));</p>
<p>}</p>
<p><br /></p>
<p>async function getApple() {</p>
<p>    //await는 async 함수가 붙은 곳에서만 사용이 가능</p>
<p>    await delay(1000);</p>
<p>    //에러처리를 </p>
<p>    return 'apple';</p>
<p>}</p>
<p><br /></p>
<p>async function getBanana() {</p>
<p>    await delay(1000);</p>
<p>    return 'banana';</p>
<p>}</p>
<p><br /></p>
<p>/*</p>
<p> * promise로 사용하는 함수를 만들어보자면</p>
<p> * 이런식의 체이닝으로 구성이 가능하다.</p>
<p>function getBanana() {</p>
<p>    return delay(1000)</p>
<p>    .then(()=&gt; 'banana');</p>
<p>}</p>
<p>*/</p>
<p><br /></p>
<p><br /></p>
<p>function pickFruits(){</p>
<p>    //이런식으로 promise도 중첩적으로 너무 체인닝을 하게 되면</p>
<p>    //콜백지옥이 되는건 마찬가지이다.</p>
<p>    return getApple()</p>
<p>    .then(apple =&gt;{</p>
<p>        return getBanana()</p>
<p>        .then(banana =&gt; `${apple}+${banana}`);</p>
<p>    });</p>
<p>}</p>
<p>pickFruits().then(console.log);</p>
<p><br /></p>
<p>//이녀석을 async를 통해서 간단하게 해줄 수 가 있다.</p>
<p>async function pickFruits2() {</p>
<p>    const apple = await getApple();</p>
<p>    const banana = await getBanana();</p>
<p>    return `${apple} + ${banana}`;</p>
<p>}</p>
<p>pickFruits2().then(console.log);</p>
<p><br /></p>
<p><br /></p>
<p>/*</p>
<p> * 에러처리</p>
<p>async function getApple3() {</p>
<p>    await delay(1000);</p>
<p>    throw 'error';</p>
<p>    return 'apple3';</p>
<p>}</p>
<p>*/</p>
<p>async function getApple3() {</p>
<p>    await delay(1000);</p>
<p>    return 'apple3';</p>
<p>}</p>
<p><br /></p>
<p>async function getBanana3() {</p>
<p>    await delay(1000);</p>
<p>    return 'banana3';</p>
<p>}</p>
<p><br /></p>
<p>async function pickFruits3() {</p>
<p>    //여기서 사과와 바나나를 불러오는데 </p>
<p>    //사과에서 1초대기, 바나나에서 또 1초대기를 하게 된다.</p>
<p>    //이렇게 순차로 진행되면 비효율 적이다.</p>
<p>    //const apple = await getApple3();</p>
<p>    //const banana = await getBanana3();</p>
<p>    //이렇게 하면 1초만에 병렬적으로 두개를 실행하는게 가능해 진다.</p>
<p>    //이렇게 getApple3과 getBanana3이 서로 다른것을 불러올때는</p>
<p>    //서로의 관계가 없으므로 다른 방법으로 불러온다.</p>
<p>    //promise에서 제공하는 all이라는 api를 사용하면 된다.</p>
<p><br /></p>
<p>    const applePromise3 = getApple3();</p>
<p>    const bananaPromise3 = getBanana3();</p>
<p>    const apple3 = await applePromise3;</p>
<p>    const banana3 = await bananaPromise3;</p>
<p><br /></p>
<p>    return `${apple3} + ${banana3}`;</p>
<p>}</p>
<p>pickFruits3().then(console.log);</p>
<p><br /></p>
<p>//3. useful Promise APIs </p>
<p>function pickAllFruits() {</p>
<p>    return Promise.all([getApple3(), getBanana3()])</p>
<p>    .then(fruits =&gt; fruits.join('+++'));</p>
<p>}</p>
<p>pickAllFruits().then(console.log);</p>
<p><br /></p>
<p>//먼저출력되는 값중 하나를 출력하는 함수</p>
<p>function pickOnlyOne() {</p>
<p>    return Promise.race([getApple3(), getBanana3()]);</p>
<p>}</p>
<p>pickOnlyOne().then(console.log);</p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-27T23:44:35+09:00</dc:date>
</item>


<item>
<title>[ javascript ] callback to promise 콜백을 프로미스로 바꿔서 콜백지옥 벗어나자</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=62</link>
<description><![CDATA[<p>callback to promise 콜백을 프로미스로 바꿔서 콜백지옥 벗어나자</p>
<p> </p>
<p>//콜백지옥 코드( 콜백 체인 )</p>
<p>//Callback Hell example</p>
<p>class UserStorage{</p>
<p>    loginUser(id, password) {</p>
<p>        return new Promise((resolve, reject) =&gt; {</p>
<p>            setTimeout(()=&gt;{</p>
<p>                if(</p>
<p>                    (id === 'test'  &amp;&amp; password === 'dream') ||</p>
<p>                    (id === 'coder' &amp;&amp; password === 'academy')</p>
<p>                ) {</p>
<p>                    resolve(id);</p>
<p>                } else {</p>
<p>                    reject(new Error('not found'));</p>
<p>                }</p>
<p>            }, 2000);</p>
<p>        });</p>
<p>    }</p>
<p><br /></p>
<p>    getRoles(user) {</p>
<p>        return new Promise((resolve, reject) =&gt; {</p>
<p>            setTimeout(() =&gt; {</p>
<p>                if(user === 'test') {</p>
<p>                    resolve({name:'test', role:'admin'});</p>
<p>                } else {</p>
<p>                    reject(new Error('no access'));</p>
<p>                }</p>
<p>            }, 1000);</p>
<p>        });</p>
<p>    }</p>
<p>}</p>
<p><br /></p>
<p>//1. 사용자에게 아이디 비밀번호 받아와서 로그인</p>
<p>//로그인이 성공이면 역할을 요청해서 받아온다.</p>
<p>//역할이 성공적으로 받아지면 object를 출력한다.</p>
<p>const userStorage = new UserStorage();</p>
<p>const id = prompt('enter you id');</p>
<p>const password = prompt('enter your password');</p>
<p>userStorage.loginUser(id, password)</p>
<p>    .then(userStorage.getRoles)</p>
<p>    .then(user =&gt; alert(`Hello ${user.name}, you have a ${user.role}`))</p>
<p>    .catch(console.log);//오류발생시 console에</p>
<p><br /></p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-21T01:44:06+09:00</dc:date>
</item>


<item>
<title>[ javascript ] promise</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=61</link>
<description><![CDATA[<p>'use strict'</p>
<p><br /></p>
<p>//promse 코드를 이용해서 비동기식으로 처리 하는 방법</p>
<p>//Promse is a JavaScript object for asynchronous operation.</p>
<p>//state : pending(진행중) -&gt; fulfilled(성공적으로 종료) or rejected(파일을 찾을 수 없거나 문제가 생기면)</p>
<p>//Producer(원하는 기능을 수행해서 해당데이터를 만듬) vs Consumer(해당 데이터를 소비)</p>
<p><br /></p>
<p>//1. Producer</p>
<p>//promise가 만들어지는 순간 네트워크 통신을 수행하게 된다.</p>
<p>//버튼을 눌러서 네트워크를 연결해야 할 경우는 사용하지 않는게 좋다.</p>
<p>//when new Promise is created, the executor runs automatically.</p>
<p>//promise 변수를 Promise Object 로 만들자</p>
<p>const promise = new Promise((resolve, reject) =&gt; {</p>
<p>   //doing some heavy work(network, read files) 비동기처리가 유리</p>
<p>   console.log('doing something...');</p>
<p>   setTimeout(()=&gt;{</p>
<p>        //resolve('test'); //성공했을 때 나타내는 핸들링</p>
<p>        reject(new Error('no network')) //오류를 나타내는 핸들링</p>
<p>   }, 2000);</p>
<p>});</p>
<p><br /></p>
<p>//2. Consumers : then, catch, finally</p>
<p>//아래 .then은 promise가 리턴이되고 자신을 호출하는것과 같아서</p>
<p>//그래서 다시 promise에 .catch를 등록할 수가 있게 된다.</p>
<p>//※※※※※※※※※이것을 체이닝이라고 한다.  굉장히 중요함.</p>
<p>promise</p>
<p>    .then((value)=&gt;{ //성공적인 부분</p>
<p>        console.log(value);</p>
<p>    })</p>
<p>    .catch(error=&gt;{ //오류가 발생하는 부분을 console.log로 출력</p>
<p>        console.log(error);</p>
<p>    })</p>
<p>    .finally(()=&gt;{ //성공과 실패에 상관없이 무조건 실행하고 싶을 때</p>
<p>        console.log('finally');</p>
<p>    });</p>
<p><br /></p>
<p>//3. Promise chaining</p>
<p>const fetchNumber = new Promise((resolve, reject) =&gt; {</p>
<p>    setTimeout(()=&gt;resolve(1), 1000);</p>
<p>});</p>
<p><br /></p>
<p>fetchNumber</p>
<p>    .then(num =&gt; num*2)</p>
<p>    .then(num =&gt; num*3)</p>
<p>    .then(num =&gt; {</p>
<p>        return new Promise((resolve, reject) =&gt; {</p>
<p>            setTimeout(() =&gt; resolve(num-1), 1000);</p>
<p>        });</p>
<p>    })</p>
<p>    .then(num =&gt; console.log(num));</p>
<p><br /></p>
<p>//4. Error Handling</p>
<p>const getHen = () =&gt; </p>
<p>    new Promise((resolve, reject) =&gt; {</p>
<p>        setTimeout(() =&gt; resolve('Chicken'), 1000);</p>
<p>    });</p>
<p><br /></p>
<p>const getEgg = hen =&gt; </p>
<p>    new Promise((resolve, reject) =&gt; {</p>
<p>        //오류처리구문</p>
<p>        setTimeout(() =&gt; reject(new Error(`${hen} =&gt; Egg `)), 1000);</p>
<p>        //정상구문</p>
<p>        //setTimeout(() =&gt; resolve(`${hen} =&gt; Egg `), 1000);</p>
<p>    });</p>
<p><br /></p>
<p>const cook = egg =&gt; </p>
<p>    new Promise((resolve, reject) =&gt; {</p>
<p>        setTimeout(() =&gt; resolve(`${egg}=&gt; Fry`), 1000);</p>
<p>    });</p>
<p><br /></p>
<p>getHen()</p>
<p>    .then(hen =&gt; getEgg(hen))</p>
<p>    .then(egg =&gt; cook(egg))</p>
<p>    .then(meal =&gt; console.log(meal));</p>
<p><br /></p>
<p>//콜백함수를 전달할 때 받아오는 value를 하나로 호출한 경우는 생략이 가능하다.</p>
<p>//.then(han=&gt; getEgg(hen))   ==&gt; .then(getEgg)</p>
<p>//.then(egg =&gt;cook(egg)) ==&gt; .then(cook)</p>
<p>//.then(meal =&gt; console.log(meal)) ==&gt; .then(console.log)</p>
<p>//즉 getHen().then(getEgg).then(cook).then(console.log); </p>
<p>//이렇게 사용이 가능하다</p>
<p>//프리티어 포멧에서 한줄로 작성</p>
<p>getHen()</p>
<p>    .then(getEgg)</p>
<p>    //오류처리구문이 존재할 때 대체구문으로 진행을 마무하게 해주는 catch문</p>
<p>    .catch(error =&gt; {</p>
<p>        return 'bread';</p>
<p>    })</p>
<p>    .then(cook)</p>
<p>    .then(console.log)</p>
<p>    .catch(console.log); //오류처리</p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-21T01:42:51+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 콜백지옥 - callback</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=60</link>
<description><![CDATA[<p>'use strict'</p>
<p><br /></p>
<p>//JavaScript is synchronous.</p>
<p>//Execute the code block by orger after hoisting.</p>
<p>//hoisting: var, function declearation</p>
<p>//1. 동기와 비동기</p>
<p>console.log('1'); //동기식</p>
<p>setTimeout(function(){ //비동기식</p>
<p>    console.log('2');//브라우져에서 함수에 의해 대기했다가 실행(비동기 실행방법)</p>
<p>},1000);</p>
<p>// 여기서 function 으로 사용되는 callback 함수는</p>
<p>// arrow function expression으로 변경이 가능</p>
<p>//변경하게 되면</p>
<p>setTimeout( () =&gt; console.log('4'), 1000); //비동기식</p>
<p>//이러한 형태로 변경이 가능하다.</p>
<p>console.log('3'); //동기식</p>
<p><br /></p>
<p>//Synchronous callback (동기적)</p>
<p>function printImmediately(print) {</p>
<p>    print();</p>
<p>}</p>
<p>printImmediately(()=&gt; console.log('hello')); //동기</p>
<p><br /></p>
<p>//Aynchronous callback (비동기적)</p>
<p>function printWithDelay(print, timeout) {</p>
<p>    setTimeout(print, timeout);</p>
<p>}</p>
<p>printWithDelay(()=&gt; console.log('async callback'), 2000); //비동기</p>
<p><br /></p>
<p>//콜백지옥 코드( 콜백 체인 )</p>
<p>//Callback Hell example</p>
<p>class UserStorage{</p>
<p>    loginUser(id, password, onSuccess, onError) {</p>
<p>        setTimeout(()=&gt;{</p>
<p>            if(</p>
<p>                (id === 'test'  &amp;&amp; password === 'dream') ||</p>
<p>                (id === 'coder' &amp;&amp; password === 'academy')</p>
<p>            ) {</p>
<p>                onSuccess(id);</p>
<p>            } else {</p>
<p>                onError(new Error('not found'));</p>
<p>            }</p>
<p>        }, 2000);</p>
<p>    }</p>
<p><br /></p>
<p>    getRoles(user, onSuccess, onError) {</p>
<p>        setTimeout(() =&gt; {</p>
<p>            if(user === 'test') {</p>
<p>                onSuccess({name:'test', role:'admin'});</p>
<p>            } else {</p>
<p>                onError(new Error('no access'));</p>
<p>            }</p>
<p>        }, 1000);</p>
<p>    }</p>
<p>}</p>
<p><br /></p>
<p>//1. 사용자에게 아이디 비밀번호 받아와서 로그인</p>
<p>//로그인이 성공이면 역할을 요청해서 받아온다.</p>
<p>//역할이 성공적으로 받아지면 object를 출력한다.</p>
<p>const userStorage = new UserStorage();</p>
<p>const id = prompt('enter you id');</p>
<p>const password = prompt('enter your password');</p>
<p>userStorage.loginUser(</p>
<p>    id, </p>
<p>    password, </p>
<p>    (user) =&gt; {</p>
<p>        userStorage.getRoles(</p>
<p>            user, </p>
<p>            userWithRole =&gt; {</p>
<p>                alert(`Hello ${userWithRole.name}, you hava a ${userWithRole.role} role`);</p>
<p>            },</p>
<p>            error =&gt; {</p>
<p>                console.log(error);</p>
<p>            }</p>
<p>        );</p>
<p>    },</p>
<p>    error =&gt; {console.log(error)}</p>
<p>);</p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-21T01:42:23+09:00</dc:date>
</item>


<item>
<title>[ javascript ] json 사용법</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=59</link>
<description><![CDATA[<div>JSON</div>
<div>//simplest data interchange format.</div>
<div>//lightweight text-abased structure.</div>
<div>//easy to read.</div>
<div>//key-value pairs.</div>
<div>//used for serialization and transmission of data between the network the network the network connection.</div>
<div>//independent programming language and platform.</div>
<div><br /></div>
<div>//Javascript Object Notation</div>
<div>//1. Object to JSON</div>
<div>//Stringfy(obj)</div>
<div>let json = JSON.stringify(true);</div>
<div>console.log(json);</div>
<div><br /></div>
<div>json = JSON.stringify(['apple', 'banana']);</div>
<div>console.log(json);</div>
<div><br /></div>
<div>const rabbit = {</div>
<div>    name:'tori',</div>
<div>    color:'white',</div>
<div>    size:null,</div>
<div>    birthDate:new Date(),</div>
<div>    </div>
<div>    //포암되지 않는 데이터들 simbol function</div>
<div>    //symbol:Symbol('id'),</div>
<div>    jump:() =&gt; {</div>
<div>        console.log(`${name} can jump!`);</div>
<div>    },</div>
<div>};</div>
<div>json = JSON.stringify(rabbit);</div>
<div>console.log(json);</div>
<div><br /></div>
<div>//해당하는 내용만 json으로 변경가능</div>
<div>json = JSON.stringify(rabbit, ['name', ['size'], ['color']]);</div>
<div>console.log(json);</div>
<div><br /></div>
<div>//더 세밀한 callback을 통해 내용 전달</div>
<div>json = JSON.stringify(rabbit, (key, value) =&gt; {</div>
<div>    console.log(`key: ${key}, value:${value}`);</div>
<div>    //return value;</div>
<div>    //더 새밀한 값을 설정</div>
<div>    return key === 'name' ? 'test' : value;</div>
<div>});</div>
<div>console.log(json);</div>
<div><br /></div>
<div>//2. JSON to Object</div>
<div>//parse(json)</div>
<div>console.clear();</div>
<div>json = JSON.stringify(rabbit);</div>
<div>console.log(json);</div>
<div>const obj = JSON.parse(json);</div>
<div>const obj2 = JSON.parse(json, (key, value) =&gt; {</div>
<div>    console.log(`key : ${key}, value : ${value}`);</div>
<div>    //return value;</div>
<div>    return key === 'bitrhDate' ? new Date(value) : value;</div>
<div>});</div>
<div>console.log(obj);</div>
<div>rabbit.jump();</div>
<div>//obj.jump();</div>
<div><br /></div>
<div>console.log(rabbit.birthDate.getDate());</div>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-21T01:41:42+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 유용한 함수들 10가지</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=58</link>
<description><![CDATA[<p>javascript 유용한 함수들 10가지</p>
<p><a href="https://youtu.be/3CUjtKJ7PJg" target="_blank" rel="nofollow noreferrer noopener">https://youtu.be/3CUjtKJ7PJg</a></p>
<p> </p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>// Q1. make a string out of an array</p>
   <p>{</p>
   <p>    const fruits = ['apple', 'banana', 'orange'];</p>
   <p>    const result = fruits.join();</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p>  </p>
   <p>// Q2. make an array out of a string</p>
   <p>{</p>
   <p>    const fruits = 'apple, banana, melon, tomato';</p>
   <p>    const result = fruits.split(",");</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q3. make this array look like this: [5, 4, 3, 2, 1]</p>
   <p>{</p>
   <p>    const array = [1, 2, 3, 4, 5];</p>
   <p>    const arrSort = array.reverse();</p>
   <p>    console.log(arrSort);</p>
   <p>    console.log(array);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q4. make new array without the first two elements</p>
   <p>{</p>
   <p>    const array = [1, 2, 3, 4, 5];</p>
   <p>    const result = array.splice(2, 5);</p>
   <p>    console.log(result);</p>
   <p>    console.log(array);</p>
   <p>}</p>
   <p><br /></p>
   <p>class Student {</p>
   <p>    constructor(name, age, enrolled, score) {</p>
   <p>        this.name = name;</p>
   <p>        this.age = age;</p>
   <p>        this.enrolled = enrolled;</p>
   <p>        this.score = score;</p>
   <p>    }</p>
   <p>}</p>
   <p>const students = [</p>
   <p>    new Student('A', 29, true, 45),</p>
   <p>    new Student('B', 28, false, 80),</p>
   <p>    new Student('C', 30, true, 90),</p>
   <p>    new Student('D', 40, false, 66),</p>
   <p>    new Student('E', 18, true, 88),</p>
   <p>];</p>
   <p><br /></p>
   <p>// Q5. find a student with the score 90</p>
   <p>{</p>
   <p>    console.clear();</p>
   <p>    /*</p>
   <p>    * 해당하는 배열만 찾아 낼 때 find()</p>
   <p>    const result = students.find(function(student, index){</p>
   <p>        //console.log(student, index);</p>
   <p>        return student.score === 90;</p>
   <p>    });</p>
   <p>    */</p>
   <p>    //arrow function expression 으로 변경</p>
   <p>    const result = students.find((student) =&gt; student.score === 90);</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q6. make an array of enrolled students</p>
   <p>{</p>
   <p>    console.clear();</p>
   <p>    /*</p>
   <p>    * 조건에 맞는 배열만을 가져오고 싶을 때 filter()</p>
   <p>    const result = students.filter(function(student){</p>
   <p>        //console.log(student);</p>
   <p>        return student.enrolled === true;</p>
   <p>    });</p>
   <p>    */</p>
   <p>    //arrow function expression 으로 변경</p>
   <p>    const result = students.filter((student) =&gt; student.enrolled);</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q7. make an array containing only the students' scores</p>
   <p>// result should be: [45, 80, 90, 66, 88]</p>
   <p>{</p>
   <p>    console.clear();</p>
   <p>    /*</p>
   <p>    * 학생들의 점수만을 새로운 배열로 넣고 싶을 때 map()</p>
   <p>    const result = students.map(function(student){</p>
   <p>    //점수를 두배로 바꾸고 싶다면 return student.score * 2를 해주면 된다.</p>
   <p>        return student.score;</p>
   <p>    });</p>
   <p>    */</p>
   <p>    //arrow funtion expression 으로 변경</p>
   <p>    const result = students.map((student) =&gt; student.score);</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q8. check if there is a student with the score lower than 50</p>
   <p>{</p>
   <p>    console.clear();</p>
   <p>    //배열의 조건이 만족할 때 출력하고 싶다면 some()</p>
   <p>    /*</p>
   <p>    const result = students.some(function(student) {</p>
   <p>        return student.score &lt; 50;</p>
   <p>    });</p>
   <p>    */</p>
   <p>    //arrow function expression</p>
   <p>    const result = students.some((student) =&gt; student.score &lt; 50);</p>
   <p>    console.log(result);</p>
   <p><br /></p>
   <p>    //모든 배열의 조건이 만족하게 하고 싶다면 every()</p>
   <p>    //some()처럼 사용하고 싶으면 !을 사용하면 된다.</p>
   <p>    //const result2 = !students.every(function(student) {</p>
   <p>    //    return student.score &gt;= 50;</p>
   <p>    //});</p>
   <p>    /*</p>
   <p>    * 이값은 모든 조건이 50보다 작은값이 아니므로 false</p>
   <p>    const result2 = students.every(function(student) {</p>
   <p>        return student.score &lt; 50;</p>
   <p>    });</p>
   <p>    */</p>
   <p>    //arrow function expression</p>
   <p>    const result2 = !students.every((student) =&gt; student &gt;= 50);</p>
   <p>    console.log(result2);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q9. compute students' average score</p>
   <p>{</p>
   <p>    console.clear();</p>
   <p>    //reduce는 어떤값을 돌면서 누적할 때 사용</p>
   <p>    //reduceRight는 뒤에서 부터 반복해서 누적할 때 사용</p>
   <p>    //reduce는 curr에 배열이 하나 하나씩 순차적으로 전달이 된다.</p>
   <p>    //prev는 처음에는 배열의 첫번째값 두번째부터는 return 되어 오는 값을 받아 들인다.</p>
   <p>    /*</p>
   <p>    const result = students.reduce(function(prev, curr) {</p>
   <p>        //console.log('------------');</p>
   <p>        //console.log(prev);</p>
   <p>        //console.log(curr);</p>
   <p>        //return curr; 값의 전달 확인용</p>
   <p>        //점수의 합을 구하므로 아래처럼 합을 해준다.</p>
   <p>        return prev + curr.score;</p>
   <p>    }, 0);</p>
   <p>    */</p>
   <p>    //arrow function expression</p>
   <p>    const result = students.reduce((prev, curr) =&gt; prev+curr.score, 0);</p>
   <p>    console.log(result/students.length);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Q10. make a string containing all the scores</p>
   <p>// result should be: '45, 80, 90, 66, 88'</p>
   <p>{</p>
   <p>    //점수에 대한 새로운 배열을 만든다.</p>
   <p>    const result = students</p>
   <p>        .map((student) =&gt; student.score) //학생들을 점수로 변환하고</p>
   <p>        .filter((score) =&gt; score &gt;= 50) //점수 50점 이상인 학생만 필터하고</p>
   <p>        .join(); //조인을 해주면 된다.</p>
   <p>    console.log(result);</p>
   <p>}</p>
   <p><br /></p>
   <p>// Bonus! do Q10 sorted in ascending order</p>
   <p>// result should be: '45, 66, 80, 88, 90'</p>
   <p>{</p>
   <p>    const result = students</p>
   <p>        .map((student) =&gt; student.score)</p>
   <p>        .sort((a, b) =&gt; a - b ) //낮은 점수 먼저 부여주고 높은점수 부터 보고 싶다면 b-a로 수정하면된다.</p>
   <p>        .join();</p>
   <p>        console.log(result);</p>
   <p>}</p>
   </div>
<p> </p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-15T22:58:53+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 배열 입력, 추가, 삭제, 출력 등 배열의 활용 push, pop, shift, unshift, indexOf, splice, concat, includes, lastIndexOf, forEach, for of</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=57</link>
<description><![CDATA[<p> 'use strict';</p>
<p>배열(Array)</p>
<p>1. 선언(Declaration)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const arr1 = new Array();</p>
   <p>const arr2 = [1,2];</p>
   </div>
<p><br /></p>
<p>2. Index position</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const fruits = ['apple','banana'];</p>
   <p>console.log(fruits);</p>
   <p>console.log(fruits.length);</p>
   <p>console.log(fruits[0]); //맨처음 배열은 0</p>
   <p>console.log(fruits[1]);</p>
   <p>console.log(fruits[fruits.length-1]); //맨마지막 배열은 배열의 길이 -1</p>
   <p>console.clear();</p>
   </div>
<p><br /></p>
<p>3. Looping over an array</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>print all fruits</p>
   <p>for(let i=0; i&lt;fruits.length; i++) {</p>
   <p>    console.log(fruits[i]);</p>
   <p>}</p>
   <p>console.clear();</p>
   <p><br /></p>
   <p>for of</p>
   <p>for(let fruit of fruits) {</p>
   <p>    console.log(fruit);</p>
   <p>}</p>
   <p>console.clear();</p>
   </div>
<p><br /></p>
<p>forEach</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>/*</p>
   <p> * 사용방법 </p>
   <p> * 배열.forEach(function(변수정의, 인덱스, 들어가있는 배열값) { 출력문});</p>
   <p>fruits.forEach(function(fruit, index, array) {</p>
   <p>    console.log(fruit, index, fruits);</p>
   <p>});</p>
   <p>*/</p>
   </div>
<p>한줄로 간단하게</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.forEach((fruit)=&gt;console.log(fruit));</p>
   <p>console.clear();</p>
   </div>
<p><br /></p>
<p>4. Addtion, deletion, copy</p>
<p>맨마지막에 배열을 추가</p>
<p>push : add an item to the end</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.push('melon', 'watermelon');</p>
   <p>console.log(` push : ${fruits}`);</p>
   </div>
<p><br /></p>
<p>맨마지막의 배열을 삭제</p>
<p>pop : remove an item from the end</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.pop();</p>
   <p>console.log(` pop : ${fruits}`);</p>
   </div>
<p><br /></p>
<p>맨앞에 배열을 추가</p>
<p>unshift: add an item to the benigging</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.unshift('cherry', 'pear');</p>
   <p>console.log(` unshift : ${fruits}`);</p>
   </div>
<p><br /></p>
<p>맨앞에 배열을 삭제</p>
<p>shift: remove an item from teh benigging</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.shift();</p>
   <p>console.log(` shift : ${fruits}`);</p>
   </div>
<p><br /></p>
<p>shift, unshft는 pop과 push보다 느리다</p>
<p>pop과 push는 맨뒤의 공간을 활용해서 넣다 뺏다 하기때문에</p>
<p>배열의정렬이 움직이지 않아도 되기때문에 더 빠르다.</p>
<p>note!! shift, unshift are slower than pop, push</p>
<p><br /></p>
<p>splice : remove an item by index position</p>
<p>fruits.splice(1,1); splice(시작하는 인덱스, 삭제 인덱스 개수);</p>
<p>삭제인덱스개수가 1이면 해당인덱스만, 2면 해당인덱스와 그다음 인덱스까지 삭제</p>
<p>splice(시작하는 인덱스); 만 적을경우 해당하는 인덱스를 포함해서 뒤로 모두 지워버린다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.push('pear');</p>
   <p>console.log(fruits);</p>
   <p>fruits.splice(1,1);</p>
   <p>console.log(fruits);</p>
   </div>
<p> </p>
<p>삭제와 추가가 동시에 가능 splice(시작하는인덱스, 삭제 인덱스 개수, '추가할인덱스', '추가할인덱스')</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.splice(1, 1, 'tometo', 'banana');</p>
   <p>console.log(fruits);</p>
   </div>
<p><br /></p>
<p>combine two arrays</p>
<p>첫번째 선언된 fruits 배열과 fruits2를 하나로 합치는 함수 :: concat</p>
<p>첫번째배열.concat(두번째배열)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const fruits2 = ['apple', 'banana'];</p>
   <p>const newFruits = fruits.concat(fruits2);</p>
   <p>console.log(newFruits);</p>
   </div>
<p><br /></p>
<p>5. Searching</p>
<p>find the index</p>
<p>값이 있을경우 index번호 없을 경우 -1</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.clear();</p>
   <p>console.log(fruits);</p>
   <p>console.log(fruits.indexOf('apple'));</p>
   </div>
<p><br /></p>
<p>find of includes</p>
<p>값이 있을경우 true, 없을 경우 false</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(fruits.includes('apple'));</p>
   </div>
<p><br /></p>
<p>lastIndeOf </p>
<p>중복이 되었거나 할 때 맨첫번째 나오는 값만을 출력한다.</p>
<p>이럴때 제일뒤에 위치한 중복배열을 불러올 때 사용한다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>fruits.push('apple');</p>
   <p>console.clear();</p>
   <p>console.log(fruits);</p>
   <p>console.log(fruits.indexOf('apple'));</p>
   <p>console.log(fruits.lastIndexOf('apple'));</p>
   </div>
<p><br /></p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-14T02:14:53+09:00</dc:date>
</item>


<item>
<title>[ javascript ] object 생성, 사용방법</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=56</link>
<description><![CDATA[<div>'use strict';</div>
<div><span style="color:#ff0000;"><b>객체(Objects)</b></span></div>
<div>//one of the JavaScript's data types.</div>
<div>//a collection of related data and/or functionality.</div>
<div>//Nearly all objects in JavaScript are instances of Objets.</div>
<div>//object = { key : value }; </div>
<div>//오브젝트는 키와벨류의 집합체</div>
<div>//변수에 접근가능한 property 와 값의 집합</div>
<div><br /></div>
<div>1. 변수에 넣은 변하지 않는 데이터와 속성(Literals and properties)</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//const name = 'test';</div>
   <div>//const age = 10;</div>
   <div>//print(name, age);</div>
   <div>function print(person) {</div>
   <div>    console.log(person.name);</div>
   <div>    console.log(person.age);</div>
   <div>}</div>
   <div><br /></div>
   <div>const test = {name:'test', age:14};</div>
   <div>print(test);</div>
   <div><br /></div>
   <div>//object 정의 2가지 방법</div>
   <div>const obj1 = {}; //'object literal' syntax</div>
   <div>const obj2 = new Object(); //'object constructor' syntax</div>
   <div><br /></div>
   <div>//유지보수에 어려운 코딩방법</div>
   <div>//test.hasJob = true; //이런식으로 object를 만들지 말자</div>
   <div>//console.log(test.hasJob);</div>
   <div>//이런식으로 바로 삭제도 가능하다.</div>
   <div>//delete test.hasJob;</div>
   <div>//console.log(test.hasJob);  //결과 -&gt; undefined</div>
   </div>
<div><br /></div>
<div>2. 계산된 속성(Computed properties)</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//배열의 형태로 적고 ''로 스트링타입으로 불러온다.</div>
   <div>//동적으로 키의 값을 가져올 때 사용하기 유용</div>
   <div>console.log(test.name);</div>
   <div>console.log(test['name']);</div>
   <div><br /></div>
   <div>test['hasJob'] = true;</div>
   <div>console.log(test.hasJob);</div>
   <div><br /></div>
   <div>function printValue(obj, key){</div>
   <div>    //이런형태로 값이 변경되는 구문에서는 . 을 통해서 값을 가져오면 undefined가 출력</div>
   <div>    console.log(obj.key); </div>
   <div>    //대신 computed properties를 사용하면 정상적 출력가능</div>
   <div>    console.log(obj[key]);</div>
   <div>}</div>
   <div>printValue(test, 'name');</div>
   <div>printValue(test, 'age');</div>
   </div>
<div><br /></div>
<div>3. 속성값 빠른 정의(Property value shorthand)</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//일일이 적어서 넣어주었던 번거로움을 함수를 통해 쉽게 넣어 줄 수 있다.</div>
   <div>const person1 = {name:'bob', age:2};</div>
   <div>const person2 = {name:'steve', age:3};</div>
   <div>const person3 = {name:'hahaha', age:13};</div>
   <div><br /></div>
   <div>/*</div>
   <div>이렇게 함수를 만들어서 사용하는 부분을 클래스인것처럼 작성을 하게 되면</div>
   <div>알아서 클래스 처럼 받아들여서 사용을 할 수 있게 해준다.</div>
   <div>const person4 = makePerson('kikiki', 23);</div>
   <div>console.log(person4);</div>
   <div>function makePerson(name, age) {</div>
   <div>    return {</div>
   <div>        //키와 벨류의 이름이 동일하면 이것을 생략할 수가 있다.</div>
   <div>        //name : name,</div>
   <div>        //age : age,</div>
   <div>        //이런식으로 생략이 가능.</div>
   <div>        name,</div>
   <div>        age,</div>
   <div>    };</div>
   <div>}</div>
   <div>*/</div>
   </div>
<div><br /></div>
<div>3번 에서 사용되는 함수의 변형이 4번</div>
<div>4. 생성자 기능(Constructor Function)</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>const person4 = new Person('kikiki', 23);</div>
   <div>console.log(person4);</div>
   <div>function Person(name, age){</div>
   <div>    //this = {}; //이부분이 생략되어 있다고 보면 됩니다.</div>
   <div>    this.name = name;</div>
   <div>    this.age = age;</div>
   <div>    //return this;</div>
   <div>    //return 구문 역시 생략되어 자동으로 this를 return해준다</div>
   <div>}</div>
   </div>
<div><br /></div>
<div>5. in키워드를 이용해서 키의 오브젝트 확인(in operator : property existence check(key in obj));</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>console.log('name' in test);</div>
   <div>console.log('age' in test);</div>
   <div>console.log('random' in test);</div>
   <div>console.log(test.rendom);</div>
   </div>
<div><br /></div>
<div>6. for..in vs for..of</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//for(key in obj);</div>
   <div>console.clear();//console창 청소</div>
   <div>console.log(test.name);</div>
   <div>console.log(test.age);</div>
   <div>for(const key in test) {</div>
   <div>    console.log(key);</div>
   <div>}</div>
   <div><br /></div>
   <div>//for(value of iterable)</div>
   <div>const array = [1,2,4,5];</div>
   <div>/*</div>
   <div>for(let i=0;i&lt;array.length; i++) {</div>
   <div>    console.log(array[i]);</div>
   <div>}</div>
   <div>이와같이 for구문으로 출력했던 것을</div>
   <div>아래처럼 for of를 통해 간단히 출력가능</div>
   <div>*/</div>
   <div>for(const value of array) {</div>
   <div>    console.log(value);</div>
   <div>}</div>
   </div>
<div><br /></div>
<div>7. 객체복제(Fun cloning)</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//객체에 객체를 복사한 후 복사한 객체의 값을 바꾸게 되면</div>
   <div>//최초 넣어둔 객체의 값도 바뀌게 된다.</div>
   <div>//Object.assign(dest, [obj1, obj2, obj3....])</div>
   <div>const user = {name:'test', age:20};</div>
   <div>const user2 = user;</div>
   <div>user2.name = 'coder';</div>
   <div>console.log(user);</div>
   </div>
<div><br /></div>
<div>old way</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>const user3 = {};</div>
   <div>for(const key in user) {</div>
   <div>    user3[key] = user[key];</div>
   <div>}</div>
   <div>console.clear();</div>
   <div>console.log(user3);</div>
   </div>
<div><br /></div>
<div>Object를 이용한 복제</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>//첫번째 복사 방법</div>
   <div>const user4 = {};</div>
   <div>Object.assign(user4, user); </div>
   <div>console.log(user4);</div>
   <div>//두번째 복사 방법</div>
   <div>const user5 = Object.assign({}, user);</div>
   <div>user5.name = 'aaaa';</div>
   <div>console.log(user5);</div>
   </div>
<div><br /></div>
<div>another example</div>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <div>const fruit1 = {color:'red'};</div>
   <div>const fruit2 = {color:'blue', size:'big'};</div>
   <div>const mixed = Object.assign({}, fruit1, fruit2);</div>
   <div>console.log(mixed.color);</div>
   <div>console.log(mixed.size);</div>
   </div>
<div><br /></div>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-14T00:01:29+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 클래스 정의 및 사용</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=55</link>
<description><![CDATA[<p>객체지향 프로그래밍(Object-oriendted programming)</p>
<p>class: template</p>
<p>object: instance of a class</p>
<p>JavaScript classes</p>
<p> - introduced in ES6</p>
<p> - syntactical sugar over prototype-based inheritance</p>
<p><br /></p>
<p>js파일 상단에 선언(오류체크)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p> 'use strict';</p>
   </div>
<p> </p>
<p>1. 클래스선언(Class declarations)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class Person {</p>
   <p>    //construtor</p>
   <p>    constructor(name, age) {</p>
   <p>        //fields</p>
   <p>        this.name = name;</p>
   <p>        this.age = age;</p>
   <p>    }</p>
   <p><br /></p>
   <p>    //methods</p>
   <p>    speak() {</p>
   <p>        console.log(`${this.name} : hello!`);</p>
   <p>    }</p>
   <p>}</p>
   <p><br /></p>
   <p>const test = new Person('test', 20);</p>
   <p>console.log(test.name);</p>
   <p>console.log(test.age);</p>
   <p>test.speak();</p>
   </div>
<p><br /></p>
<p>2. Getter and setters</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class user {</p>
   <p>    constructor(firstName, lastName, age) {</p>
   <p>        this.firstName = firstName;</p>
   <p>        this.lastName = lastName;</p>
   <p>        this.age = age;</p>
   <p>    }</p>
   <p><br /></p>
   <p>    //getter에서 사용하는 변수를 들어오는 변수와 다르게 설정 age =&gt; _age</p>
   <p>    //같게 설정할 경우 무한루프</p>
   <p>    get age() {</p>
   <p>        return this._age;</p>
   <p>    }</p>
   <p>    //setter에서 사용하는 변수를 들어오는 변수와 다르게 설정 age =&gt; _age</p>
   <p>    //같게 설정할 경우 무한루프</p>
   <p>    set age(value) {</p>
   <p>        /*</p>
   <p>        0이하의 값을 사용하지 못하게 설정</p>
   <p>        if(value&lt;0){</p>
   <p>            throw Error('age can not be negative');</p>
   <p>        }</p>
   <p>        this._age = value;</p>
   <p>        */</p>
   <p>        this._age = value &lt; 0 ? 0 : value;</p>
   <p><br /></p>
   <p>    }</p>
   <p>}</p>
   <p>const user1 = new user('steve', 'jobs', -1);</p>
   <p>console.log(user1.age);</p>
   </div>
<p><br /></p>
<p>3. Fields (public, private)</p>
<p>Too soon!</p>
<p>https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes</p>
<p>privateField = 아직지원하지 않는 기능(undefined라고 뜸) - 바벨을 이용</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class Experiment {</p>
   <p>    publicField = 2;</p>
   <p>    #privateField = 0;</p>
   <p>}</p>
   <p>const experiment = new Experiment();</p>
   <p>console.log(experiment.publicField);</p>
   <p>console.log(experiment.privateField);</p>
   </div>
<p><br /></p>
<p>4. 정적속성 매소드(Static properties and methods)</p>
<p>object에 상관없이 공통적으로 클래스에서 사용(메모리의 사용을 줄여준다.)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class Article {</p>
   <p>    static publisher = 'Dream Coding';</p>
   <p>    constructor(articleNumber) {</p>
   <p>        this.articleNumber = articleNumber;</p>
   <p>    }</p>
   <p><br /></p>
   <p>    static printPublisher() {</p>
   <p>        console.log(Article.publisher);</p>
   <p>    }</p>
   <p>}</p>
   <p>const article1 = new Article(1);</p>
   <p>const article2 = new Article(2);</p>
   <p>//static publisher 을 사용하면 object에서 사용불가, 클래스에서 사용가능</p>
   <p>//publisher(static없이) 을 지우면 object에서 사용사용가능, 클래스에서 사용불가</p>
   <p>console.log(article1.publisher);</p>
   <p>console.log(Article.publisher);</p>
   <p>Article.printPublisher();</p>
   </div>
<p><br /></p>
<p>5. 상속(Inheritance)</p>
<p>a way for one class to extend another class.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class Shape {</p>
   <p>    constructor(width, height, color) {</p>
   <p>        this.width = width;</p>
   <p>        this.height = height;</p>
   <p>        this.color = color;</p>
   <p>    }</p>
   <p><br /></p>
   <p>    draw() {</p>
   <p>        console.log(`drawing ${this.color} color!`);</p>
   <p>    }</p>
   <p><br /></p>
   <p>    getArea() {</p>
   <p>        return this.width * this.height;</p>
   <p>    }</p>
   <p><br /></p>
   <p>    toString() {</p>
   <p>        return console.log(` width : ${this.width}, height : ${this.height}, color : ${this.color}`);</p>
   <p>    }</p>
   <p>}</p>
   </div>
<p><br /></p>
<p>상속과 다양성 (상속을 위해서 extends를 사용해서 부모클래스를 불러온다.)</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>class Rectangle extends Shape {}</p>
   <p>const rectangle = new Rectangle(20,20,'blue');</p>
   <p>rectangle.draw();</p>
   <p>console.log(rectangle.getArea());</p>
   <p><br /></p>
   <p>class Triangle extends Shape {</p>
   <p>    //오버라이딩</p>
   <p>    draw() {</p>
   <p>        //부모의 메소드와 오버라이딩 된 메소드를 모두 호출하고 싶다면 super.draw()를 사용</p>
   <p>        super.draw();</p>
   <p>        console.log('▲');</p>
   <p>    }</p>
   <p>    //오버라이딩</p>
   <p>    getArea() {</p>
   <p>        return (this.width * this.height)/2;</p>
   <p>    }</p>
   <p>}</p>
   <p>const triangle = new Triangle(20,20,'red');</p>
   <p>triangle.draw();</p>
   <p>console.log(triangle.getArea());</p>
   <p>console.log(triangle.toString());</p>
   </div>
<p><br /></p>
<p>6. 클래스 상속 검사(Class checking : instanceOf)</p>
<p>rectangle 가 Rectangle의 클래스를 통해서 만들어진 것인지 확인( true, false )</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(rectangle instanceof Rectangle);</p>
   <p>console.log(triangle instanceof Rectangle);</p>
   <p>console.log(triangle instanceof Triangle);</p>
   <p>console.log(triangle instanceof Shape);</p>
   <p>console.log(triangle instanceof Object);</p>
   </div>
<p><br /></p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-11T03:16:33+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 함수의 또다른 기능</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=54</link>
<description><![CDATA[<p><span style="color:#ff0000;"><b>함수의 또다른 기능</b></span></p>
<p>함수는 다른 변수처럼 사용된다.</p>
<p>변수에 값으로 할당 할 수 있다.</p>
<p>다른 함수에 인수로 전달 가능</p>
<p>다른 함수에 의해 반환될 수 있다.</p>
<p>First-class function</p>
<p>functions are treated like any other variable</p>
<p>can be assigned as a value to variable</p>
<p>can be passed as an argument to other functions.</p>
<p>can be returned by another function</p>
<p><br /></p>
<p><span style="color:#0000ff;"><b>1. 함수 표현(Function expression)</b></span></p>
<p>함수선언은 정의된것보다 먼저 호출이 가능한 표현식(hoisted 기능) : 함수</p>
<p>함수선은을 먼저 되어있어야 함수 실행이 가능한 표현식 : 익명함수</p>
<p>a function declaration can be called earlier than it is defiend. (hoisted)</p>
<p>a function expression is created when the execution reaches it.</p>
<p><br /></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const print = function() { //익명함수(anonymous function) - 함수에 이름이 없는 것</p>
   <p>    console.log('print');</p>
   <p>};</p>
   <p>print(); //함수처럼 출력</p>
   <p>const printAgain = print; //함수를 변수처럼 할당</p>
   <p>printAgain(); //변수에 할당 되었으므로 함수처럼 호출 가능( function()을 가르키게 되므로 )</p>
   <p>const sumAgain = sum; //함수로 설정된 sum(a, b)를 변수처럼 다시 할당도 가능</p>
   <p>console.log(sumAgain(1,3)); //함수를 바라보고 있으므로 함수처럼 호출 가능</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>2. 함수표현식 callback함수(Callback function using function expression)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>function randomQuiz(answer, printYes, printNo) {</p>
   <p>    if(answer === 'love you') {</p>
   <p>        printYes();</p>
   <p>    } else {</p>
   <p>        printNo();</p>
   <p>    }</p>
   <p>}</p>
   </div>
<p><br /></p>
<p><span style="color:#ff0000;"><b>익명함수(anonymous function)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const printYes = function() {</p>
   <p>    console.log('yes!');</p>
   <p>};</p>
   </div>
<p><br /></p>
<p><span style="color:#ff0000;"><b>정의함수(named function)</b></span></p>
<p>디버깅의 스택추적에 사용</p>
<p>재귀호출을 할 때 사용</p>
<p>better debugging in debugger's stack traces</p>
<p>recursions</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const printNo = function print() {</p>
   <p>    console.log('no!');</p>
   <p>    //print(); //재귀호출(현재는 기능이 없으므로 무한반복됨)</p>
   <p>};</p>
   <p>randomQuiz('wrong', printYes, printNo);</p>
   <p>randomQuiz('love you', printYes, printNo);</p>
   </div>
<p><br /></p>
<p>Arrow funcion</p>
<p>always anonymous</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>/* 아래 구문으로 간결하게 할 수 있다.</p>
   <p>const simplePrint = function() {</p>
   <p>    console.log('simplePrint!');</p>
   <p>};</p>
   <p>*/</p>
   <p>const simplePrint = () =&gt; console.log('simplePrint!');</p>
   <p>simplePrint();</p>
   <p>/* 아래 구문으로 간결하게 할 수 있다.</p>
   <p>const add = function(a,b) {</p>
   <p>    return a+b;</p>
   <p>}</p>
   <p>*/</p>
   <p>const add = (a,b) =&gt; a+b;</p>
   <p>console.log(add(10,12));</p>
   </div>
<p><br /></p>
<p><span style="color:#ff0000;"><b>즉시함수 호출방식(IIFE: Immediately Invoked Function Expression)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>(function hello() {</p>
   <p>    console.log('IIEF');</p>
   <p>})();</p>
   </div>
<p><br /></p>
<p>Fun quiz time</p>
<p>function calculate(command, a, b)</p>
<p>command : add, substract, divide, multiply, remainder</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const calculate = (command, a, b) =&gt; {</p>
   <p>    switch(command){</p>
   <p>        case '+' :</p>
   <p>            console.log(a+b);</p>
   <p>        break;</p>
   <p>        case '-' :</p>
   <p>            console.log(a-b);</p>
   <p>        break;</p>
   <p>        case '*' :</p>
   <p>            console.log(a*b);</p>
   <p>        break;</p>
   <p>        case '/' :</p>
   <p>            console.log(a/b);</p>
   <p>        break;</p>
   <p>        case '%' :</p>
   <p>            console.log(a%b);</p>
   <p>        break;</p>
   <p>    }</p>
   <p>};</p>
   <p>calculate('+', 15, 10);</p>
   <p>calculate('-', 15, 10);</p>
   <p>calculate('*', 15, 10);</p>
   <p>calculate('/', 15, 10);</p>
   <p>calculate('%', 15, 10);</p>
   </div>
<p> </p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-11T02:08:08+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 함수 선언 , 사용법</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=53</link>
<description><![CDATA[<p><span style="color:#0000ff;"><b></b></span></p>
<p><b><span style="color:#0000ff;"><b>함수(Function)</b></span></b></p>
<p><b>프로그램을 구성하는 빌딩블럭</b></p>
<p><b>서브프로그램이라고도 불리며 여러번 재사용이 가능</b></p>
<p><b>한가지의 작업이나 값을 계산할 때 사용</b></p>
<p><b>-fundamental building block in the program</b></p>
<p><b>-subprogram can be used multiple times</b></p>
<p><b>-performs a task or calculates a value</b></p>
<p><b><br /></b></p>
<p><b><b><span style="color:#ff3333;">1. 함수 정의(Function declaration)</span></b></b></p>
<p><b>function 함수명(파라미터1, 파라미터2) {비지니스로직....리턴 값;}</b></p>
<p><b>하나의 함수는 한가지 일만 하도록 만든다.</b></p>
<p><b>함수 이름은 동사의 형태로 지정하는게 좋다.</b></p>
<p><b>createCardAndPoint처럼 두가지의 역할을 하는 함수라면</b></p>
<p><b>두개로 나눠서 createCard와 createPoint로 나누는게 좋다.</b></p>
<p><b>함수는 object 이므로 변수할당, 파라미터 전달, 함수로 리턴 모두 가능하다.</b></p>
<p><b>function name(param1, param2) { body.... return;}</b></p>
<p><b>one function === one thing</b></p>
<p><b>naming : doSomething, command, verb</b></p>
<p><b>e.g. createCardAndPoint -&gt; createCard, createPoint</b></p>
<p><b>function is object in JS</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function printHello(){</b></p>
   <p><b>    console.log('hello');</b></p>
   <p><b>}</b></p>
   <p><b>printHello();</b></p>
   <p><b><br /></b></p>
   <p><b>function log(message) {</b></p>
   <p><b>    console.log(message);</b></p>
   <p><b>}</b></p>
   <p><b><br /></b></p>
   <p><b>log('Hello~');</b></p>
   <p><b>log(1234);</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>2. 매개변수(Parameters)</b></span></b></p>
<p><b>사전 매개변수 : (메모리에)값으로 전달</b></p>
<p><b>객체 매개변수 : (메모리에)참조값으로 전달</b></p>
<p><b>premitive parameters: passed by value</b></p>
<p><b>object parameters: passed by reference</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function changeName(obj){</b></p>
   <p><b>    obj.name = 'coder';//전달되는 매개변수의 이름값을 coder로 변경</b></p>
   <p><b>}</b></p>
   <p><b>const test = {name:'test'};</b></p>
   <p><b>changeName(test);</b></p>
   <p><b>console.log(test);</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>3. 기본매개변수(Default parameters(added in ES6))</b></span></b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function showMessage(message, from='unknown'){</b></p>
   <p><b>//기존에 from의 값이 없을 경우 에러가 발생해서</b></p>
   <p><b>//if(from~~~~) 구문으로 오류를 방지했다. </b></p>
   <p><b>//하지만, ES6부터는 위처럼 from='unknown' 으로 아래의 구문을 대신할 수 있다.</b></p>
   <p><b>//function showMessage(message, from){</b></p>
   <p><b>//    if(from === undefined) {</b></p>
   <p><b>//        from = 'unknown';</b></p>
   <p><b>//    }</b></p>
   <p><b>    console.log(`${message} by ${from}`);</b></p>
   <p><b>}</b></p>
   <p><b>showMessage('Hi!');</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>4. 정해지지않은 매개변수(Rest parameters (added in ES6));</b></span></b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function printAll(...args) {</b></p>
   <p><b>    for(let i=0; i&lt;args.length; i++) {</b></p>
   <p><b>        console.log(args[i]);</b></p>
   <p><b>    }</b></p>
   </div>
<p><b><br /></b></p>
<p><b>for of 구문</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>    for(const arg of args) {</b></p>
   <p><b>        console.log(arg);</b></p>
   <p><b>    }</b></p>
   </div>
<p><b><br /></b></p>
<p><b>foreach 구문</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>    args.forEach((arg) =&gt; console.log(arg));</b></p>
   <p><b>}</b></p>
   <p><b>printAll('dream', 'coding', 'test');</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>5. 지역변수(지역범위(Local scope))</b></span></b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>let globalMessage = 'global';</b></p>
   <p><b>function printMessage() {</b></p>
   <p><b>    let message = 'hello'; //지역변수(local variable)</b></p>
   <p><b>    console.log(message);</b></p>
   <p><b>    console.log(globalMessage);</b></p>
   <p><b><br /></b></p>
   <p><b>    function printAnother() {</b></p>
   <p><b>        console.log(message);</b></p>
   <p><b>        let childMessage = 'hello';</b></p>
   <p><b>    }</b></p>
   <p><b>    //지역변수를 외부에서 출력을 요청하면 오류가 발생한다.</b></p>
   <p><b>    //console.log(childMessage);</b></p>
   <p><b><br /></b></p>
   <p><b>    //반환값이 없는 경우 return 생략가능</b></p>
   <p><b>    //return undefined;</b></p>
   <p><b>}</b></p>
   <p><b>//지역변수를 외부에서 출력을 요청하면 오류가 발생한다.</b></p>
   <p><b>//(var 변수 선언시 poisting이 일어나 지역변수와 전역변수 모두 사용, 보안에 취약)</b></p>
   <p><b>//console.log(message); </b></p>
   <p><b>printMessage();</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>6. 값 반환(Return a value)</b></span></b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function sum(a, b) {</b></p>
   <p><b>    return a+b;</b></p>
   <p><b>}</b></p>
   <p><b>const result = sum(1,2);</b></p>
   <p><b>console.log(`sum : ${sum(1,2)}`);</b></p>
   <p><b>console.log(`sum : ${result}`);</b></p>
   </div>
<p><b><br /></b></p>
<p><b><span style="color:#ff0000;"><b>7. Early return, early exit</b></span></b></p>
<p><b>if구문내에서만 처리가 될 때에는 else 일때 오류가 발생 할 수 있으므로 </b></p>
<p><b>아래처럼 if처리를 하게 좋은 코드가 아니다.</b></p>
<p><b>bad code</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function upgradeUser(user) {</b></p>
   <p><b>    if(user.point &gt; 10) {</b></p>
   <p><b>        //업그레드시킬 구문(long upgrade logic.....)</b></p>
   <p><b>    }</b></p>
   <p><b>}</b></p>
   </div>
<p><b><br /></b></p>
<p><b>이럴경우 반대의 구문으로 처리를 하고 return;으로 보내고</b></p>
<p><b>정상적일 때는 구문을 처리 할 수있게 if처리를 바꾼다.</b></p>
<p><b>good code</b></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p><b>function upgradeUser(user) {</b></p>
   <p><b>    if(user.point &lt;= 10) {</b></p>
   <p><b>        return;</b></p>
   <p><b>    }</b></p>
   <p><b>    //업그레드시킬 구문(long upgrade logic.....)</b></p>
   <p><b>}</b></p>
   </div>
<p><b> </b></p>
<b>
   </b><p><br /></p>
   ]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-11T01:55:16+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 문자연산, 숫자연산, 증감연산, 대입연산, 비교연산, 삼항연산, if elseif else, switch, for, while, do while</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=52</link>
<description><![CDATA[<p>문자연산, 숫자연산, 증감연산, 대입연산, 비교연산, 삼항연산, if elseif else, switch, for, while, do while</p>
<p>- 참고동영상 사이트 :  <a href="https://www.youtube.com/c/%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9by%EC%97%98%EB%A6%AC/search?query=javascript" target="_blank" rel="nofollow noreferrer noopener">https://www.youtube.com/c/드림코딩by엘리/search?query=javascript </a></p>
<p> </p>
<p><span style="color:#0000ff;"><b>1. 문자연산(String concatenation)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log('my' + ' cat');</p>
   <p>console.log('1' + 2);</p>
   <p>console.log(`String literals: 1+2 = ${1 + 2}`);</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>2. 숫자연산(Numeric operators)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(1 + 1); //add</p>
   <p>console.log(1 - 1); //substarct</p>
   <p>console.log(1 / 1); //divide</p>
   <p>console.log(1 * 1); //multiply</p>
   <p>console.log(5 % 2); //remainder</p>
   <p>console.log(2 ** 3); //exponentiation</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>3. 증감연산(Increment and decrement operators)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>let counter = 2;</p>
   <p>const perIncrement = ++counter;</p>
   <p>//counter = counter+1;</p>
   <p>//preIncrement = counter;</p>
   <p>console.log(`preIncrement:${perIncrement}, counter: ${counter}`);</p>
   <p>const postIncrement = counter++;</p>
   <p>//postIncrement = counter;</p>
   <p>//counter = counter+1;</p>
   <p>console.log(`preIncrement:${postIncrement}, counter: ${counter}`);</p>
   <p>const preDecrement = --counter;</p>
   <p>console.log(`preDecrement : ${preDecrement}, counter : ${counter}`);</p>
   <p>const postDecrement = counter--;</p>
   <p>console.log(`postDecrement : ${postDecrement}, counter : ${counter}`);</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>4. 대입연산(Assignment oprators)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>let x = 3;</p>
   <p>let y = 6;</p>
   <p>x += y; // x = x+y;</p>
   <p>x == y;</p>
   <p>x *= y;</p>
   <p>x /= y;</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>5. 비교연산(Comparison operators)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(10 &lt; 6); // less than</p>
   <p>console.log(10 &lt;= 6); // less than or equal</p>
   <p>console.log(10 &gt; 6); //greater than</p>
   <p>console.log(10 &gt;= 6); //greater than of equal</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;">6. Logical operators : || (or), &amp;&amp; (and), ! (not)</span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>//const value1 = false;</p>
   <p>const value1 = true;</p>
   <p>const value2 = 4 &lt; 2; //false</p>
   <p>//|| (or)</p>
   <p>// 아래조건중 하나라도 true가 나오면 다른 문장과 상관없이 true를 반환</p>
   <p>// 아래 코드에서 연산이 많은 함수나 조건은 뒤쪽에 나오게 해주는게 좋다.</p>
   <p>// 심플한 조건을 먼저 불러서 부하를 막아주는게 효율적인 코드</p>
   <p>console.log(`or : ${value1 || value2 || check()}`);</p>
   <p>// &amp;&amp; (and)</p>
   <p>console.log(`and : ${value1 &amp;&amp; value2 &amp;&amp; check()}`);</p>
   <p>// nullableObject &amp;&amp; nullableObject.something</p>
   <p>// nullableObject가 null 이면 false므로 뒷부분이 실행이 안되므로 다음의 코드로 사용가능</p>
   <p>/*</p>
   <p>if(nullableObject != null) {</p>
   <p>    nullableObject.somthing;</p>
   <p>}</p>
   <p>*/</p>
   <p>function check() {</p>
   <p>    for (let i = 0; i &lt; 10; i++) {</p>
   <p>        //wasting time</p>
   <p>        console.log('ㅡㅡ;;');</p>
   <p>    }</p>
   <p>    return true;</p>
   <p>}</p>
   <p><br /></p>
   <p>// !(not)</p>
   <p>// 값을 반대로 바꿔준다.</p>
   <p>console.log(!value1);</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>7. 비교연산(equality)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const stringFive = '5';</p>
   <p>const numberFive = 5;</p>
   <p><br /></p>
   <p>// == 비교연산 - 타입변경 비교(loose equality, with type conversion)</p>
   <p>console.log(stringFive == numberFive);</p>
   <p>console.log(stringFive != numberFive);</p>
   <p><br /></p>
   <p>// === 비교연산 및 타입비교연산(strict equality, no type conversion)</p>
   <p>console.log(stringFive === numberFive);</p>
   <p>console.log(stringFive !== numberFive);</p>
   <p><br /></p>
   <p>// object비교연산(object equality by reference)</p>
   <p>const test1 = {name : 'test'};</p>
   <p>const test2 = {name : 'test'};</p>
   <p>const test3 = test1;</p>
   <p>console.log(test1 == test2);</p>
   <p>console.log(test1 === test2);</p>
   <p>console.log(test1 === test3);</p>
   <p><br /></p>
   <p>//연산 확인</p>
   <p>console.log(" br \n");</p>
   <p>console.log(0 == false); //true</p>
   <p>console.log(0 === false); //false</p>
   <p>console.log('' == false); //true</p>
   <p>console.log('' === false); //false</p>
   <p>console.log(null == undefined); //true</p>
   <p>console.log(null === undefined); //false</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>8. if조건문(Conditional operatiors: if)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>// if, else if, else</p>
   <p>const name = 'test';</p>
   <p>if(name === 'test'){</p>
   <p>    console.log("값이 같고 타입도 같습니다.");</p>
   <p>} else if(name === 'coder'){</p>
   <p>    console.log('값이 다르거나 타입이 다릅니다.')</p>
   <p>} else {</p>
   <p>    console.log('성립하는 조건이 없습니다.');</p>
   <p>}</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>9. 삼항연산(Ternary operator: ?)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>//비교구문?값1:값2(condition) ? value1 : value2);</p>
   <p>console.log(name==='test'?'yes':'no');</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>10. 스위치문(Switch statement)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>//다수의 구문을 비교(use for multiple if checks)</p>
   <p>//열거되는 값들을 비교(use for enum-like value check)</p>
   <p>//다중유효성 검사(use for multifle type checks in TS)</p>
   <p>const browser = 'IE';</p>
   <p>switch(browser) {</p>
   <p>    case 'IE':</p>
   <p>        console.log('아직도 이런걸 사용하나요?');</p>
   <p>        break;</p>
   <p>    case 'Chrome':</p>
   <p>    case 'Firefox':</p>
   <p>        console.log('좋아요 좋지요');</p>
   <p>        break;</p>
   <p>    default:</p>
   <p>        console.log('머지??');</p>
   <p>        break;</p>
   </div>
<p>}</p>
<p><br /></p>
<p><span style="color:#0000ff;"><b>11. 반복문(Loops)</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>//while반복문 : 조건이 참일 동안 실행</p>
   <p>//(while loop, while the condition is truthy, body code is executed)</p>
   <p>let i=3;</p>
   <p>while(i&gt;0){</p>
   <p>    console.log(`while : ${i}`);</p>
   <p>    i--;</p>
   <p>}</p>
   <p><br /></p>
   <p>//do~ while반복문 : do구문은 무조건 한번은 실행되고 while구문의 조건이 거짓일 때까지 반복문 실행</p>
   <p>//do while loop, body code is excuted first, then check the condition</p>
   <p>do{</p>
   <p>    console.log(`do while : ${i}`);</p>
   <p>    i--</p>
   <p>} while(i&gt;0);</p>
   <p><br /></p>
   <p>//for구문(for loop, for(begin; condition; step))</p>
   <p>for(i=0; i&lt;3; i++) {</p>
   <p>    console.log(`for : ${i}`);</p>
   <p>}</p>
   <p><br /></p>
   <p>//2씩 줄여가는 구문</p>
   <p>for(let i=10; i&gt;0; i-=2){</p>
   <p>    console.log(`inline variable for : ${i}`);</p>
   <p>}</p>
   <p><br /></p>
   <p>//2중for문(nestd loops)</p>
   <p>for(let i=0; i&lt;5; i++){</p>
   <p>    for(let j=0; j&lt;5; j++) {</p>
   <p>        console.log(`i : ${i}, j: ${j}`);</p>
   <p>    }</p>
   <p>}</p>
   <p><br /></p>
   <p>//break, continue</p>
   <p>for(let i=0; i&lt;11; i++) {</p>
   <p>    if(i%2 !== 0) {</p>
   <p>        continue;</p>
   <p>    }</p>
   <p>    console.log(` i : ${i}`);</p>
   <p>}</p>
   <p><br /></p>
   <p>for(let i=0; i&lt;11; i++){</p>
   <p>    console.log(`i : ${i}`);</p>
   <p>    if(i==8){</p>
   <p>        break;</p>
   <p>    }</p>
   <p>}</p>
   </div>
<p><br /></p>
<p><span style="color:#0000ff;"><b>※ false : 0, -0, null, '', false, undefined, let obj;</b></span></p>
<p><span style="color:#0000ff;"><b>※ true : -1, 'hello', 'false', [], let obj = new Array(), let obj = [], let obj = {}</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>let num = 1;</p>
   <p>if(num){</p>
   <p>    console.log('true!');</p>
   <p>} else {</p>
   <p>    console.log('false!');</p>
   <p>}</p>
   <p><br /></p>
   <p>//아래 문장을 해석하면 num의 값이 true라면 출력해라로 해석이되며</p>
   <p>//if문을 빼고 간단히 적을 수 가 있다.</p>
   <p>num &amp;&amp; console.log(` num : ${num}`);</p>
   <p><br /></p>
   <p>let obj = {</p>
   <p>    name : 'test',</p>
   <p>};</p>
   <p><br /></p>
   <p>obj &amp;&amp; console.log(`obj.name : ${obj.name}`);</p>
   <p><br /></p>
   </div>
<p> </p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-10T23:07:50+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 자바스크립트 변수 선언( var, let, const 차이)</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=50</link>
<description><![CDATA[<p>※ 자바스크립트 변수 선언</p>
<p> - 변수(Variables)는 변하는 데이터(값)를 저장할 수 있는 메모리 공간.</p>
<p> - 변수에 데이터 값은 한개만 저장되므로, 같은 변수를 두번 사용하게 되면 나중에 입력된 변수값으로 저장된다.</p>
<p> - <span style="color:#ff0000;">변수의 첫글자</span>에 사용할 수 있는 문자들은 <span style="color:#ff0000;">$</span>, <span style="color:#ff0000;">_</span> (언더바), <span style="color:#ff0000;">영문자</span> 만 사용가능</p>
<p> - 변수 선언시 <span style="color:#0000ff;"><b>'use strict';</b></span>  선언을 통해 오류를 보여주고 방지하자.</p>
<p> </p>
<p>변수선언( var = function-scoped )</p>
<p><br /></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>var 변수명;</p>
   <p>var 변수명 = 값;</p>
   </div>
<p> </p>
<p> 변수에 저장 할 수있는 자료형</p>
<p> - 자료형( Data Type ) - typeof 변수 또는 데이터; </p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>예) </p>
   <p>&lt;script type="text/javascript"&gt;</p>
   <p>var num = 100;</p>
   <p>var str = "문자";</p>
   <p>document.write(typeof num, "&lt;br&gt;"); //number;</p>
   <p>document.write(typeof str); //string</p>
   <p>&lt;/script&gt;</p>
   </div>
<p> - 문자형 ( String ); - var 변수명 = "사용할 문자나 숫자";</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>예)</p>
   <p>var str = "문자나숫자";</p>
   </div>
<p> - 숫자형 ( Number ); - var 변수명 = 숫자; 또는 Number("문자형숫자");</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>예)</p>
   <p>var num = 1; </p>
   <p>var num2 = Number("1");</p>
   </div>
<p> - 논리형 ( Boolean ); - var 변수명 = true or false; 또는 Boolean(데이터);</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>예)</p>
   <p>var s = true;</p>
   <p>var s = false;</p>
   <p>var a = 10 &gt;= 100; //false;</p>
   <p>var b = Boolean(0); //false</p>
   <p>var n = Boolean('홍길동'); //true</p>
   <p>var d = Boolean(null); //false</p>
   </div>
<p> </p>
<p> - 빈값 ( Undefined ); - var 변수명; 또는 var 변수명 = null;</p>
<p>var 로 변수 선언시 중복선언에 대한 문제가 있으므로 이를 보안하기 위해 es2015에서 let, const가 생겼다. </p>
<p>var 은 변수를 hoisting(선언부를 최상위로 끌어올려버리는 것)을 해서 사용하게 해주므로 오류를 발생하지 않게 바꿔버린다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(a); //오류발생하지 않음.</p>
   <p>a = 1; // 오류발생하지 않음.</p>
   <p>var a=1;</p>
   <p>var a=2;</p>
   </div>
<p>이러한 문제가 있음.</p>
<p> </p>
<p>변수선언( let, const = block-scoped )</p>
<p>사용방법은 var 와 같다.</p>
<p><span style="color:#ff0000;"><b>let은 재할당이 가능한 변수</b></span> 선언이다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>let a = 1;</p>
   <p>let a = 2; //Uncaught SyntaxError : Identifier 'a' has already been declared ( 중복 선언에 대한 오류가 발생 )</p>
   <p>a = 2; 는 가능</p>
   </div>
<p> </p>
<p><span style="color:#ff0000;"><b>const는 재할당이 불가능한 변수</b></span> 선언이다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const b = 1;</p>
   <p>const b = 2; //Uncaught SyntaxError : Identifier 'b' has already been declared ( 중복 선언에 대한 오류가 발생 )</p>
   <p>b = 2; //Uncaught SyntaxError : Identifier 'b' has already been declared ( 중복 선언에 대한 오류가 발생 )</p>
   </div>
<p> </p>
<p style="padding:0px;font-family:'Malgun Gothic', dotum, sans-serif;font-size:14.4px;background-color:#ffffff;"> - 연산을 할 때 연산하고 싶은 값이 정확히 무엇인지 알고 해야한다.</p>
<p style="padding:0px;font-family:'Malgun Gothic', dotum, sans-serif;font-size:14.4px;background-color:#ffffff;"> - 즉, 음수 양수 등의 값을 예상하고 문자와의 연산과 무한대의 연산을 피해야 한다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const infinity = 1/0; //무한대의 값이 존재한다. //출력값 : Infinity</p>
   <p>const negativeInfinity = -1/0; //역시 음수의 무한대 // 출력값 : -Infinity</p>
   <p>const nAn = 'not a number' / 2; //출력값 : NaN</p>
   </div>
<p><br /></p>
<p>null 과 undefined 은 엄연히 다른 값들이다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>let nothing = null; //값이 null로 정의</p>
   <p>let x; // 값이 정의 되지 않아 undefined;</p>
   </div>
<p><span style="color:#0000ff;"><b>특별한 식별자가 필요한 경우 Symbol()로 변수를 사용</b></span></p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const symbol1 = Symbol('id');</p>
   <p>const symbol2 = Symbol('id');</p>
   </div>
<p>특별한 식별자로 고유한 값을 가지므로 서로 다르다 그래서 false 가 된다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(symbol1 === symbol2); //false</p>
   </div>
<p> </p>
<p>이를 동일하게 해주고 싶다면 .for 를 사용해서 동일하게 만들어준다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const gSymbol1 = Symbol.for('id');</p>
   <p>const gSymbol2 = Symbol.for('id');</p>
   </div>
<p> </p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(gSymbol1 === gSymbol2);</p>
   </div>
<p> </p>
<p><span style="color:#ff0000;"><b>심볼을 출력할 때는 .description</b></span> 을 이용해서 확인한다.</p>
<p>.description이 없을경우 오류가 발생한다.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>console.log(`value : ${gSymbol1<span style="color:#ff0000;"><b>.description</b></span>}, type : ${typeof gSymbol1}`);</p>
   </div>
<p> </p>
<p>※ <span style="color:#7f00ff;"><b>번외 console.log 출력시 ` 기호를 사용하면 ${ } 를 이용하여 변수를 적어주어 출력이 가능</b></span>하다.</p>
<p> </p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>const test = {name:'tester', age:10}; //const로 변수를 선언했기 때문에 test라는 object는 변경이 불가능하다</p>
   </div>
<p>하지만.</p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>test.name = 20; //이런식으로의 접근 변경이 가능하다.</p>
   </div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-09T12:05:41+09:00</dc:date>
</item>


<item>
<title>[ javascript ] 자바스크립트 코드 작성시 주의 사항</title>
<link>http://funyphp.com/bbs/board.php?bo_table=javascript&amp;amp;wr_id=49</link>
<description><![CDATA[<p>javascript 는 대문자와 소문자를 구분한다.</p>
<p>코드가 끝났으면 ; 을 통해서 라인이 끝났다고 표시를 해준다.</p>
<p>가독성을 위해 코드는 한줄씩 사용하는게 좋다.</p>
<p>문자형 데이터를 작성할 때는 " 와 ' 를 사용해서 한다.</p>
<p>중복될 때는 \를 사용해서 사용한다.</p>
<p>문자 사잉에 "와 " 겹치지 않게 사용해줘야 한다.</p>
<p> </p>
<div style="padding:10px 10px 10px 18px;border-width:1px 1px 1px 4px;border-style:solid;border-color:#f42857;font-size:13px;line-height:19px;font-family:'courier 10 pitch', Courier, monospace;vertical-align:baseline;background-color:#051e30;color:#ffffff;">
   <p>document.write("동해물과 " 백수산이 " 마르고 닳도록 "); //오류구문</p>
   <p>document.write("동해물과 \" 백수산이 \" 마르고 닳도록 "); //정상구문</p>
   <p>document.write("동해물과 ' 백수산이 ' 마르고 닳도록 "); //정상구문</p>
   </div>
<p> </p>
<p>괄호를 열고 닫는 것도 잘 확인해 주어야 한다. ( ) 또는 { } </p>
<p> </p>]]></description>
<dc:creator>웹지기</dc:creator>
<dc:date>2021-02-09T11:41:37+09:00</dc:date>
</item>

</channel>
</rss>
