let user = {
name: 'mike',
age: 30,
}
-> 여러개의 객체를 만들어내기위해 생성자 함수가 필요하다
User(name, age){
//빈 객체 생성 this = {}
this.age = age;
this.name = name;
//객체 반환 코드가 생략되어있음 return this;
}
let user1= new User('mike',30);
let user2= new User('sally',20);
let a = 'age';
const user = {
name: 'mike',
[a] : 30
}
Object.assign() : 객체 복제
지금까지 property의 key는 문자였다 그런데 문자말고 symbol도 가능하다
const a = Symbol();
const b = Symbol();
//a!=b
const a = Symbol.for('id');
const b = Symbol.for('id');
//a===b
sybmol.keyFor(a);//return id
전역심볼이 아니면 keyfor 를 사용할 수 없다. 대신 a.description;을 통해 생성할때 만든 이름을 알 수 있다
심볼을 완전히 숨길 수 있는 방법은 없다 Object.getOwnPropertySymbols(user);을 하게 되면 심볼들만 볼수있다
Reflect.ownKeys(user);는 symbol을 포함한 모든 property를 보여준다
symbol의 사용이유
symbol사용이유를 잘 모르겠습니다 예를들어 무수히 많은 변수가 있을때 name이라는 변수가 있는지 모르고 덮어씌우게 된다면 에러가 발생합니다
하지만 symbol을 사용하면 name이라는 변수가 두개더라도 두개는 다른것으로 인식이 되기 때문에 오류가 나지 않습니다
근데 이렇게 되면 나중에 더 곤란해지는게 아닐까요?
같은이름의 변수가 두개라는것.. 둘의 구분을 어떻게 하려고 그걸 냅두는건지 모르겠어요 ㅠ
예를들어 isArray에 대한 함수를 내가 구현했다고 하자. 근데 나중에 isArray가 추가되면서 내가 작성했던 함수는 덮어쓰여지게 되면서 코드가 꼬이게 된다
이런현상을 막아줄수있다
내가 짠 코드 때문에 남이 짜놓은 코드가 돌아가지 않으면 안된다. 이러한 것을 방지하기 위해서 symbol을 사용할 수 있다
let str = '안녕'
let userList =[
{name: 'mike', age:30},
{name: 'mike', age:30},
{name: 'mike', age:30},
];
let newUserList = userList.map((user, idx)=>{
return Object.assign({}, user, {
id: idx+1,
isAdult: user.age >19,
})
})
const result = arr.reduce((prev, cur) => {
return prev+cur;
}, 0)
let userList = [
{name: 'mike', age:30},
{name: 'jan', age:20},
{name: 'jaen', age:10},
{name: 'mikeee', age:20},
{name: 'jawswn', age:900},
{name: 'jaa2n', age:10},
];
let result = userList.reduce((prev, cur)=>{
if(cur.age > 19) prev.push(cur.name)
return prev;
}, []);
let result = userList.reduce((prev,cur)=>{
return prev += cur.age;
}, 0);
배열이나 객체의 속성을 분해해서 그 값을 변수에 담을 수 있게 하는 표현식
let users = ['1','2', '3'];
let [user1, user2, user3] = user;
console.log(user1);//'1'
console.log(user2);//'2'
console.log(user3);//'3'
undefined가 떴을 것이다let [a=2, b=1, c=12] = [1,2];
let [user1, , user2] = ['1', '2', '3'];
console.log(user1);//'1'
console.log(user2);//'3'
[a,b] = [b,c] -> 필요없는 변수를 추가로 선언하지 않아도됨
배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식입니다.
let user = {name: 'mike', age:20};
let {name, age} = user;
console.log(name);//'mike'
console.log(age);//20
1) 나머지 매개변수, 2) argumentsfunction showName(name){
console.log(arguments.length);
console.log(arguments[0]);
console.log(arguments[1]);
}
showName('mike', 'tom');
//2
//mike
//tom
정해지지 않은 수의 매개변수를 배열로 나타낼 수 있게 한다
function showName(... names){
console.log(names);
}
showName();//[] , undefined가 아님
showName('mike');//['mike']
showName('mike', 'tom');//['mike', 'tom']
let arr1 = [1,2,3];
let arr2 = [4,5,6];
let result = [...arr1, ...arr2];
console.log(result);
나머지 매개변수는 함수의 인수 전달 시에 마지막으로 사용되며, 전달된 인수들의 목록을 배열로 압축할때 사용되어진다.
전개 구문은 뭉쳐있는 여러 개의 값들을 개별적인 값들의 목록으로 만들때 사용되어진다. 즉, 나머지 매개변수는 배열로 합쳐주고, 전개 구문은 배열 또는 객체를 펼쳐주는 역할을 한다.
코드를 실행하기 전 생성되는 특별한 객체로, 실행할 스코프 범위 안에 있는 변수와 함수를 프로퍼티로 저장하는 객체
기본적으로 property는 어떤 값을 나타냅니다. 그런데 이 값이 다른 값과 연관되어 있을 때 property라고 부릅니다.
함수 + lexical 환경
let one;이 지나면 one이 undefined로 초기화 된다 let one;
one = 1;
function addOne(num){
cosloe.log(one+num);
}
addOne(5);
전역lexical환경 과 내부 lextical환경 두가지가 있다function makeAddr(x){
return function(y){
return x+y;
}
}
const ex1 = makeAddr(3);
const ex2 = makeAddr(10);
console.log(ex1(2));
console.log(ex2(10));//둘은 다른 lexical 환경을 가지고 있음
}
function makeAddr(){
let num = 0;//선언 후 변경 불가, 은닉화
return function(){
return num++;
};
}
let counter = makeAddr();
console.log(counter());
console.log(counter());
console.log(counter());
setTimeout(function(){
console.log(2)
}, 0);
console.log(1);
함수호출방식과 상관엇이 this를 지정할 수 있음
const tom = {
name:"tom"
};
function showName(){
console.log(this.name);
}
showName;
console.log("----------")
showName.call(tom);
update.apply(mike, [1099, "single"]];
const min = Math.min([3,10,20,200]);
console.log(min);//NaN
-> 왜 NaN이 나오는걸까? 다음과 같이 코드를 짜야한다
const nums = [3,10,20,200];
const min = Math.min(...nums);
console.log(min);
const min = Math.min.apply(null, nums);
const max = Math.max.call(null, ...nums);
prototype: class랑 비슷함
상속 : .__proto__ 이용
const car = {
wheel: 4,
drive(){
console.log("drive..");
}
}
const bmw = {
color: "red"
}
bmw.__proto__ = car;
console.log(bmw.wheel);
const car = function (color){
this.color = color;
this.drive = function(){
console.log("drive..");
};
};
const x1 = new car("red");
console.log(x1.color);
const Bmw = function (color){
this.color = color;
};
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function(){
console.log("druve,,,");
};
const x1 = new Bmw("red");
console.log(x1);
var parent = {pVal:'super'}
var child = {cVal:'sub'}
child.__proto__ = parent;
child.pVal = 'ss'
console.log(child);
console.log(parent);
child.__proto__.pVal = 'ss'를 사용해야한다. a instance of b : a가 b로부터 생겨난것인지를 t/f로 return 해준다
지금까지 비슷한 형태의 객체를 생성하기 위해서는 생성자 함수를 사용했었는데 class로도 만들 수 있다
const User = function(name, age){
this.name = name;
this.age = age;
this.showName = function(){
console.log(this.name);
};
};
const mike = new User('mike', 30);
this.showName = ~ 코드를 지우고 아래 코드를 넣어주면 된다User.prototype.showName = function(){
console.log(this.name);
}
class User2{
constructor(name, age){//객체 만들어주는 생성자 메서드
this.name = name;
this.age = age;
}
showName(){
console.log(this.name);
}
}
}
const tom = new User2("tom", 19);
for(const p in tom)
{
console.log(p);
}

