Front-end/JavaScript Language

Javascript - intermediate2

prden 2022. 4. 29. 16:51

1. 구조 분해 할당(01:03:24시작)

배열이나 객체의 속성을 분해해서 그 값을 변수에 담을 수 있게 하는 표현식

 

1) 배열

let users = ['Mike', 'Tom', 'Jane'];
let[user1, user2, user3] = users;
// 위는 
		let user1 = users[0];
		let user2 = users[1];
        let user3 = users[2];

let [a,b,c] = [1,2];
//c는 undefined일 경우 기본값을 아래와 같이 셋팅할 때
let[a=3, b=4, c=5] = [1,2];

 

2) 객체

let user = {naem : 'Mike', age: 30};
let {name, age} = user;

console.log(name); // 'Mike'
console.log(age); // 30

 

객체로 받은 기본값이 undefined일 때만 기본값이 사용된다. 

let user ={
	name: 'Jane',
    age: 18,
    gender : 'female'
    };

let {name, age, gender = 'male'} = user;

console.log(gender); // 'female'

 

 

2. 나머지 매개변수, 전개 구문

 1) 인수 전달

//인수 전달

function showName(name){
    conosole.log(name);
    }
showName('Mike'); // Mike
showName('Mike', 'Tom');

showName(); // undefined
 
 
 arguments는
 1. 함수로 넘어 온 모든 인수에 접근할 수 있다.
 2. 함수내에서 이용 가능한 지역 변수
 3. length / index
 4. Array 형태의 객체이다.
 5. 배열의 내장 메서드 없음(forEach, map 사용불가)
 
 
 arguments.length // 받은 개수의 인수
 
 functions showName(name) {
 	console.log(arguments.length);
    console.log(arguments[0]);
    console.log(arguments[1]);
    }
 showName('Mike', 'Tom');
 //2 - argument의 갯수
 // 'Mike'
 // 'Tom'

 

2) 나머지 매개변수 : 정해지지 않은 갯수의 인수를 배열로 나타내게 해준다. 

// names 배열안에 전달된 인수가 들어가게 된다. 

function showName(...names){
	console.log(names);
    }
    
showName(); // {}
showName('Mike'); // ['Mike']
showName('Mike', 'Tom'); // ['Mike', 'Tom']

fucntion add(...numbers){
 let result =0;
 numbers.forEach((num) => (result +=num));
 console.log(result);
 }
 add(1,2,3); //6
 add(1,2,3,4,5,6,7,8,9,10); //55
 
 //user 객체를 만들어주는 생성자 함수
 
 function User(name, age, ...skill){
 	this.name = name;
    this.age = age;
    this.skills = skills;
    }
    
const user1 = new User('Mike', 30,"html", "css");
const user2 = new User('Tom', 20, "JS","React");
const user3 = new User("Jane", 10, "English");

console.log(user1); // skills 배열에 html, css 들어감
console.log(user2); // skills 배열에 JS, React 들어감
console.log(user3);

나머지 매개변수인 ...skills는 항상 맨 뒤에 있어야 한다.

 

3) 전개 구문 : 배열

 

let arr1 = [1,2,3];
let arr2 = [4,5,6];


let result = [...arr1, ...arr2];
//arr1은 1,2,3을 의미한다.  

//중간에 쓰는 것도 가능하다. 
let result = [0, ...arr1, ...arr2, 7,8,9];
console.log(result); // [1,2,3,4,5,6]

//객체도 가능하다
let user = {name:'Mike'}
let mike ={...user, age:30}

console.log(mike) // {name:"Mike", age:30}

let arr = [1,2,3];
let arr2 =[...arr]; // [1,2,3]

let user = {name:'Mike', age:30};
let user2 = {...user};
user2.name = "Tom";

console.log(user.name); //"Mike"
console.log(user2.name); // "Tom"


// 
let arr1 = [1,2,3];
let arr2 = [4,5,6];

arr2.reverse().forEach((num) => {
	arr.unshift(num);
    });
    
console.log(arr1);
//[4,5,6,1,2,3]

//전개구문으로 하면
arr1 = [...arr2, ...arr1];

let user = { name :"Mike" };
let info = { age:30 };
let fe =["JS", "React"];
let lang = ["Korean", "English"];

user = Object.assign({}, user, info, {
		skills:[],
        });
fe.forEach((item) => {
	user.skills.push(item);
    });
    
lang.forEach((item) => {
	user.skills.push(item);
    });
    
    
//전개구문을 쓰면
user ={
	...user, 
    ...info,
    skills:[...fe, ...lang],
    };
    
console.log(user);

 

3. 클로저 : 함수와 그 함수 렉시컬 환경의 조합

함수가 생성될 당시의 외부 변수를 기억하고, 생성된 이후에도 계속 접근 가능

자바스크립트의 어휘적 환경(Lexical Environment)

let one;
one = 1;

function addOne(unm) {
	console.log(one + num);
    }
    
addOne(5);

//코드가 실행되면 변수들이 Lexical환경에 올라간다.
one:초기화 x : 사용불가
addOne:function: 초기화O, 사용가능

두 번째 
let one : undefined, 사용가능
... 순서 : 동영상 다시 봐 
https://www.youtube.com/watch?v=tpl2oXQkGZs&list=PLZKTXPmaJk8JZ2NAC538UzhY_UNqMdZB4&index=11

 

내부 lexical환경은 외부 lexical환경에 대해 참조를 갖는다. 

 

function makeAdder(x){
	return function(y){
    	return x+y;
        }
  }
const add3 = makeAdder(3);
console.log(add3(2)); // 5
add3 함수가 생성된 이후에도 상위 함수인 makeAdder의 x에 접근가능

