├── 1_basics ├── 8_memory.js ├── 1_hello_world.js ├── 2_comments.js ├── 6_hoisting.js ├── 16_try_catch.js ├── 3_declaring_variable.js ├── 4_naming_conventions.js ├── 9_if_and_switch.js ├── 11_coercion.js ├── 14_object.js ├── 15_copy_by_value_and_reference.js ├── 10_loops.js ├── 12_function.js ├── 13_must_know_array_functions.js ├── 5_data_types.js └── 7_operators.js ├── 3_all_about_object ├── 8_2_execution_context.html ├── 9_2_closure_example.html ├── 8_1_execution_context.html ├── 1_introduction.js ├── 4_using_function_to_create_objects.js ├── 6_scope.js ├── 7_this.js ├── 9_1_closure.js ├── 3_immutable_object.js ├── 2_property_attribute.js └── 5_prototype_chain.js ├── 4_async_programming ├── 3_async_await.js ├── 1_async_theory.js └── 2_callback_hell_and_promise.js └── 2_class_and_oop ├── 5_super_and_override.js ├── 1_class_keyword.js ├── 2_getter_and_setter.js ├── 3_static_keyword.js ├── 4_inheritance.js └── 6_class_problem.js /1_basics/8_memory.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 키노트로 대체 3 | */ -------------------------------------------------------------------------------- /1_basics/1_hello_world.js: -------------------------------------------------------------------------------- 1 | console.log('Hello World'); 2 | console.log('Hello', 'World'); -------------------------------------------------------------------------------- /1_basics/2_comments.js: -------------------------------------------------------------------------------- 1 | // 코멘트를 작성하는 첫번째 방법입니다. 2 | console.log('Hello World'); // 이거는 출력을 해줍니다. 3 | 4 | /** 5 | * 이렇게 하면 6 | * 코멘트를 여러 줄을 7 | * 작성 할 수 있습니다. 8 | */ -------------------------------------------------------------------------------- /3_all_about_object/8_2_execution_context.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /3_all_about_object/9_2_closure_example.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /1_basics/6_hoisting.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Hoisting 3 | */ 4 | console.log('Hello'); 5 | console.log('World'); 6 | console.log('----------'); 7 | 8 | // console.log(name); 9 | // var name = '코드팩토리'; 10 | // console.log(name); 11 | 12 | /** 13 | * Hoisting은 무엇인가? 14 | * 15 | * 모든 변수 선언문이 코드의 최상단으로 이동되는 것처럼 느껴지는 현상을 이야기한다. 16 | */ 17 | // var name; 18 | // console.log(name); 19 | // name = '코드팩토리'; 20 | // console.log(name); 21 | 22 | console.log(yuJin); 23 | const yuJin = '안유진'; -------------------------------------------------------------------------------- /3_all_about_object/8_1_execution_context.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /1_basics/16_try_catch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * try...catch 3 | * 4 | * 1) 발생시킬때 -> 던진다고한다. (throw) 5 | * 2) 명시적으로 인지할때 -> 잡는다고 한다. (catch) 6 | */ 7 | function runner() { 8 | try { 9 | console.log('Hello'); 10 | 11 | // throw new Error('큰 문제가 생겼습니다!'); 12 | 13 | console.log('Code Factory'); 14 | } catch (e) { 15 | console.log('---catch---'); 16 | console.log(e); 17 | } finally { 18 | console.log('---finally---'); 19 | } 20 | } 21 | runner(); -------------------------------------------------------------------------------- /1_basics/3_declaring_variable.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Variable 선언하기 3 | * 4 | * 1) var - 더이상 쓰지 않는다. 5 | * 2) let 6 | * 3) const 7 | */ 8 | var name = '코드팩토리'; 9 | console.log(name); 10 | 11 | var age = 32; 12 | console.log(age); 13 | 14 | let ive = '아이브'; 15 | console.log(ive); 16 | 17 | /** 18 | * let과 var로 선언하면 19 | * 값을 추후 변경할 수 있다. 20 | */ 21 | ive = '안유진'; 22 | console.log(ive); 23 | 24 | const newJeans = '뉴진스'; 25 | console.log(newJeans); 26 | 27 | // newJeans = '코드팩토리'; 28 | 29 | /** 30 | * 선언과 할당 31 | * 32 | * 1) 변수의 선언 33 | * 2) 값의 할당 34 | */ 35 | var name = '코드팩토리'; 36 | 37 | let girlFriend; 38 | console.log(girlFriend); 39 | 40 | const girlFriend2; -------------------------------------------------------------------------------- /4_async_programming/3_async_await.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Async / Await 3 | */ 4 | const getPromise = (seconds)=> new Promise((resolve, reject) => { 5 | setTimeout(()=>{ 6 | resolve('에러'); 7 | }, seconds * 1000) 8 | }); 9 | 10 | async function runner(){ 11 | try{ 12 | const result1 = await getPromise(1); 13 | console.log(result1); 14 | const result2 = await getPromise(2); 15 | console.log(result2); 16 | const result3 = await getPromise(1); 17 | console.log(result3); 18 | }catch(e){ 19 | console.log('---catch e---'); 20 | console.log(e); 21 | }finally{ 22 | console.log('---finally---'); 23 | } 24 | } 25 | 26 | runner(); -------------------------------------------------------------------------------- /3_all_about_object/1_introduction.js: -------------------------------------------------------------------------------- 1 | /** 2 | * All about objects 3 | * 4 | * 객체를 선언할때 사용 할 수 있는 방법들 5 | * 1) object를 생성해서 객체 생성 - 기본기 {} 6 | * 2) class를 인스턴스화해서 생성 - class와 OOP 7 | * 3) function을 사용해서 객체 생성 8 | */ 9 | 10 | const yuJin = { 11 | name: '안유진', 12 | year: 2003, 13 | }; 14 | console.log(yuJin); 15 | 16 | class IdolModel{ 17 | name; 18 | year; 19 | 20 | constructor(name, year){ 21 | this.name = name; 22 | this.year = year; 23 | } 24 | } 25 | console.log(new IdolModel('안유진', 2003)); 26 | 27 | // 생성자 함수 28 | function IdolFunction(name, year){ 29 | this.name = name; 30 | this.year = year; 31 | } 32 | 33 | const gaEul = new IdolFunction('가을', 2002); 34 | console.log(gaEul); -------------------------------------------------------------------------------- /3_all_about_object/4_using_function_to_create_objects.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Using function to create objects 3 | */ 4 | function IdolModel(name, year){ 5 | if(!new.target){ 6 | return new IdolModel(name, year); 7 | } 8 | 9 | this.name = name; 10 | this.year = year; 11 | 12 | this.dance = function(){ 13 | return `${this.name}이 춤을 춥니다.`; 14 | } 15 | } 16 | 17 | const yuJin = new IdolModel('안유진', 2003); 18 | console.log(yuJin); 19 | // console.log(yuJin.dance()); 20 | const yuJin2 = IdolModel('안유진', 2003); 21 | console.log(yuJin2); 22 | // console.log(global.name); 23 | 24 | const IdolModelArrow = (name, year)=>{ 25 | this.name = name; 26 | this.year = year; 27 | }; 28 | 29 | const yuJin3 = new IdolModelArrow('안유진', 2003); -------------------------------------------------------------------------------- /1_basics/4_naming_conventions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Naming Conventions 3 | * 4 | * 변수 이름 지을때 5 | * 1) 일반적으로 영어(라틴문자)를 사용하며 문자와 숫자를 모두 사용 할 수 있다. 6 | * 2) 특수기호는 언더스코어와 달러를 사용 할 수 있다. 7 | * 3) 숫자로 이름을 시작 할 수 없다. 8 | * 1Name, 2Hello 9 | * 4) 키워드는 변수명으로 사용 할 수 없다. 10 | * var const = 'var'; 11 | */ 12 | let codeFactory = '코드팩토리'; 13 | var $ive = '아이브'; 14 | const _yuJin = '안유진'; 15 | 16 | console.log(codeFactory); 17 | console.log($ive); 18 | console.log(_yuJin); 19 | 20 | // let 1name = 'no'; 21 | // let const = 'attention'; 22 | 23 | /** 24 | * Naming Convention 2 25 | * 26 | * 1) camelCase -> 대부분의 언어에서 많이 사용 27 | * 2) snake_case -> 파이썬같은 언어에서사용 28 | * 3) PascalCase -> C# 마이크로소프트 계열의 언어에서 사용함 29 | */ 30 | // 안유진 31 | const anYuJin = '안유진'; 32 | console.log(anYuJin); -------------------------------------------------------------------------------- /4_async_programming/1_async_theory.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Async theory 3 | */ 4 | // function longWork() { 5 | // const now = new Date(); 6 | 7 | // /** 8 | // * milliseconds since epoch 9 | // * 1970년도 1월 1일부터 지금 코드가 실행되는 순간까지의 시간을 10 | // * 밀리초로 반환한다. 11 | // */ 12 | // const milliseconds = now.getTime(); 13 | // const afterTwoSeconds = milliseconds + 2 * 1000; 14 | 15 | // while(new Date().getTime() < afterTwoSeconds){ 16 | 17 | // } 18 | 19 | // console.log('완료'); 20 | // } 21 | 22 | // console.log('Hello'); 23 | // longWork(); 24 | // console.log('World'); 25 | 26 | function longWork(){ 27 | setTimeout(()=>{ 28 | console.log('완료'); 29 | }, 2000); 30 | } 31 | 32 | console.log('Hello'); 33 | longWork(); 34 | console.log('World'); -------------------------------------------------------------------------------- /2_class_and_oop/5_super_and_override.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Super and Override 3 | */ 4 | class IdolModel{ 5 | name; 6 | year; 7 | 8 | constructor(name, year){ 9 | this.name = name; 10 | this.year = year; 11 | } 12 | 13 | sayHello(){ 14 | return `안녕하세요 ${this.name}입니다.`; 15 | } 16 | } 17 | 18 | class FemaleIdolModel extends IdolModel{ 19 | // 노래 / 춤 20 | part; 21 | 22 | constructor(name, year, part){ 23 | super(name, year); 24 | this.part = part; 25 | } 26 | 27 | sayHello(){ 28 | // return `안녕하세요 ${this.name}입니다. ${this.part}를 맡고있습니다.`; 29 | return `${super.sayHello()} ${this.part}를 맡고있습니다.`; 30 | } 31 | } 32 | 33 | const yuJin = new FemaleIdolModel('안유진', 2003, '보컬'); 34 | console.log(yuJin); 35 | 36 | const wonYoung = new IdolModel('장원영', 2002); 37 | console.log(wonYoung); 38 | console.log(wonYoung.sayHello()); 39 | console.log(yuJin.sayHello()); -------------------------------------------------------------------------------- /2_class_and_oop/1_class_keyword.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Class Keyword 3 | */ 4 | class IdolModel { 5 | name; 6 | year; 7 | 8 | constructor(name, year) { 9 | this.name = name; 10 | this.year = year; 11 | } 12 | 13 | sayName(){ 14 | return `안녕하세요 저는 ${this.name}입니다.`; 15 | } 16 | } 17 | 18 | // constructor - 생성자 19 | 20 | const yuJin = new IdolModel('안유진', 2003); 21 | console.log(yuJin); 22 | const gaeul = new IdolModel('가을', 2002); 23 | console.log(gaeul); 24 | const ray = new IdolModel('레이', 2004); 25 | console.log(ray); 26 | const wonYoung = new IdolModel('장원영', 2004); 27 | console.log(wonYoung); 28 | const liz = new IdolModel('리즈', 2004); 29 | console.log(liz); 30 | const eseo = new IdolModel('이서', 2007); 31 | console.log(eseo); 32 | 33 | console.log(yuJin.name); 34 | console.log(yuJin.year); 35 | 36 | console.log(yuJin.sayName()); 37 | console.log(wonYoung.sayName()); 38 | 39 | console.log(typeof IdolModel); 40 | console.log(typeof yuJin); -------------------------------------------------------------------------------- /1_basics/9_if_and_switch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * If and Switch 3 | */ 4 | let number = 5; 5 | 6 | if (number % 2 === 0) { 7 | console.log('number 변수는 짝수입니다.'); 8 | } else { 9 | console.log('number 변수는 홀수입니다.'); 10 | } 11 | 12 | if (number % 2 === 0) { 13 | console.log('2의 배수입니다.'); 14 | } else if (number % 3 === 0) { 15 | console.log('3의 배수입니다.'); 16 | } else if (number % 4 === 0) { 17 | console.log('4의 배수입니다.'); 18 | } else if (number % 5 === 0) { 19 | console.log('5의 배수입니다.'); 20 | } else { 21 | console.log('2, 3, 4, 5의 배수가 아닙니다.'); 22 | } 23 | 24 | const englishDay = 'saturday'; 25 | 26 | let koreanDay; 27 | 28 | switch(englishDay){ 29 | case 'monday': 30 | koreanDay = '월요일'; 31 | break; 32 | case 'tuesday': 33 | koreanDay = '화요일'; 34 | break; 35 | case 'wednesday': 36 | koreanDay = '수요일'; 37 | break; 38 | case 'thursday': 39 | koreanDay = '목요일'; 40 | break; 41 | case 'friday': 42 | koreanDay = '금요일'; 43 | break; 44 | default: 45 | koreanDay = '주말'; 46 | break; 47 | } 48 | 49 | console.log(koreanDay); -------------------------------------------------------------------------------- /2_class_and_oop/2_getter_and_setter.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Getter and Setter 3 | */ 4 | class IdolModel{ 5 | name; 6 | year; 7 | 8 | constructor(name, year){ 9 | this.name = name; 10 | this.year = year; 11 | } 12 | 13 | /** 14 | * 1) 데이터를 가공해서 새로운 데이터를 반환할때 15 | * 2) private한 값을 반환할때 16 | */ 17 | get nameAndYear(){ 18 | return `${this.name}-${this.year}`; 19 | } 20 | 21 | set setName(name){ 22 | this.name = name; 23 | } 24 | } 25 | 26 | const yuJin = new IdolModel('안유진', 2003); 27 | console.log(yuJin); 28 | console.log(yuJin.nameAndYear); 29 | 30 | yuJin.setName = '장원영'; 31 | console.log(yuJin); 32 | 33 | class IdolModel2{ 34 | #name; 35 | year; 36 | 37 | constructor(name, year){ 38 | this.#name = name; 39 | this.year = year; 40 | } 41 | 42 | get name(){ 43 | return this.#name; 44 | } 45 | 46 | set name(name){ 47 | this.#name = name; 48 | } 49 | } 50 | 51 | const yuJin2 = new IdolModel2('안유진', 2003); 52 | console.log(yuJin2); 53 | console.log(yuJin2.name); 54 | 55 | yuJin2.name = '코드팩토리'; 56 | console.log(yuJin2.name); -------------------------------------------------------------------------------- /1_basics/11_coercion.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 타입 변환 3 | * Type Conversion 4 | * 5 | * 1) 명시적 6 | * 2) 암묵적 7 | */ 8 | let age = 32; 9 | 10 | // 명시적 11 | let stringAge = age.toString(); 12 | console.log(typeof stringAge, stringAge); 13 | 14 | // 암묵적 15 | let test = age + ''; 16 | console.log(typeof test, test); 17 | 18 | console.log('98' + '2'); 19 | console.log(98 * 2); 20 | console.log('98' - 2); 21 | 22 | console.log('------------'); 23 | /** 24 | * 명시적 변환 몇가지 더 배우기 25 | */ 26 | console.log(typeof (99).toString(), (99).toString()); 27 | console.log(typeof (true).toString(), (true).toString()); 28 | console.log(typeof (Infinity).toString(), (Infinity).toString()); 29 | 30 | // 숫자 타입으로 변환 31 | console.log(typeof parseInt('0'), parseInt('0.99')); 32 | console.log(typeof parseFloat('0.99'), parseFloat('0.99')); 33 | console.log(typeof +'1', +'1'); 34 | 35 | console.log('-------------------_'); 36 | /** 37 | * Boolean 타입으로의 변환 38 | */ 39 | console.log(!!'asdkfjhalksdfjasdfx'); 40 | 41 | console.log(!!''); 42 | 43 | console.log(!!0); 44 | console.log(!!'0'); 45 | console.log(!!'false'); 46 | console.log(!!false); 47 | console.log(!!undefined); 48 | console.log(!!null); 49 | 50 | console.log(!!{}); 51 | console.log(!![]); 52 | 53 | /** 54 | * 1) 아무 글자도 없는 String 55 | * 2) 값이 없는 경우 56 | * 3) 0 57 | * 58 | * 모두 false를 반환한다. 59 | */ -------------------------------------------------------------------------------- /2_class_and_oop/3_static_keyword.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Static Keyword 3 | */ 4 | // class IdolModel { 5 | // name; 6 | // year; 7 | // static groupName = '아이브'; 8 | 9 | // constructor(name, year) { 10 | // this.name = name; 11 | // this.year = year; 12 | // } 13 | 14 | // static returnGroupName(){ 15 | // return '아이브'; 16 | // } 17 | // } 18 | 19 | // const yuJin = new IdolModel('안유진', 2003); 20 | // console.log(yuJin); 21 | 22 | // console.log(IdolModel.groupName); 23 | // console.log(IdolModel.returnGroupName()); 24 | 25 | /** 26 | * factory constructor 27 | */ 28 | class IdolModel{ 29 | name; 30 | year; 31 | 32 | constructor(name, year){ 33 | this.name = name; 34 | this.year = year; 35 | } 36 | 37 | static fromObject(object){ 38 | return new IdolModel( 39 | object.name, 40 | object.year, 41 | ); 42 | } 43 | 44 | static fromList(list){ 45 | return new IdolModel( 46 | list[0], 47 | list[1], 48 | ); 49 | } 50 | } 51 | 52 | const yuJin2 = IdolModel.fromObject({ 53 | name: '안유진', 54 | year: 2003, 55 | }); 56 | console.log(yuJin2); 57 | 58 | const wonYoung = IdolModel.fromList( 59 | [ 60 | '장원영', 61 | 2003, 62 | ] 63 | ); 64 | console.log(wonYoung); -------------------------------------------------------------------------------- /2_class_and_oop/4_inheritance.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Inheritance 3 | */ 4 | class IdolModel{ 5 | name; 6 | year; 7 | 8 | constructor(name, year){ 9 | this.name = name; 10 | this.year = year; 11 | } 12 | } 13 | 14 | class FemaleIdolModel extends IdolModel { 15 | dance(){ 16 | return '여자 아이돌이 춤을 춥니다.'; 17 | } 18 | } 19 | 20 | class MaleIdolModel extends IdolModel{ 21 | sing(){ 22 | return '남자 아이돌이 노래를 부릅니다.'; 23 | } 24 | } 25 | 26 | const yuJin = new FemaleIdolModel('안유진', 2003); 27 | console.log(yuJin); 28 | 29 | const jiMin = new MaleIdolModel('지민', 1995); 30 | console.log(jiMin); 31 | 32 | console.log(yuJin.dance()); 33 | console.log(yuJin.name); 34 | 35 | console.log(jiMin.sing()); 36 | console.log(jiMin.year); 37 | 38 | const cf = new IdolModel('코드팩토리', 1992); 39 | console.log(cf); 40 | 41 | console.log(cf.name); 42 | 43 | console.log(yuJin instanceof IdolModel); 44 | console.log(yuJin instanceof FemaleIdolModel); 45 | console.log(yuJin instanceof MaleIdolModel); 46 | 47 | console.log('----------'); 48 | console.log(jiMin instanceof IdolModel); 49 | console.log(jiMin instanceof FemaleIdolModel); 50 | console.log(jiMin instanceof MaleIdolModel); 51 | 52 | console.log('-------------'); 53 | console.log(cf instanceof IdolModel); 54 | console.log(cf instanceof FemaleIdolModel); 55 | console.log(cf instanceof MaleIdolModel); 56 | -------------------------------------------------------------------------------- /3_all_about_object/6_scope.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Scope 3 | */ 4 | var numberOne = 20; 5 | 6 | function levelOne(){ 7 | console.log(numberOne); 8 | } 9 | 10 | // levelOne(); 11 | 12 | function levelOne(){ 13 | var numberOne = 40; 14 | 15 | console.log(numberOne); 16 | } 17 | 18 | // levelOne(); 19 | 20 | console.log(numberOne); 21 | 22 | function levelOne(){ 23 | var numberOne = 40; 24 | 25 | function levelTwo(){ 26 | var numberTwo = 99; 27 | 28 | console.log(`levelTwo numberTwo : ${numberTwo}`); 29 | console.log(`levelTwo numberOne : ${numberOne}`); 30 | } 31 | 32 | levelTwo(); 33 | console.log(`levelOne numberOne : ${numberOne}`); 34 | } 35 | 36 | levelOne(); 37 | console.log(numberOne); 38 | // console.log(numberTwo); 39 | 40 | /** 41 | * JS -> Lexical Scope 42 | * 43 | * 선언된 위치가 상위 스코프를 정한다. 44 | * 45 | * Dynamic Scope 46 | * 47 | * 실행한 위치가 상위 스코프를 정한다. 48 | */ 49 | var numberThree = 3; 50 | 51 | function functionOne(){ 52 | var numberThree = 100; 53 | 54 | functionTwo(); 55 | } 56 | 57 | function functionTwo(){ 58 | console.log(numberThree); 59 | } 60 | 61 | functionOne(); 62 | 63 | var i = 999; 64 | 65 | for(var i = 0; i < 10; i++){ 66 | console.log(i); 67 | } 68 | console.log(`i in global scope : ${i}`) 69 | 70 | i = 999; 71 | // block level scope 72 | for(let i = 0; i < 10; i++){ 73 | console.log(i); 74 | } 75 | console.log(`i in global scope : ${i}`); 76 | 77 | /** 78 | * var 키워드는 함수 레벨 스코프만 만들어낸다. 79 | * 80 | * let, const 키워드는 함수 레벨 스코프와 블록 레벨 스코프를 만들어낸다. 81 | */ -------------------------------------------------------------------------------- /1_basics/14_object.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Object / 객체 3 | */ 4 | 5 | // key : value pair 6 | let yuJin = { 7 | name: '안유진', 8 | group: '아이브', 9 | dance: function () { 10 | return `${this.name}이 춤을 춥니다.`; 11 | } 12 | }; 13 | 14 | console.log(yuJin); 15 | console.log(yuJin.name); 16 | console.log(yuJin['name']); 17 | 18 | const key = 'name'; 19 | 20 | console.log(yuJin[key]); 21 | 22 | console.log(yuJin.dance()); 23 | 24 | const nameKey = 'name'; 25 | const nameValue = '안유진'; 26 | 27 | const groupKey = 'group'; 28 | const groupValue = '아이브'; 29 | 30 | const yuJin2 = { 31 | [nameKey]: nameValue, 32 | [groupKey]: groupValue, 33 | dance: function(){ 34 | return `${this.name}이 춤을 춥니다.`; 35 | } 36 | } 37 | console.log(yuJin2); 38 | console.log(yuJin2.dance()); 39 | 40 | yuJin2['group'] = '코드팩토리'; 41 | console.log(yuJin2); 42 | 43 | yuJin2['englishName'] = 'An Yu Jin'; 44 | console.log(yuJin2); 45 | 46 | delete yuJin2['englishName']; 47 | console.log(yuJin2); 48 | 49 | /** 50 | * const로 선언한 객체의 특징 51 | * 52 | * 1) const로 선언할경우 객체 자체를 변경 할 수는 없다. 53 | * 2) 객체 안의 프로퍼티나 메서드는 변경 할 수 있다. 54 | */ 55 | const wonYoung = { 56 | name: '장원영', 57 | group: '아이브', 58 | } 59 | console.log(wonYoung); 60 | 61 | // wonYoung = {}; 62 | 63 | wonYoung['group'] = '코드팩토리'; 64 | console.log(wonYoung); 65 | 66 | /** 67 | * 모든 키값 다 가져오기 68 | */ 69 | console.log(Object.keys(wonYoung)); 70 | 71 | /** 72 | * 모든 벨류값 다 가져오기 73 | */ 74 | console.log(Object.values(wonYoung)); 75 | 76 | const name = '안유진'; 77 | 78 | const yuJin3 = { 79 | name: name, 80 | name, 81 | }; 82 | console.log(yuJin3); -------------------------------------------------------------------------------- /4_async_programming/2_callback_hell_and_promise.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Callback 3 | */ 4 | function waitAndRun() { 5 | setTimeout(() => { 6 | console.log('끝'); 7 | }, 2000); 8 | } 9 | 10 | // waitAndRun(); 11 | 12 | function waitAndRun2() { 13 | setTimeout( 14 | () => { 15 | console.log('1번 콜백 끝'); 16 | setTimeout(() => { 17 | console.log('2번 콜백 끝'); 18 | setTimeout(() => { 19 | console.log('3번 콜백 끝'); 20 | }, 2000); 21 | }, 2000); 22 | }, 2000); 23 | } 24 | 25 | // waitAndRun2(); 26 | 27 | /** 28 | * Promise 29 | */ 30 | const timeoutPromise = new Promise((resolve, reject) => { 31 | setTimeout(() => { 32 | resolve('완료'); 33 | }, 2000); 34 | }); 35 | 36 | // timeoutPromise.then((res) => { 37 | // console.log('---then---'); 38 | // console.log(res); 39 | // }); 40 | 41 | const getPromise = (seconds) => new Promise((resolve, reject) => { 42 | setTimeout(() => { 43 | // if(xxx){ 44 | // resolve('성공') 45 | // }else{ 46 | // reject('에러'); 47 | // } 48 | resolve('에러'); 49 | }, seconds * 1000); 50 | }); 51 | 52 | // getPromise(3) 53 | // .then((res) => { 54 | // console.log('--- first then ---'); 55 | // console.log(res); 56 | // }) 57 | // .catch((res)=>{ 58 | // console.log('--- first catch ---'); 59 | // console.log(res); 60 | // }) 61 | // .finally(()=>{ 62 | // console.log('--- finally ---'); 63 | // }); 64 | 65 | Promise.all([ 66 | getPromise(1), 67 | getPromise(4), 68 | getPromise(1), 69 | ]).then((res)=>{ 70 | console.log(res); 71 | }); -------------------------------------------------------------------------------- /1_basics/15_copy_by_value_and_reference.js: -------------------------------------------------------------------------------- 1 | /** 2 | * copy by value 값에 의한 전달 3 | * copy by reference 참조에 의한 전달 4 | * 5 | * 1) 기본적으로 모든 primitive 값은 copy by value다 6 | * 2) 객체는 copy by reference다 7 | */ 8 | let original = '안녕하세요'; 9 | let clone = original; 10 | 11 | console.log(original); 12 | console.log(clone); 13 | 14 | clone += ' 안유진 입니다.'; 15 | console.log('--------------'); 16 | console.log(original); 17 | console.log(clone); 18 | 19 | let originalObj = { 20 | name: '안유진', 21 | group: '아이브', 22 | }; 23 | let cloneObj = originalObj; 24 | 25 | console.log(originalObj); 26 | console.log(cloneObj); 27 | 28 | console.log('----------'); 29 | 30 | originalObj['group'] = '코드팩토리'; 31 | console.log(originalObj); 32 | console.log(cloneObj); 33 | 34 | console.log(originalObj === cloneObj); 35 | console.log(original === clone); 36 | 37 | originalObj = { 38 | name: '최지호', 39 | group: '코드팩토리', 40 | }; 41 | cloneObj = { 42 | name: '최지호', 43 | group: '코드팩토리', 44 | }; 45 | console.log(originalObj === cloneObj); 46 | 47 | const yuJin1 = { 48 | name: '안유진', 49 | group: '아이브', 50 | } 51 | const yuJin2 = yuJin1; 52 | const yuJin3 = { 53 | name: '안유진', 54 | group: '아이브', 55 | } 56 | 57 | // true 58 | console.log(yuJin1 === yuJin2); 59 | // false 60 | console.log(yuJin1 === yuJin3); 61 | // false 62 | console.log(yuJin2 === yuJin3); 63 | 64 | /** 65 | * Spread Operator 66 | */ 67 | const yuJin4 = { 68 | ...yuJin3, 69 | }; 70 | console.log(yuJin4); 71 | 72 | console.log(yuJin4 === yuJin3); 73 | 74 | const yuJin5 = { 75 | year: 2003, 76 | ...yuJin3, 77 | }; 78 | console.log(yuJin5); 79 | 80 | const yuJin6 = { 81 | name: '코드팩토리', 82 | ...yuJin3, 83 | }; 84 | console.log(yuJin6); 85 | 86 | const yuJin7 = { 87 | ...yuJin3, 88 | name: '코드팩토리', 89 | } 90 | console.log(yuJin7); 91 | 92 | const numbers = [1, 3, 5]; 93 | const numbers2 = [ 94 | ...numbers, 95 | 10, 96 | ]; 97 | console.log(numbers2); -------------------------------------------------------------------------------- /3_all_about_object/7_this.js: -------------------------------------------------------------------------------- 1 | /** 2 | * this 3 | * 4 | * JS는 Lexical Scope를 사용하기때문에 함수의 상위 스코프가 5 | * 정의 시점에 평가된다. 6 | * 7 | * *****하지만 this 키워드는 바인딩이 객체가 생성되는 시점에 결정된다. 8 | */ 9 | const testFunction = function(){ 10 | return this; 11 | } 12 | 13 | console.log(testFunction()); 14 | console.log(testFunction() === global); 15 | 16 | const yuJin = { 17 | name: '안유진', 18 | year: 2003, 19 | sayHello: function(){ 20 | return `안녕하세요 저는 ${this.name}입니다.`; 21 | }, 22 | } 23 | 24 | console.log(yuJin.sayHello()); 25 | 26 | function Person(name, year){ 27 | this.name = name; 28 | this.year = year; 29 | 30 | this.sayHello = function(){ 31 | return `안녕하세요 저는 ${this.name}입니다.`; 32 | } 33 | } 34 | 35 | const yuJin2 = new Person('안유진', 2003); 36 | console.log(yuJin2.sayHello()); 37 | 38 | Person.prototype.dance = function(){ 39 | function dance2(){ 40 | return `${this.name}이 춤을춥니다.`; 41 | } 42 | 43 | return dance2(); 44 | } 45 | console.log(yuJin2.dance()); 46 | 47 | /** 48 | * this 키워드가 어떤걸 가르키냐는 세가지만 기억하면된다. 49 | * 50 | * 1) 일반 함수 호출할땐 this가 최상위 객체 (global 또는 window)를 가리킨다. 51 | * 2) 메서드로 호출할땐 호출된 객체를 가리킨다. 52 | * 3) new 키워드를 사용해서 객체를 생성했을땐 객체를 가리킨다. 53 | */ 54 | 55 | /** 56 | * 1) apply() 57 | * 2) call() 58 | * 3) bind() 59 | */ 60 | function returnName(){ 61 | return this.name; 62 | } 63 | 64 | console.log(returnName()); 65 | 66 | const yuJin3 = { 67 | name: '안유진', 68 | } 69 | 70 | console.log(returnName.call(yuJin3)); 71 | console.log(returnName.apply(yuJin3)); 72 | 73 | /** 74 | * 1) call -> 컴마를 기반으로 아규먼트를 순서대로 넘겨주고 75 | * 2) apply -> 아규먼트를 리스트로 입력해야한다. 76 | */ 77 | function multiply(x, y, z){ 78 | return `${this.name} / 결과값 : ${x * y * z}`; 79 | } 80 | 81 | console.log(multiply.call(yuJin3, 3, 4, 5)); 82 | console.log(multiply.apply(yuJin3, [3, 4, 5])); 83 | 84 | /** 85 | * bind() 86 | */ 87 | const laterFunc = multiply.bind(yuJin3, 3, 4, 5); 88 | console.log(laterFunc); 89 | console.log(laterFunc()); -------------------------------------------------------------------------------- /3_all_about_object/9_1_closure.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Closure 3 | * 4 | * A closure is the combination of a function and the lexical 5 | * environemnt within which that function was declared 6 | * 7 | * "클로저는 어떤 함수와 해당 함수가 선언된 렉시컬 환경의 조합이다." 8 | * 9 | * "상위 함수보다 하위 함수가 더 오래 살아있는 경우를 closure라고 한다." 10 | */ 11 | function getNumber() { 12 | var number = 5; 13 | 14 | function innerGetNumber() { 15 | return number; 16 | } 17 | 18 | return innerGetNumber(); 19 | } 20 | 21 | // console.log(number); 22 | 23 | // console.log(getNumber()); 24 | 25 | function getNumber() { 26 | var number = 5; 27 | 28 | function innerGetNumber() { 29 | return number; 30 | } 31 | 32 | return innerGetNumber; 33 | } 34 | 35 | const runner = getNumber(); 36 | 37 | console.log(runner); 38 | console.log(runner()); 39 | 40 | /** 41 | * 1) 데이터 캐싱 42 | */ 43 | function cacheFunction() { 44 | // 아래 계산은 매우 오래걸린다는 가정을 했을때 45 | var number = 10 * 10; 46 | 47 | function innerCacheFunction(newNumb){ 48 | return number * newNumb; 49 | } 50 | 51 | return innerCacheFunction; 52 | } 53 | 54 | const runner2 = cacheFunction(); 55 | console.log(runner2(10)); 56 | console.log(runner2(20)); 57 | 58 | function cacheFunction2(){ 59 | var number = 99; 60 | 61 | function increment(){ 62 | number ++; 63 | return number; 64 | } 65 | 66 | return increment; 67 | } 68 | 69 | const runner3 = cacheFunction2(); 70 | console.log(runner3()); 71 | console.log(runner3()); 72 | console.log(runner3()); 73 | console.log(runner3()); 74 | console.log(runner3()); 75 | console.log(runner3()); 76 | console.log(runner3()); 77 | 78 | /** 79 | * 3) 정보 은닉 80 | */ 81 | function Idol(name, year){ 82 | this.name = name; 83 | 84 | var _year = year; 85 | 86 | this.sayNameAndYear = function(){ 87 | return `안녕하세요 저는 ${this.name}입니다. ${_year}에 태어났습니다.`; 88 | } 89 | } 90 | 91 | const yuJin = new Idol('안유진', 2003); 92 | console.log(yuJin.sayNameAndYear()); 93 | 94 | console.log(yuJin.name); 95 | console.log(yuJin._year); -------------------------------------------------------------------------------- /1_basics/10_loops.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Loops 3 | * 4 | * 1) for 5 | * 2) while 6 | */ 7 | for (let i = 0; i < 10; i++) { 8 | console.log(i); 9 | } 10 | 11 | console.log('------------'); 12 | 13 | for (let i = 10; i > 0; i--) { 14 | console.log(i); 15 | } 16 | 17 | console.log('------------'); 18 | 19 | for (let i = 0; i < 3; i++) { 20 | for (let j = 3; j > 0; j--) { 21 | console.log(i, j); 22 | } 23 | } 24 | 25 | // *을 이용해서 6x6의 정사각형를 출력해라 26 | let square = ''; 27 | let side = 6; 28 | 29 | for (let i = 0; i < side; i++) { 30 | for (let j = 0; j < side; j++) { 31 | square += '*'; 32 | } 33 | square += '\n'; 34 | } 35 | 36 | console.log(square); 37 | 38 | /** 39 | * for...in 40 | */ 41 | const yuJin = { 42 | name: '안유진', 43 | year: 2003, 44 | group: '아이브', 45 | } 46 | 47 | console.log('------------'); 48 | 49 | for (let key in yuJin) { 50 | console.log(key); 51 | } 52 | 53 | const iveMembersArray = ['안유진', '가을', '레이', '장원영', '리즈', '이서']; 54 | 55 | console.log('------------'); 56 | 57 | for (let key in iveMembersArray) { 58 | console.log(key); 59 | console.log(`${key}:${iveMembersArray[key]}`); 60 | } 61 | 62 | /** 63 | * for...of 64 | */ 65 | for (let value of iveMembersArray) { 66 | console.log(value); 67 | } 68 | 69 | /** 70 | * While 71 | */ 72 | let number = 0; 73 | 74 | while (number < 10) { 75 | number++; 76 | } 77 | 78 | console.log(number); 79 | 80 | /** 81 | * do...while 82 | */ 83 | number = 0; 84 | 85 | do { 86 | number++; 87 | } while (number < 10); 88 | 89 | console.log(number); 90 | 91 | /** 92 | * break 93 | */ 94 | console.log('--------------'); 95 | for (let i = 0; i < 10; i++) { 96 | if (i === 5) { 97 | break; 98 | } 99 | console.log(i); 100 | } 101 | 102 | console.log('-------------'); 103 | number = 0; 104 | 105 | while(number < 10){ 106 | if(number === 5){ 107 | break; 108 | } 109 | 110 | number ++; 111 | console.log(number); 112 | } 113 | 114 | /** 115 | * continue 116 | */ 117 | console.log('---------------'); 118 | for(let i = 0; i < 10; i++){ 119 | if(i === 5){ 120 | continue; 121 | } 122 | console.log(i); 123 | } 124 | 125 | 126 | console.log('----------------'); 127 | number = 0; 128 | 129 | while(number < 10){ 130 | number ++; 131 | 132 | if(number === 5){ 133 | continue; 134 | } 135 | 136 | console.log(number); 137 | } -------------------------------------------------------------------------------- /3_all_about_object/3_immutable_object.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Immutable Object 3 | */ 4 | const yuJin = { 5 | name: '안유진', 6 | year: 2003, 7 | 8 | get age(){ 9 | return new Date().getFullYear() - this.year; 10 | }, 11 | 12 | set age(age){ 13 | this.year = new Date().getFullYear() - age; 14 | } 15 | } 16 | 17 | console.log(yuJin); 18 | 19 | /** 20 | * Extensible 21 | */ 22 | console.log(Object.isExtensible(yuJin)); 23 | 24 | yuJin['position'] = 'vocal'; 25 | 26 | console.log(yuJin); 27 | 28 | Object.preventExtensions(yuJin); 29 | 30 | console.log(Object.isExtensible(yuJin)); 31 | 32 | yuJin['groupName'] = '아이브'; 33 | console.log(yuJin); 34 | 35 | delete yuJin['position']; 36 | console.log(yuJin); 37 | 38 | /** 39 | * Seal 40 | */ 41 | const yuJin2 = { 42 | name: '안유진', 43 | year: 2003, 44 | 45 | get age(){ 46 | return new Date().getFullYear() - this.year; 47 | }, 48 | 49 | set age(age){ 50 | this.year = new Date().getFullYear() - age; 51 | } 52 | } 53 | console.log(yuJin2); 54 | 55 | console.log(Object.isSealed(yuJin2)); 56 | 57 | Object.seal(yuJin2); 58 | 59 | console.log(Object.isSealed(yuJin2)); 60 | 61 | yuJin2['groupName'] = '아이브'; 62 | console.log(yuJin2); 63 | 64 | delete yuJin2['name']; 65 | console.log(yuJin2); 66 | 67 | Object.defineProperty(yuJin2, 'name', { 68 | writable: false, 69 | }); 70 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'name')); 71 | 72 | /** 73 | * Freezed 74 | * 75 | * 읽기 외에 모든 기능을 불가능하게 만든다. 76 | */ 77 | const yuJin3 = { 78 | name: '안유진', 79 | year: 2003, 80 | 81 | get age(){ 82 | return new Date().getFullYear() - this.year; 83 | }, 84 | 85 | set age(age){ 86 | this.year = new Date().getFullYear() - age; 87 | } 88 | } 89 | console.log(Object.isFrozen(yuJin3)); 90 | 91 | Object.freeze(yuJin3); 92 | console.log(Object.isFrozen(yuJin3)); 93 | 94 | yuJin3['groupName'] = '아이브'; 95 | console.log(yuJin3); 96 | 97 | delete yuJin3['name']; 98 | console.log(yuJin3); 99 | 100 | // Object.defineProperty(yuJin3, 'name', { 101 | // value: '코드팩토리', 102 | // }) 103 | console.log(Object.getOwnPropertyDescriptor(yuJin3, 'name')); 104 | 105 | const yuJin4 = { 106 | name: '안유진', 107 | year: 2003, 108 | wonYoung: { 109 | name: '장원영', 110 | year: 2002, 111 | }, 112 | }; 113 | Object.freeze(yuJin4); 114 | 115 | console.log(Object.isFrozen(yuJin4)); 116 | console.log(Object.isFrozen(yuJin4['wonYoung'])); -------------------------------------------------------------------------------- /1_basics/12_function.js: -------------------------------------------------------------------------------- 1 | /** 2 | * function -> 함수 3 | */ 4 | 5 | /** 6 | * 만약에 2라는 숫자에 * 10/ 2 % 3 스트링으로 변환해서 7 | * 반환받고싶다면 어떻게 해야할까? 8 | */ 9 | console.log((2 * 10 / 2 % 3).toString()); 10 | console.log((3 * 10 / 2 % 3).toString()); 11 | 12 | /** 13 | * DRY 14 | * D -> Don't 15 | * R -> Repeat 16 | * Y -> Yourself 17 | */ 18 | function calculate() { 19 | console.log((3 * 10 / 2 % 3).toString()); 20 | } 21 | 22 | // calculate(); 23 | 24 | function calculate(number) { 25 | console.log((number * 10 / 2 % 3).toString()); 26 | } 27 | 28 | /** 29 | * 함수에서 입력받는 값에대한 정의를 Parameter라고한다. 30 | * 31 | * 실제 입력하는 값은 argument라고 한다. 32 | */ 33 | calculate(4); 34 | calculate(5); 35 | 36 | function multiply(x, y) { 37 | console.log(x * y); 38 | } 39 | 40 | multiply(2, 4); 41 | 42 | function multiply(x, y = 10) { 43 | console.log(x * y); 44 | } 45 | 46 | multiply(2, 4); 47 | multiply(2); 48 | 49 | /** 50 | * 반환받기 51 | * return 받기 52 | */ 53 | console.log('---------------'); 54 | function multiply(x, y) { 55 | return x * y; 56 | } 57 | 58 | const result1 = multiply(2, 4); 59 | console.log(result1); 60 | 61 | const result2 = multiply(4, 5); 62 | console.log(result2); 63 | 64 | /** 65 | * Arrow 함수 66 | */ 67 | const multiply2 = (x, y) => { 68 | return x * y; 69 | } 70 | console.log(multiply2(3, 4)); 71 | 72 | const multiply3 = (x, y) => x * y; 73 | console.log(multiply3(4, 5)); 74 | 75 | const multiply4 = x => x * 2; 76 | console.log(multiply4(2)); 77 | 78 | const multiply5 = x => y => z => `x: ${x} y: ${y} z:${z}`; 79 | console.log(multiply5(2)(5)(7)); 80 | 81 | function multiply6(x) { 82 | return function (y) { 83 | return function (z) { 84 | return `x: ${x} y: ${y} z:${z}` 85 | } 86 | } 87 | } 88 | console.log(multiply6(3)(4)(5)); 89 | 90 | const multiplyTwo = function (x, y) { 91 | return x * y; 92 | } 93 | console.log(multiplyTwo(4, 5)); 94 | 95 | const multiplyThree = function (x, y, z) { 96 | console.log(arguments); 97 | return x * y * z; 98 | } 99 | 100 | console.log('-----------------'); 101 | console.log(multiplyThree(4, 5, 6)); 102 | 103 | const multiplyAll = function (...arguments) { 104 | return Object.values(arguments).reduce((a, b) => a * b, 1); 105 | } 106 | 107 | console.log(multiplyAll(3, 4, 5, 6, 7, 8, 9, 10)); 108 | 109 | // immediately invoked function 110 | (function(x, y){ 111 | console.log(x * y); 112 | })(4, 5) 113 | 114 | console.log(typeof multiply); 115 | console.log(multiply instanceof Object); -------------------------------------------------------------------------------- /1_basics/13_must_know_array_functions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Array Functions 3 | */ 4 | let iveMembers = [ 5 | '안유진', 6 | '가을', 7 | '레이', 8 | '장원영', 9 | '리즈', 10 | '이서', 11 | ]; 12 | 13 | console.log(iveMembers); 14 | 15 | // push() 16 | console.log(iveMembers.push('코드팩토리')); 17 | console.log(iveMembers); 18 | 19 | console.log('---------------_'); 20 | // pop() 21 | console.log(iveMembers.pop()); 22 | console.log(iveMembers); 23 | 24 | console.log('---------------_'); 25 | // shift() 26 | console.log(iveMembers.shift()); 27 | console.log(iveMembers); 28 | 29 | // unshift() 30 | console.log(iveMembers.unshift('안유진')); 31 | console.log(iveMembers); 32 | 33 | console.log('---------------_'); 34 | 35 | // splice() 36 | console.log(iveMembers.splice(0, 3)) 37 | console.log(iveMembers); 38 | 39 | iveMembers = [ 40 | '안유진', 41 | '가을', 42 | '레이', 43 | '장원영', 44 | '리즈', 45 | '이서', 46 | ]; 47 | 48 | console.log(iveMembers); 49 | 50 | // concat() 51 | console.log(iveMembers.concat('코드팩토리')); 52 | console.log(iveMembers); 53 | 54 | // slice() 55 | console.log(iveMembers.slice(0, 3)); 56 | console.log(iveMembers); 57 | 58 | // spread operator 59 | let iveMembers2 = [ 60 | ...iveMembers, 61 | ]; 62 | console.log(iveMembers2); 63 | 64 | let iveMembers3 = [ 65 | iveMembers, 66 | ]; 67 | console.log(iveMembers3); 68 | 69 | 70 | console.log('--------------'); 71 | let iveMembers4 = iveMembers; 72 | 73 | console.log(iveMembers4); 74 | console.log(iveMembers4 === iveMembers); 75 | 76 | console.log([ 77 | ...iveMembers, 78 | ] === iveMembers); 79 | 80 | // join() 81 | console.log(iveMembers.join()); 82 | console.log(iveMembers.join('/')); 83 | console.log(iveMembers.join(', ')); 84 | 85 | // sort() 86 | // 오름차순 87 | iveMembers.sort(); 88 | console.log(iveMembers); 89 | 90 | console.log(iveMembers.reverse()); 91 | 92 | let numbers = [ 93 | 1, 94 | 9, 95 | 7, 96 | 5, 97 | 3, 98 | ]; 99 | console.log(numbers); 100 | 101 | // a, b를 비교했을때 102 | // 1) a를 b 보다 나중에 정렬하려면 (뒤에두려면) 0보다 큰 숫자를 반환 103 | // 2) a를 b 보다 먼저 정렬하려면 (앞에두려면) 0보다 작은 숫자를 반환 104 | // 3) 원래 순서를 그대로 두려면 0을 반환 105 | numbers.sort((a, b) => { 106 | return a > b ? 1 : -1; 107 | }); 108 | console.log(numbers); 109 | 110 | numbers.sort((a, b) => a > b ? -1 : 1); 111 | console.log(numbers); 112 | 113 | // map() 114 | console.log('--------------'); 115 | console.log(iveMembers.map((x) => x)); 116 | console.log(iveMembers.map((x) => `아이브: ${x}`)); 117 | 118 | console.log(iveMembers.map((x) => { 119 | if (x === '안유진') { 120 | return `아이브: ${x}`; 121 | } else { 122 | return x; 123 | } 124 | })); 125 | console.log(iveMembers); 126 | 127 | // filter() 128 | numbers = [1, 8, 7, 6, 3]; 129 | 130 | console.log(numbers.filter((x) => x % 2 === 0)); 131 | 132 | // find() 133 | console.log(numbers.find((x) => x % 2 === 0)); 134 | 135 | // findIndex() 136 | console.log(numbers.findIndex((x) => x % 2 === 0)); 137 | 138 | // reduce() 139 | console.log(numbers.reduce((p, n) => p + n, 0)); 140 | 141 | // reduce() 퀴즈 142 | // reduce() 함수를 사용해서 iveMembers 변수에 있는 모든 스트링 값들의 143 | // 길이를 더해서 반환하라. 144 | // 참고로 string의 길이는 .length를 이용해서 구할 수 있다. 145 | console.log(iveMembers.reduce((p, n) => p + n.length, 0)) -------------------------------------------------------------------------------- /3_all_about_object/2_property_attribute.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Property Attribute 3 | * 4 | * 1) 데이터 프로퍼티 - 키와 값으로 형성된 실질적 값을 갖고있는 프로퍼티 5 | * 2) 액세서 프로퍼티 - 자체적으로 값을 갖고 있지 않지만 다른 값을 가져오거나 6 | * 설정할때 호출되는 함수로 구성된 프로퍼티 7 | * 예를들면 getter와 setter 8 | */ 9 | const yuJin = { 10 | name: '안유진', 11 | year: 2003, 12 | }; 13 | 14 | console.log(Object.getOwnPropertyDescriptor(yuJin, 'year')); 15 | 16 | /** 17 | * 1) value - 실제 프로퍼티의 값 18 | * 2) writable - 값을 수정 할 수 있는지 여부. false로 설정하면 프로퍼티 값을 19 | * 수정 할 수 없다. 20 | * 3) enumerable - 열거가 가능한지 여부이다. for...in 룹 등을 사용 할 수 있으면 21 | * true를 반환한다. 22 | * 4) configurable - 프로퍼티 어트리뷰트의 재정의가 가능한지 여부를 판단한다. 23 | * false 일 경우 프로퍼티 삭제나 어트리뷰트 24 | * 변경이 금지된다. 단, writable이 true인 경우 25 | * 값 변경과 writable을 변경하는건 가능하다. 26 | */ 27 | console.log(Object.getOwnPropertyDescriptor(yuJin, 'name')); 28 | 29 | console.log(Object.getOwnPropertyDescriptors(yuJin)); 30 | 31 | const yuJin2 = { 32 | name: '안유진', 33 | year: 2003, 34 | 35 | get age(){ 36 | return new Date().getFullYear() - this.year; 37 | }, 38 | 39 | set age(age){ 40 | this.year = new Date().getFullYear() - age; 41 | } 42 | } 43 | 44 | console.log(yuJin2); 45 | console.log(yuJin2.age); 46 | 47 | yuJin2.age = 32; 48 | console.log(yuJin2.age); 49 | console.log(yuJin2.year); 50 | 51 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'age')); 52 | 53 | Object.defineProperty(yuJin2, 'height', { 54 | value: 172, 55 | writable: true, 56 | enumerable: true, 57 | configurable: true, 58 | }) 59 | console.log(yuJin2); 60 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'height')); 61 | 62 | yuJin2.height = 180; 63 | console.log(yuJin2); 64 | 65 | /** 66 | * Writable 67 | */ 68 | Object.defineProperty(yuJin2, 'height', { 69 | writable:false, 70 | }); 71 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'height')); 72 | 73 | console.log('-------------'); 74 | yuJin2.height = 172; 75 | console.log(yuJin2); 76 | 77 | /** 78 | * Enumerable 79 | */ 80 | console.log(Object.keys(yuJin2)); 81 | for(let key in yuJin2){ 82 | console.log(key); 83 | } 84 | 85 | Object.defineProperty(yuJin2, 'name', { 86 | enumerable:false, 87 | }); 88 | 89 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'name')); 90 | 91 | console.log('-------------'); 92 | console.log(Object.keys(yuJin2)); 93 | for(let key in yuJin2){ 94 | console.log(key); 95 | } 96 | console.log(yuJin2); 97 | console.log(yuJin2.name); 98 | 99 | /** 100 | * Configurable 101 | */ 102 | Object.defineProperty(yuJin2, 'height', { 103 | writable: true, 104 | configurable: false, 105 | }); 106 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'height')); 107 | 108 | // Object.defineProperty(yuJin2, 'height', { 109 | // enumerable: false, 110 | // }); 111 | 112 | Object.defineProperty(yuJin2, 'height', { 113 | value: 172, 114 | }); 115 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'height')); 116 | 117 | Object.defineProperty(yuJin2, 'height', { 118 | writable: false, 119 | }); 120 | console.log(Object.getOwnPropertyDescriptor(yuJin2, 'height')); 121 | 122 | Object.defineProperty(yuJin2, 'height', { 123 | writable: true, 124 | }); 125 | -------------------------------------------------------------------------------- /1_basics/5_data_types.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Data Types 3 | * 4 | * 여섯개의 Primitive Type과 5 | * 한개의 오브젝트 타입이있다. 6 | * 7 | * 1) Number (숫자) 8 | * 2) String (문자열) 9 | * 3) Boolean (불리언) 10 | * 4) undefined (언디파인드) 11 | * 5) null (널) 12 | * 6) Symbol (심볼) 13 | * 14 | * 7) Object (객체) 15 | * Function 16 | * Array 17 | * Object 18 | */ 19 | 20 | /** 21 | * Number 타입 22 | */ 23 | const age = 32; 24 | const tempature = -10; 25 | const pi = 3.14; 26 | 27 | console.log(typeof age); 28 | console.log(typeof tempature); 29 | console.log(typeof pi); 30 | console.log('--------------'); 31 | 32 | const infinity = Infinity; 33 | const nInfinity = -Infinity; 34 | 35 | console.log(typeof infinity); 36 | console.log(typeof nInfinity); 37 | console.log('--------------'); 38 | 39 | /** 40 | * String 타입 41 | */ 42 | const codeFactory = '"코"드팩토리'; 43 | console.log(codeFactory); 44 | console.log(typeof codeFactory); 45 | 46 | const ive = "'아이브' 안유진"; 47 | console.log(ive); 48 | 49 | /** 50 | * Template Literal 51 | * 52 | * Escaping Character 53 | * 1) newline -> \n 54 | * 2) tab -> \t 55 | * 3) 백슬래시를 스트링으로 표현하고싶다면 두번 입력하면된다. 56 | */ 57 | const iveYuJin = '아이브\n안유진' 58 | console.log(iveYuJin); 59 | const iveWonYoung = '아이브\t장원영'; 60 | console.log(iveWonYoung); 61 | const backSlash = '아이브\\코드팩토리'; 62 | console.log(backSlash); 63 | const smallQutoation = '아이브\'코드팩토리'; 64 | console.log(smallQutoation); 65 | 66 | const iveWonYoung2 = `아이브i '" / / / / / / 67 | 장원영`; 68 | console.log(iveWonYoung2); 69 | 70 | console.log(typeof iveWonYoung2); 71 | 72 | const groupName = '아이브'; 73 | console.log(groupName + ' 안유진'); 74 | console.log(`${groupName} 안유진`); 75 | console.log('-------------'); 76 | 77 | /** 78 | * Boolean 타입 79 | */ 80 | const isTrue = true; 81 | const isFalse = false; 82 | console.log(typeof isTrue); 83 | console.log(typeof isFalse); 84 | 85 | /** 86 | * undefined 87 | * 88 | * 사용자가 직접 값을 초기화하지 않았을때 89 | * 지정되는 값이다. 90 | * 91 | * 직접 undefined로 값을 초기화하는건 지양해야한다. 92 | */ 93 | let noInit; 94 | console.log(noInit); 95 | console.log(typeof noInit); 96 | 97 | /** 98 | * null 타입 99 | * 100 | * undefined와 마찬가지로 값이 없다는 뜻이나 101 | * JS에서는 개발자가 명시적으로 없는 값으로 초기화할때 102 | * 사용된다. 103 | */ 104 | let init = null; 105 | console.log(init); 106 | console.log(typeof init); 107 | console.log('----------') 108 | 109 | /** 110 | * Symbol 타입 111 | * 112 | * 유일무이한 값을 생성할때 사용한다. 113 | * 다른 프리미티브 값들과 다르게 Symbol 함수를 114 | * 호출해서 사용한다. 115 | */ 116 | const test1 = '1'; 117 | const test2 = '1'; 118 | 119 | console.log(test1 === test2); 120 | 121 | const symbol1 = Symbol('1'); 122 | const symbol2 = Symbol('1'); 123 | 124 | console.log(symbol1 === symbol2); 125 | 126 | /** 127 | * Object 타입 128 | * 129 | * Map 130 | * 키:벨류의 쌍으로 이루어져있다. 131 | * key:value 132 | */ 133 | const dictionary = { 134 | red: '빨간색', 135 | orange: '주황색', 136 | yellow: '노란색', 137 | }; 138 | 139 | console.log(dictionary); 140 | console.log(dictionary['red']); 141 | console.log(dictionary['orange']); 142 | console.log(dictionary['yellow']); 143 | 144 | console.log(typeof dictionary); 145 | 146 | /** 147 | * Array 타입 148 | * 149 | * 값을 리스트로 나열 할 수 있는 타입이다. 150 | */ 151 | const iveMembersArray = [ 152 | '안유진', 153 | '가을', 154 | '레이', 155 | '장원영', 156 | '리즈', 157 | '이서', 158 | ]; 159 | console.log(iveMembersArray); 160 | 161 | /** 162 | * index 163 | * 164 | * 0부터 시작한다. 165 | * 1씩 올라갑니다. 166 | */ 167 | console.log(iveMembersArray[0]); 168 | console.log(iveMembersArray[5]); 169 | 170 | iveMembersArray[0] = '코드팩토리'; 171 | console.log(iveMembersArray); 172 | console.log(typeof iveMembersArray); 173 | 174 | /** 175 | * static typing -> 변수를 선언할때 어떤 타입의 변수를 선언할지 명시를한다. 176 | * C 177 | * dynamic typing -> 변수의 타입을 명시적으로 선언하지 않고 갑에의해 타입을 "추론"한다. 178 | * JS -> dynamic typing 179 | */ -------------------------------------------------------------------------------- /2_class_and_oop/6_class_problem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 클래스 강의를 끝낸기념 문제 3 | * 4 | * 1) Country 클래스는 나라 이름과 나라에 해당되는 아이돌 그룹정보를 5 | * 리스트로 들고있다. (name 프로퍼티, idolGroups 프로퍼티) 6 | * 2) IdolGroup 클래스는 아이돌 그룹 이름과 멤버 정보를 리스트로 들고있다. 7 | * (name 프로퍼티, members 프로퍼티) 8 | * 3) Idol 클래스는 아이돌 이름과 출생년도 정보를 들고있다. 9 | * (name 프로퍼티, year 프로퍼티) 10 | * 4) MaleIdol 클래스는 Idol 클래스와 동일하게 11 | * name, year 프로퍼티가 존재한다 12 | * 추가로 sing() 함수를 실행하면 ${이름}이 노래를 합니다. 13 | * 라는 스트링을 반환해준다. 14 | * 5) FemaleIdol 클래스는 Idol 클래스와 동일하게 15 | * name, year 프로퍼티가 존재한다. 16 | * 추가로 dance() 함수를 실행하면 ${이름}이 춤을 춥니다. 17 | * 라는 스트링을 반환해준다. 18 | * 19 | * 아래 정보가 주어졌을때 위 구조로 데이터를 형성해보라. 20 | * map() 함수를 잘 활용하면 좋다. 21 | */ 22 | 23 | // 아이브는 한국 아이돌이고 24 | // 아이브라는 이름의 걸그룹이다. 25 | // 아이브는 여자 아이돌이다. 26 | const iveMembers = [ 27 | { 28 | name: '안유진', 29 | year: 2003, 30 | }, 31 | { 32 | name: '가을', 33 | year: 2002, 34 | }, 35 | { 36 | name: '레이', 37 | year: 2004, 38 | }, 39 | { 40 | name: '장원영', 41 | year: 2004, 42 | }, 43 | { 44 | name: '리즈', 45 | year: 2004, 46 | }, 47 | { 48 | name: '이서', 49 | year: 2007, 50 | }, 51 | ] 52 | 53 | // BTS는 한국 아이돌이고 54 | // 방탄소년단이라는 이름의 보이그룹이다. 55 | // BTS는 남자 아이돌이다. 56 | const btsMembers = [ 57 | { 58 | name: '진', 59 | year: 1992, 60 | }, 61 | { 62 | name: '슈가', 63 | year: 1993, 64 | }, 65 | { 66 | name: '제이홉', 67 | year: 1994, 68 | }, 69 | { 70 | name: 'RM', 71 | year: 1994, 72 | }, 73 | { 74 | name: '지민', 75 | year: 1995, 76 | }, 77 | { 78 | name: '뷔', 79 | year: 1995, 80 | }, 81 | { 82 | name: '정국', 83 | year: 1997, 84 | }, 85 | ] 86 | 87 | class Country{ 88 | name; 89 | idolGroups; 90 | 91 | constructor(name, idolGroups){ 92 | this.name = name; 93 | this.idolGroups = idolGroups; 94 | } 95 | } 96 | 97 | class IdolGroup{ 98 | name; 99 | members; 100 | 101 | constructor(name, members){ 102 | this.name = name; 103 | this.members = members; 104 | } 105 | } 106 | 107 | class Idol{ 108 | name; 109 | year; 110 | 111 | constructor(name, year){ 112 | this.name = name; 113 | this.year = year; 114 | } 115 | } 116 | 117 | class FemaleIdol extends Idol{ 118 | sing(){ 119 | return `${this.name}이 노래를 합니다.`; 120 | } 121 | } 122 | 123 | class MaleIdol extends Idol{ 124 | dance(){ 125 | return `${this.name}이 춤을 춥니다.`; 126 | } 127 | } 128 | 129 | const cIveMembers = iveMembers.map( 130 | (x) => new FemaleIdol(x['name'], x['year']), 131 | ); 132 | console.log(cIveMembers); 133 | 134 | const cBtsMembers = btsMembers.map( 135 | (x) => new MaleIdol(x['name'], x['year']), 136 | ); 137 | console.log(cBtsMembers); 138 | 139 | const iveGroup = new IdolGroup( 140 | '아이브', 141 | cIveMembers, 142 | ) 143 | console.log(iveGroup); 144 | 145 | const btsGroup = new IdolGroup( 146 | 'BTS', 147 | cBtsMembers, 148 | ); 149 | console.log(btsGroup); 150 | 151 | const korea = new Country( 152 | '대한민국', 153 | [ 154 | iveGroup, 155 | btsGroup, 156 | ], 157 | ); 158 | console.log(korea); 159 | 160 | const allTogether = new Country( 161 | '대한민국', 162 | [ 163 | new IdolGroup( 164 | '아이브', 165 | iveMembers.map( 166 | (x) => new FemaleIdol(x['name'], x['year']), 167 | ), 168 | ), 169 | new IdolGroup( 170 | '방탄소년단', 171 | btsMembers.map( 172 | (x) => new MaleIdol(x['name'], x['year']), 173 | ), 174 | ), 175 | ], 176 | ); 177 | console.log(allTogether); -------------------------------------------------------------------------------- /3_all_about_object/5_prototype_chain.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Prototype 3 | */ 4 | const testObj = {}; 5 | 6 | // __proto__ 모든 객체에 존재하는 프로퍼티다. 7 | // class 강의에서 배울때 상속에서 부모 클래스에 해당되는 값이다. 8 | console.log(testObj.__proto__); 9 | 10 | function IdolModel(name, year) { 11 | this.name = name; 12 | this.year = year; 13 | } 14 | 15 | console.log(IdolModel.prototype); 16 | 17 | // console.dir(IdolModel.prototype, { 18 | // showHidden: true, 19 | // }); 20 | 21 | // circular reference 22 | console.log(IdolModel.prototype.constructor === IdolModel); 23 | console.log(IdolModel.prototype.constructor.prototype === IdolModel.prototype); 24 | 25 | const yuJin = new IdolModel('안유진', 2003); 26 | 27 | console.log(yuJin.__proto__); 28 | console.log(yuJin.__proto__ === IdolModel.prototype); 29 | 30 | console.log(testObj.__proto__ === Object.prototype); 31 | 32 | console.log(IdolModel.__proto__ === Function.prototype); 33 | console.log(Function.prototype.__proto__ === Object.prototype); 34 | console.log(IdolModel.prototype.__proto__ === Object.prototype); 35 | 36 | console.log(yuJin.toString()); 37 | console.log(Object.prototype.toString()); 38 | 39 | function IdolModel2(name, year) { 40 | this.name = name; 41 | this.year = year; 42 | 43 | this.sayHello = function () { 44 | return `${this.name}이 인사를 합니다.`; 45 | } 46 | } 47 | 48 | const yuJin2 = new IdolModel2('안유진', 2003); 49 | const wonYoung2 = new IdolModel2('장원영', 2002); 50 | 51 | console.log(yuJin2.sayHello()); 52 | console.log(wonYoung2.sayHello()); 53 | console.log(yuJin2.sayHello === wonYoung2.sayHello); 54 | 55 | console.log(yuJin2.hasOwnProperty('sayHello')); 56 | 57 | function IdolModel3(name, year) { 58 | this.name = name; 59 | this.year = year; 60 | } 61 | 62 | IdolModel3.prototype.sayHello = function () { 63 | return `${this.name}이 인사를 합니다.`; 64 | } 65 | 66 | const yuJin3 = new IdolModel3('안유진', 2003); 67 | const wonYoung3 = new IdolModel3('장원영', 2004); 68 | 69 | console.log(yuJin3.sayHello()); 70 | console.log(wonYoung3.sayHello()); 71 | 72 | console.log(yuJin3.sayHello === wonYoung3.sayHello); 73 | 74 | console.log(yuJin3.hasOwnProperty('sayHello')); 75 | 76 | IdolModel3.sayStaticHello = function () { 77 | return '안녕하세요 저는 static method 입니다.'; 78 | } 79 | 80 | console.log(IdolModel3.sayStaticHello()); 81 | 82 | /** 83 | * Overriding 84 | */ 85 | function IdolModel4(name, year) { 86 | this.name = name; 87 | this.year = year; 88 | 89 | this.sayHello = function () { 90 | return '안녕하세요 저는 인스턴스 메서드입니다!'; 91 | } 92 | } 93 | 94 | IdolModel4.prototype.sayHello = function () { 95 | return '안녕하세요 저는 prototype 메서드입니다!'; 96 | } 97 | 98 | const yuJin4 = new IdolModel4('안유진', 2003); 99 | 100 | // 프로퍼티 셰도잉 - class에서 override 101 | console.log(yuJin4.sayHello()); 102 | 103 | /** 104 | * getPrototypeOf, setPrototypeOf 105 | * 106 | * 인스턴스의 __proto__ 변경 vs 함수의 prototype 변경 107 | */ 108 | function IdolModel(name, year) { 109 | this.name = name; 110 | this.year = year; 111 | } 112 | 113 | IdolModel.prototype.sayHello = function () { 114 | return `${this.name} 인사를 합니다.`; 115 | } 116 | 117 | function FemaleIdolModel(name, year) { 118 | this.name = name; 119 | this.year = year; 120 | 121 | this.dance = function(){ 122 | return `${this.name}가 춤을 춥니다.`; 123 | } 124 | } 125 | 126 | const gaEul = new IdolModel('가을', 2004); 127 | const ray = new FemaleIdolModel('레이', 2004); 128 | 129 | console.log(gaEul.__proto__); 130 | console.log(gaEul.__proto__ === IdolModel.prototype); 131 | console.log(Object.getPrototypeOf(gaEul) === IdolModel.prototype); 132 | 133 | console.log(gaEul.sayHello()); 134 | console.log(ray.dance()); 135 | console.log(Object.getPrototypeOf(ray) === FemaleIdolModel.prototype); 136 | // console.log(ray.sayHello()); 137 | 138 | Object.setPrototypeOf(ray, IdolModel.prototype); 139 | console.log(ray.sayHello()); 140 | 141 | console.log(ray.constructor === FemaleIdolModel); 142 | console.log(ray.constructor === IdolModel); 143 | console.log(gaEul.constructor === IdolModel); 144 | console.log(Object.getPrototypeOf(ray) === FemaleIdolModel.prototype); 145 | console.log(Object.getPrototypeOf(ray) === IdolModel.prototype); 146 | console.log(FemaleIdolModel.prototype === IdolModel.prototype); 147 | 148 | FemaleIdolModel.prototype = IdolModel.prototype; 149 | 150 | const eSeo = new FemaleIdolModel('이서', 2007); 151 | console.log(Object.getPrototypeOf(eSeo) === FemaleIdolModel.prototype); 152 | console.log(FemaleIdolModel.prototype === IdolModel.prototype); -------------------------------------------------------------------------------- /1_basics/7_operators.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Operators 3 | * 4 | * 연산자 5 | */ 6 | 7 | /** 8 | * 산술 연산자 9 | * 10 | * 1) 덧셈 11 | * 2) 뺄셈 12 | * 3) 곱셈 13 | * 4) 나눗셈 14 | * 5) 나머지 15 | */ 16 | console.log(10 + 10); 17 | console.log(10 - 10); 18 | console.log(10 * 10); 19 | console.log(10 / 10); 20 | console.log(10 % 10); 21 | console.log(10 % 3); 22 | 23 | console.log('-----------'); 24 | 25 | console.log(10 * (10 + 10)); 26 | 27 | /** 28 | * 증가와 감소 29 | */ 30 | let number = 1; 31 | 32 | number++; 33 | console.log(number); 34 | 35 | number--; 36 | console.log(number); 37 | console.log('---------'); 38 | 39 | /** 40 | * 연산자의 위치 41 | */ 42 | let result = 1; 43 | console.log(result); 44 | 45 | result = number++; 46 | console.log(result, number); 47 | 48 | result = number--; 49 | console.log(result, number); 50 | 51 | result = ++number; 52 | console.log(result, number); 53 | 54 | result = --number; 55 | console.log(result, number); 56 | 57 | /** 58 | * 숫자 타입이 아닌 타입에 +, - 사용하면 어떻게될까? 59 | */ 60 | let sample = '99'; 61 | 62 | console.log(+sample); 63 | console.log(typeof +sample); 64 | 65 | console.log(sample); 66 | console.log(typeof sample); 67 | 68 | sample = true; 69 | console.log(+sample); 70 | console.log(typeof +sample); 71 | 72 | sample = false; 73 | console.log(+sample); 74 | console.log(typeof +sample); 75 | 76 | sample = '안유진'; 77 | // NaN -> Not a Number 78 | console.log(+sample); 79 | 80 | sample = '99'; 81 | console.log(-sample); 82 | console.log(typeof -sample); 83 | 84 | /** 85 | * 할당 연산자 (assignment operator) 86 | */ 87 | number = 100; 88 | console.log(number); 89 | 90 | number += 10; 91 | console.log(number); 92 | 93 | number -= 10; 94 | console.log(number); 95 | 96 | number *= 10; 97 | console.log(number); 98 | 99 | number /= 10; 100 | console.log(number); 101 | 102 | number %= 10; 103 | console.log(number); 104 | 105 | /** 106 | * 비교 연산자 107 | * 108 | * 1) 값의 비교 109 | * 2) 값과 타입의 비교 110 | */ 111 | 112 | console.log(5 == 5); 113 | console.log(5 == '5'); 114 | console.log(0 == ''); 115 | console.log(true == 1); 116 | console.log(false == 0); 117 | console.log(true == '1'); 118 | 119 | console.log(5 === 5); 120 | console.log(5 === '5'); 121 | console.log(0 === ''); 122 | console.log(true === 1); 123 | console.log(false === 0); 124 | console.log(true === '1'); 125 | 126 | console.log('------------'); 127 | 128 | console.log(5 != 5); 129 | console.log(5 != '5'); 130 | console.log(0 != ''); 131 | console.log(true != 1); 132 | console.log(false != 0); 133 | console.log(true != '1'); 134 | 135 | console.log('-------------') 136 | 137 | console.log(5 !== 5); 138 | console.log(5 !== '5'); 139 | console.log(0 !== ''); 140 | console.log(true !== 1); 141 | console.log(false !== 0); 142 | console.log(true !== '1'); 143 | 144 | console.log('------------'); 145 | 146 | /** 147 | * 대소 관계 비교 연산자 148 | */ 149 | console.log(100 > 1); 150 | console.log(100 < 1); 151 | console.log(100 <= 1); 152 | console.log(100 >= 1); 153 | 154 | /** 155 | * 삼항 조건 연산자 (ternary operator) 156 | */ 157 | console.log(10 > 0 ? '10이 0보다 크다' : '10이 0보다 작다'); 158 | 159 | console.log('------------'); 160 | /** 161 | * 논리 연산자 162 | * 163 | * 1) && (and) 164 | * 2) || (or) 165 | */ 166 | 167 | // && 조건은 모두 true여야 true를 반환한다. 168 | console.log(true && true); 169 | console.log(true && false); 170 | console.log(false && true); 171 | console.log(false && false); 172 | 173 | console.log('------------'); 174 | 175 | // ||는 하나만 true여도 true를 반환한다. 176 | console.log(true || true); 177 | console.log(true || false); 178 | console.log(false || true); 179 | console.log(false || false); 180 | console.log('------------'); 181 | 182 | console.log(10 > 1 && 20 > 2); 183 | console.log(10 < 1 && 20 > 2); 184 | console.log(10 < 1 && 20 < 2); 185 | 186 | console.log(10 > 1 || 20 > 2); 187 | console.log(10 < 1 || 20 > 2); 188 | console.log(10 < 1 || 20 < 2); 189 | 190 | /** 191 | * 단축평가 (short circuit evaluation) 192 | * 193 | * &&를 사용했을때 좌측이 true면 우측 값 반환 194 | * &&를 사용했을때 좌측이 false면 좌측 값 반환 195 | * ||를 사용했을때 좌측이 true면 좌측 값 반환 196 | * ||를 사용했을때 좌측이 false면 우측 값 반환 197 | */ 198 | console.log('------------'); 199 | 200 | console.log(true || '아이브'); 201 | console.log(false || '아이브'); 202 | console.log(false && '아이브'); 203 | console.log(true && '아이브'); 204 | 205 | console.log(true && true && '아이브'); 206 | console.log(true && false && '아이브'); 207 | 208 | /** 209 | * 지수 연산자 210 | */ 211 | console.log(2 ** 2); 212 | console.log(10 ** 3); 213 | 214 | /** 215 | * null 연산자 216 | */ 217 | let name; 218 | console.log(name); 219 | 220 | name = name ?? '코드팩토리'; 221 | console.log(name); 222 | 223 | name = name ?? '아이브'; 224 | console.log(name); 225 | 226 | let name2; 227 | name2 ??= '코드팩토리'; 228 | console.log(name2); --------------------------------------------------------------------------------