class Dog {
constructor(name, fn) {
this.name = name;
this.fn = fn;
}
}
const dog = new Dog('hi', () => console.log('hi'));
class Car{
constructor(color){
this.color = color;
this.wheels = 4;
}
drive(){
console.log("drive");
}
stop(){
consoloe.log("stop!!!");
}
}
class Bmw extends Car{
park(){
console.log("part!");
}
}
const z = new Bmw("red");

class Bmw extends Car{
constructor(color){//overriding
super(color);
this.navigation = 1;
}
park(){
super.stop();//overriding
console.log("part!");
}
}

비동기 처리에 사용되는 객체입니다
비동기 처리 : 특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 먼저 수행하는 자바스크립트의 특성
const pr = new Promise((resolve, reject) => {});
resolve : 성공했을때 실행되는 함수
reject : 실패했을 때 실행되는 함수
callback 함수 : 어떤일이 완료됐을 때 호출되는 함수
new promise생성자가 반환하는 promise 객체는 state, result를 property로 갖는다
state는 pending(대기) 상태였다가 성공하면 fulfilled가, 실패하면 rejected가 채워넣어진다
https://hyeooona825.tistory.com/24
https://ryublock.tistory.com/43
https://blog.naver.com/magnking/220966405605
https://velog.io/@ye-ji/%EB%82%98%EB%A8%B8%EC%A7%80-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-%EC%A0%84%EA%B0%9C-%EA%B5%AC%EB%AC%B8Rest-parameters-Spread-syntax