const add10 = makeAdder(10);
console.log(add10(5); // 15
console.log(add3(1)); //4



ex1)
fuction makeCounter(){
	let num = 0;
    
    return function(){
    	return num++;
        };
  }
 //내부함수에서 외부함수의 변수에 접근한다. 
 
  let counter = makeCounter();

console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

 

4. setTimeout / setInterval

 

1) setTimeout : 일정 시간이 지난 후 함수 실행한다. 

setTimeout은 두 개의 매개변수를 받는다.
하나는 함수이고 하나는 시간

function fn(){
	console.log(3)
    }
    
setTimeout(fn, 3000);
3000 = 3s

//이 함수와 동일
setTimeout(function(){
	console.log(3)
    }, 3000);


const tId= function showName(name){
			console.log(name);
    		}

setTimeout(showName, 3000, 'Mike');
//			함수		시간	 인수
//세 번째 인수는 바로 위 showName함수의 인자로 들어감.


clearTimeout(tId); //예정된 작업을 없앤다.

 

 

2) setInterval 일정시간을 간격으로 함수를 반복 한다. 

setTimeout과 동일하게 사용하면 된다. 

fuction showName(name){
	console.log(name);
    }
    
const tId = setInterval(showName, 3000, 'Mike');

//'Mike'가 3초간격으로 계속 찍히고
clearInterval(tId); 하면 중단됨

ex1)

let num = 0;
function showTime(){
 console.log(안녕하세요. 접속하신지 ${num++}초가 지났습니다.);
 if(num> 5) {
 	clearInterval(tId);
    }
 const tId = setInterval(showTime, 1000);

 

5. call, apply, bind:

1) call

함수 호출 방식과 관계없이 this를 지정할 수 있음

const mike ={
	name:"Mike",
 };

const tom ={
	name:"Tom",
 };

fucntion showThisName(){
 	console.log(this.name);//여기선 window.name을 의미한다.     
 }

 showThisName();
 
 showThis.name.call(mike); // Mike
 //showThisName에서 this가 mike가 된 것이다. 
 
function update(birthYear, occupation){
	this.birthYear = birthYear;
    this.occupation = occupation;
    }
update.call(mike, 1999, "singer");

console.log(mike);

 

2) apply : 함수 매개변수를 처리하는 방법을 제외하면 call과 완전히 같다. 

call은 일반적인 함수와 마찬가지로 매개변수를 직접 받지만, apply는 매개변수를 배열로 받는다.

배열 요소를 함수 매개변수로 사용할 때 유용하다. 

const mike ={
	name:"Mike",
 };

const tom ={
	name:"Tom",
 };

fucntion showThisName(){
 	console.log(this.name);//여기선 window.name을 의미한다.     
 }

 showThisName();
 
 showThis.name.call(mike); // Mike
 //showThisName에서 this가 mike가 된 것이다. 
 
function update(birthYear, occupation){
	this.birthYear = birthYear;
    this.occupation = occupation;
    }
update.call(mike, [1999, "singer"]);

console.log(mike);

const nums = [3, 10, 1, 6, 4];

const minNum = Math.min.apply(null, nums);
const maxNum = Math.max.call(null, ...nums);

 

3) bind :  함수의 this값을 영구히 바꿀 수 있다. 

 

const mike ={
 name : "Mike",
 }
 
function update(birthYear, occupation){
 this.birthYear = birthYear;
 this.occupation = occupation;
 }
 
 const updateMike = update.bind(mike);
 
 updateMike(1980, "police");
 console.log(mike);
 
 
 const user ={
 	name: "Mike",
    showName: function(){
     console.log(hello, ${this.name});
     },
   };
   
   user.showName();
   
   let fn = user.showName;
   
   fn.call(user);
   fn.apply(user);
   
   let boundFn = fn.bind(user);
   
   boundFn();

 

6. 상속, 프로토타입

  1) hasOwnProperty - 객체에 프로퍼티 있는지 확인하는 함수

 

__proto__:Object에 보면 hasOwnProperty있다. 

 

2) 상속

const car = {
 wheels:4,
 drive() {
  console.log("dirve..");
  },
 };
 
 const bmw ={
 	color:"red",
    navigation:1,
  };
  
 const benz ={
 	color:"black",
 };
 
 const audi ={
 	color:"blue",
 };
 
 bmw.__proto__ =car; // bmw는 car의 상속을 받는다. 
 benz.__proto__ =car;
 audi.__proto__ =car;
 
 추가 상속
 
 const x5 = {
  color:"white",
  name:"x5",
 };
 
 x5.__proto__ =bmw;

 

3) 생성자 함수 사용

const Bmw = function (color) {
	this.colot = color;
};

Bmw.prototype.wheels = 4;
Bmw.prototype.dirve = function(){
	console.log("dirve..");
};

//아래와 같이 사용할 수도 있고 위처럼 Bmw.prototype.wheels로 사용할 수도 있다.
//x5.__proto__ = car;
//z4.__proto__ = car;

const x5 = new Bmw("red");
const z4 = new Bmw("blue");

instanceof 를 통해 해당 객체가 그 생성자로부터 생성된 것인지 확인가능하다. 

 

https://www.youtube.com/watch?v=4_WLS9Lj6n4&t=2274s 

 

'Front-end > JavaScript Language' 카테고리의 다른 글

자바스크립트 에러 10가지  (0) 2022.05.28
Javascript- intermediate3  (0) 2022.05.01
yarn.lock & package-lock.json  (0) 2022.04.09
Console.log()  (0) 2022.02.19
여러 함수(Filter, Splice, FindIndex, Find...)  (0) 2021.10.17