DreamCoding
Javascript transcompiler - BABEL을 이용해 변환
Single Page Application - SPA
API - Application Programing Interface
console API - 브라우저가 가지고 있는 API
자바스크립트의 공식사이트
ecma-international.org
developer.mozilla.org
DOM에서 script의 위치에 따라 로딩 방법
Dom실행 순서
HTML Pharsing
Script Fetching(스크립트 다운로드)
Executing Script(스크립트 실행)
👌 DOM을 그릴 때, 최초 HTML을 파싱한다. 이후 script를 만나면 script를 다운로드하게 된다. script다운, 실행이 완료된 후, 다시 HTML을 파싱한다. script의 위치와 속성(asnc, defer)에 따라, 다운로드 + 실행의 순서가 바뀌게 된다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>Document</title>
<script src="test.js"></script>
</head>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>Document</title>
</head>
<body>
<script src="test.js"></script>
</body>
js가 무겁거나, js에 의존적인 경우 사용자들은 다운로드 + 실행되기를 기다려야 한다.
async
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <title>Document</title> <script src="test.js" async></script> <script src="test2.js" async></script> </head>
async는 스크립트를 만나는 순간, 다운로드만 하고, 다운로드가 완료되었을 때 실행하게 된다.
하지만, HTML Pharsing이 다 되지 않은 상태에서 실행되기 때문에, 선택자가 올바르게 동작하지 않을 수 있고, js의 크기에 따라 다운로드되어지는 순서에 따라 실행되어 개발자가 작성한 스크립트 순서대로 실행되지 않을 수 있음.
defer
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <title>Document</title> <script src="test.js" defer></script> <script src="test2.js" defer></script> </head>
defer는 HTML Pharsing의 경우에는, pharsing하는 동안 동시에, 다운로드를 미리 해두고 HTML Pharsing이 완료된 후, 바로 js를 실행하게 되어 가장 안정적이다.
use strict - 자바스크립트가 엄격해짐. 자바스크립트 엔진이 효율적으로 처리할 수 있게 됨.
클래스getter와 setterclass User { constructor ( firstName, lastName, age) { this.fistName = firstName; this.fistName = lastName; this.age= age; } get age() { return this._age; } set age(value) { // if (value < 0) { throw Errow('age can not negative'); } this.age = value < 0 ? 0 : value; } } const user = new User('Steve', 'Job', -1);
👌 getter와 setter를 조금 더 공부해야 할 것으로 보임.
publicField와 privateFieldclass Experiment { publicField = 2; #privateField = 0; // #를 붙이게 되면 privateField가 됨. } const experiment = new Experiment(); console.log(experiment.publicField); // 2 console.log(experiment.privateField); // privateField는 undefined 접근이 불가능함에 따라 undefined가 출력됨.
publicField는 외부에서 접근이 가능하지만, privateField는 접근이 불가능함
(브라우저 지원이 거의 안됨) - 바벨 사용해야 함.
static함수class Shape { constructor(width, height, color) { this.width = width; this.height = height; this.color = color; } draw () { console.log(`drawing ${this.color} color of`); } getArea() { return width * this.height; } } /* 상속과 다양성 */ class Rectangle extends Shape {} class Triangle extends Shape { /* Overwriting */ draw() { super.draw(); console.log('super'); } getArea() { return(this.width * this.height) / 2; } } const rectangle = new Rectangle(20, 20, 'blue'); rentangle.draw(); const triangle = new Triangle)(20, 20, 'red'); triangle.draw(); console.log(rectangle instanceof Rectangle); // true console.log(triangle instanceof Rectangle); // false console.log(triangle instanceof Triangle); // true console.log(triangle instanceof Shape); // true console.log(triangle instanceof Object); // true console.log(triangle.toString()); // [object Object]
instanceOf
인스턴스 인지 확인하는 것 ( true || false Return)
오브젝트const obj = {}; // 'Object literal' syntax sont obj2 = new Object(); // 'object constructor' syntax print(name, age); function print(name, age) { console.log(person.name); console.log(person.age); } const ellie = { name : 'ellie', age : 4 }; } print(ellie); //자바스크립트는 동적 타입 업어임에 따라, 하단에 추가적으로 프로퍼티를 추가할 수 있음. (유지보수가 어려움) ellie.hasJob = true; delete ellie.hasJob; // 삭제 가능 console.log(ellie.name); // 코딩하는 순간 값을 받아오고 싶을떄, 쓰는 경우 console.log(ellie['name']); // 실시간으로 원하는 값을 받아오고 싶을때 사용 // 예); function printValue(obj, key) { console.log(obj[key]); } print(ellie, 'name'); print(ellie, 'age'); const person1 = { name : 'bob', age : 2 } const person2 = { name : 'steve', age : 3 } const person3 = { name : 'dave', age : 4 } const person4 = new Person('ellie', 30); // 오브젝트를 필요할때 일일이 만들게 될 때, 반복해서 작성해야 할때 간단하게 작성하는 방법. // Constructor Function(생성자 함수) function Person(name, age) { // this = {}; this.name; this.age; } // in operator 함수안에 키가 있는지 없는지 확인하는 것. console.log('name' in ellie); // for in [vs] for of // for (key in obj) for (key in ellie) { console.log(key); } // for (value of iterable) const array = [1, 2, 4, 5]; for (value of array) { console.log(value); // 1, 2, 4, 5; } // Cloning const user = {name : 'ellie', age : '20'}; const user2 = user; // name : 'ellie'; user2.namer = 'coder'; console.log(user) // name : coder; // 오브젝트 복사 방법 // old way const user3 = {}; for (key in user) { user3[key] = user[key]; } console.log(user3); // recent way Object.assign(); //메소드는 열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환합니다. const user4 = Object.assign({}, user); console.log(user4);
배열(Array)const arr1 = new Array(); const arr2 = [1, 2]; arr2[0] // 1; arr2[1] // 2; //Index Position arr2.length // 2; // Lopping over an array // 1. for for (let i = 0; i < arr2.length; i++) { console.log(arr2[i]); } // 2. for of for (let item of arr2) { console.log(item); } // 3. forEach arr2.forEach(function (value, idx, array) { console.log(value); console.log(idx); console.log(array); }); // 4. Addtion, deletion, copy // push : add an item arr2.push('test'); // [1, 2, 'test']; // pop :remove an item arr2.pop(); // [1,2]
👌 shift, unshift가 pop과 push보다 느림. - 길이가 길면 길수록 shift, unshift는 느림. - 중간에 데이터를 넣는 것은 index를 이용하기 때문에, 빠름.
const fruits2 = ['apple', 'banana']; fruits2.splice(1, 1); // combine var a = [1,2]; var b = [3,4]; var c = a.concat(b); // [1,2,3,4] // 5. Searching console.log(fruits.indexOf(''); // array in item search -- index return or -1 return console.log(fruits.includes(''); // array in item search - true or false return console.log(fruits.lastIndexOf('');
JSON - Javascript Object NotationHTTP : Hypertext transfer protocol
AJAX를 이용해서 데이터를 받아올 수 있음
Asynchronous Javascript and XML
XHR : XMLHttpRequest Object : 브라우저 API제공하는 오브젝트
👌 fetch() API : ie에서는 지원하지 않음.
서버와 데이터를 주고받을때에는 XML뿐만 아니라, 다른 것들도 주고 받을 수 있음.
JSON : key와 value로 이루어져 있음.
Object를 JSON으로 어떻게 변경할지에 대해서 공부
JSON을 Object로 어떻게 변환할지에 대해서 공부
//JSON //JavaScript Object Notation //1. Object to JSON let json = JSON.stringingfy(true); console.log(json) // true const rabbit = { name : 'tori', color : 'white', size : null, birthDate : new Date(), jump : () => { console.log(`${name} can jump!`); }, }; // ECMA6의 symbol은 JSON에 포함되지 않음. json = JSON.stringfy(rabbit, (key, value) => { console.log(`key : ${key}, value : ${value}`); return key === 'name' ? 'ellie' : value; }); // JSON.stringfy 세밀하게 제어할때 콜백 함수를 사용함 console.log(json) ; //2. JSON to Object json = JSON.stringify(rabbit); const obj = JSON.parse(json); obj.jump(); // uncaught typeError - 메서드를 json으로 변경후, 다시 object로 변경함에 따라 method가 사라져서 오류가 발생함. rabbit.birthDate.getDate() // 29 obj.birthDate.getDate() // uncaught typeError - stringfy를 하게 됨에 따라, Date객체가 반환한 string값을 저장함에 따라 getDate라는 메서드가 존재하지 않음. // 그래서, 값을 새로 얻고 싶다면, 콜백 함수를 이용해서 값을 변경해야 함. const obj = JSON.parse(json, (key, value) => { console.log(`key : ${key}, value : ${value}`); return key === 'birthDate' ? new Date(value) : value; });
Last updated