블로깅 주제
- Javascript Koans 과제
1. 지금 현재, 당신의 기분이나 느낌을 표현해 주세요.
- 좋은 페어 분을 만나 원활히 과제를 마쳤다. 이번 koans 과제를 하며 모르는 것들과 헷갈렸던 부분들을 많이 짚어볼 수 있었고, 처음으로 유닛 테스트 작성 관련한 부분을 만져볼 수 있어 유익한 경험이였던 것 같다. 내가 모르는게 이렇게 많다니! 자바스크립트 공부를 더 꼼꼼히 해야겠다. 특히 얕은 복사/깊은 복사는 정말 이해가 안된다...ㅠㅠ
2. 오늘 무엇을 학습한 내용 중 지금 떠올릴 수 있는 단어를 모두 나열해 주세요.
- Javascript Koans
3. 2에서 작성한 단어를 가지고, 오늘의 학습 내용을 설명해 보세요.
1. Introduction
- 유닛 테스트를 작성하는 방법
expect(테스트하는값).기대하는조건
expect(isEven(3)).to.be.true => 'isEven(3)'의 결과값은 참(true)이어야 한다
expect(1 + 2).to.equal(3) => 'sum(1, 2)의 결과값은 3과 같아야(equal) 한다'
2. Types-part1
+ : 형식 검사 진행. 문자열 연결로 처리
1 + '1' -> '11'
'1' + true -> '1true'
- : 문자열 검사 기능 없어 타입 검사 하지않음. 값을 숫자 그대로 변환
123 - '1' -> 122
true -> 1, false -> 0
1 + true -> 2
3. LetConst
//배열
const arr = [];
const toBePushed = 42;
arr.push(toBePushed);
expect(arr[0]).to.equal(42);
// 재할당은 금지됩니다.
// arr = [1, 2, 3];
//객체
const obj = { x: 1 };
expect(obj.x).to.equal(1);
delete obj.x;
expect(obj.x).to.equal(undefined);
// 재할당은 금지됩니다.
// obj = { x: 123 };
obj.occupation = 'SW Engineer';
expect(obj['occupation']).to.equal('SW Engineer');
4. Scope
- 함수 표현식 vs 함수 선언식
함수 선언식 (function declartion): 함수명이 정의되어 있고, 별도의 할당 명령이 없는 것
function sum(a,b) {
return a + b;
}
함수 표현식 (function expression): 정의한 function을 별도의 변수에 할당하는 것
const sum = function(a,b) {
return a + b;
}
- 호이스팅
- var 변수 선언과 함수선언문에서만 호이스팅이 일어난다.
- var 변수/함수의 선언만 위로 끌어 올려지며, 할당은 끌어 올려지지 않는다.
- let/const 변수 선언과 함수표현식에서는 호이스팅이 발생하지 않는다.
https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html
-함수에서의 호이스팅
함수 선언식은 호이스팅에 영향을 받지만, 함수 표현식은 호이스팅에 영향을 받지 않는다.
함수 선언식
- 함수 전체를 호이스팅. 함수선언문은 코드를 구현한 위치와 관계없이 자바스크립트의 특징인 호이스팅에 따라 브라우저가 자바스크립트를 해석할 때 맨 위로 끌어 올려짐.
- 전역적으로 선언했을 때 중복적으로 동명의 함수를 쓰게 된다면, 원치 않는 결과를 초래할 수 있음
함수 표현식
- 별도의 변수에 할당하게 되는데, 변수는 선언부와 할당부를 나누어 호이스팅. -> 선언부만 호이스팅됨
https://taenami.tistory.com/86
https://joshua1988.github.io/web-development/javascript/function-expressions-vs-declarations/
- default parameter
function defaultParameter(num = 5) {
return num;
}
expect(defaultParameter()).to.equal(5); // 아규먼트 없으니 기본 값인 '5' 반환됨
expect(defaultParameter(10)).to.equal(10); // 아규먼트 10으로 전달되어 '10'이 반환됨
5. ArrowFunction
// 함수 표현식
const add = function (x, y) {
return x + y
}
// 화살표 함수
const add = (x, y) => {
return x + y
}
// 1. 리턴을 생략할 수 있습니다
const subtract = (x, y) => x - y
// 2. 필요에 따라 소괄호를 붙일 수도 있습니다
const multiply = (x, y) => (x * y)
// 3. 파라미터가 하나일 경우 소괄호 생략이 가능합니다
const divideBy10 = x => x / 10
- 화살표 함수를 이용하여 클로저 표현
const adder = x => {
return y => {
return x + y
}
}
const subtractor = x => y => {
return x - y
}
6. Types-part2
- stack : 원시 자료형의 데이터가 저장되는 공간
-
heap : Object 자료형의 데이터가 저장되는 공간
- .deep.equal
const overTwenty = ['hongsik', 'minchul', 'hoyong'];
let allowedToDrink = overTwenty;
overTwenty.push('san');
expect(allowedToDrink).to.deep.equal(['hongsik', 'minchul', 'hoyong', 'san']);
overTwenty[1] = 'chanyoung';
expect(allowedToDrink[1]).to.deep.equal('chanyoung');
7. Array
- slice
const arr = ['peanut', 'butter', 'and', 'jelly'];
expect(arr.slice(1)).to.deep.equal(['butter', 'and', 'jelly']);
expect(arr.slice(0, 1)).to.deep.equal(['peanut']);
expect(arr.slice(0, 2)).to.deep.equal(['peanut', 'butter']);
expect(arr.slice(2, 2)).to.deep.equal([]);
expect(arr.slice(2, 20)).to.deep.equal(['and', 'jelly']);
expect(arr.slice(3, 0)).to.deep.equal([]);
expect(arr.slice(3, 100)).to.deep.equal(['jelly']);
expect(arr.slice(5, 1)).to.deep.equal([]);
expect(arr.slice(0)).to.deep.equal(['peanut', 'butter', 'and', 'jelly']);
8. Object
- 배열과 객체의 차이점 : length 사용 가능 여부
//빈 배열의 길이는 0
const emptyArr = [];
expect(typeof emptyArr === 'array').to.equal(false);
expect(emptyArr.length).to.equal(0);
//빈 객체의 길이는 undefined
const emptyObj = {};
expect(typeof emptyObj === 'object').to.equal(true);
expect(emptyObj.length).to.equal(undefined);
객체에서는 length 속성 사용 불가!
객체의 길이를 알기 위해서는 객체에 몇 개의 아이템 즉 "KEY"가 몇 개 존재하는 지를 파악하면 됨
onst obj = { a: "AA", b: "BB", c: "CC", d: "DD", e: "EE" };
Object.keys(obj).length;
// 출력 5
- 객체의 속성(property) : 객체 안에 저장되어 있는 이름-값 쌍(name-value pair)
- 메소드 : 어떤 객체의 속성으로 정의된 함수
- 'this'
https://sangjuntech.tistory.com/24
- repeat 메서드
현재 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열
'abc'.repeat(-1); // RangeError
'abc'.repeat(0); // ''
'abc'.repeat(1); // 'abc'
'abc'.repeat(2); // 'abcabc'
'abc'.repeat(3.5); // 'abcabcabc' (count will be converted to integer)
'abc'.repeat(1/0); // RangeError
- 깊은 복사 vs 얕은 복사
- 깊은 복사 : 값 자체의 복사
- 얕은 복사 : 참조(주소)값의 복사
//얕은 복사
const obj = { vaule: 1 }
const newObj = obj;
newObj.vaule = 2;
console.log(obj.vaule); // 2
console.log(obj === newObj); // true
//깊은 복사
let a = 1;
let b = a;
b = 2;
console.log(a); // 1
console.log(b); // 2
console.log(a === b); // false
- Object.assign() 메소드
const obj = { a: 1 };
const newObj = Object.assign({}, obj);
newObj.a = 2;
console.log(obj); // { a: 1 }
console.log(obj === newObj); // false
Object.assign()는 2차원 객체에서 깊은 복사가 이루어지지 않는다!!!!
-> 완벽한 깊은 복사가 아니다. assign 은 깊은 복사를 하기엔 한계가 있는 메서드라서 깊은 복사를 할 때 assign 메서드는 잘 안 쓴다.
const obj = {
a: 1,
b: {
c: 2,
},
};
const newObj = Object.assign({}, obj);
newObj.b.c = 3;
console.log(obj); // { a: 1, b: { c: 3 } }
console.log(obj.b.c === newObj.b.c); // true
9. SpreadSyntax
const spread = [];
const arr = [0, ...spread, 1];
expect(arr).to.deep.equal([0, 1]);
- spread는 완전히 깊은 복사가 아니다?!
2차원부터는 깊은복사가 이루어지지 않는다 ! -> 한단계까지의 깊은복사만을 이용하려면 전개연산자를 써도 좋음..
- arguments
function getAllParamsByRestParameter(...args) {
return args;
}
function getAllParamsByArgumentsObj() {
return arguments;
}
const restParams = getAllParamsByRestParameter('first', 'second', 'third');
const argumentsObj = getAllParamsByArgumentsObj('first', 'second', 'third');
expect(restParams).to.deep.equal(['first', 'second', 'third']);
expect(Object.keys(argumentsObj)).to.deep.equal(['0', '1', '2']);
expect(Object.values(argumentsObj)).to.deep.equal(['first', 'second', 'third']);
// arguments와 rest parameter를 통해 배열로 된 전달인자(args)의 차이 확인하기
expect(restParams === argumentsObj).to.deep.equal(false);
expect(typeof restParams).to.deep.equal('object');
expect(typeof argumentsObj).to.deep.equal('object');
expect(Array.isArray(restParams)).to.deep.equal(true);
expect(Array.isArray(argumentsObj)).to.deep.equal(false);
const argsArr = Array.from(argumentsObj);
expect(Array.isArray(argsArr)).to.deep.equal(true);
expect(argsArr).to.deep.equal(['first', 'second', 'third']);
expect(argsArr === restParams).to.deep.equal(false);
- Array.from 메서드
문자열 등 유사 배열(Array-like) 객체나 이터러블한 객체를 배열로 만들어주는 메서드
(※ 유사 배열 객체란, 키가 인덱스 값으로 되어있고 길이를 나타내는 length 속성을 갖는 객체를 의미)
// 1. 문자열을 배열로 만드는 예시
console.log(Array.from("Hello"));
// [ 'H', 'e', 'l', 'l', 'o' ]
// 2. 유사 배열 객체를 배열로 만드는 예시
console.log(Array.from({ 0: "찬민", 1: "희진", 2: "태인", length: 3 }));
// [ '찬민', '희진', '태인' ]
// 3. 함수의 매개변수들을 순서대로 배열로 만드는 예시
const funcA = (...arguments) => {
return Array.from(arguments)
}
console.log(funcA(1,2,3,4,5));
// [ 1, 2, 3, 4, 5 ]
https://merrily-code.tistory.com/158
10. Destructuring
- 객체의 단축(shorthand) 문법
const name = '김코딩'
const age = 28
const person = {
name,
age,
level: 'Junior',
}
expect(person).to.eql({name: '김코딩', age: 28, level: 'Junior'})
- rest/spread 문법을 객체 분해에 적용
const student = { name: '최초보', major: '물리학과' }
const { name, ...args } = student
expect(name).to.eql('최초보')
expect(args).to.eql({major: '물리학과'})
'코드스테이츠 SEB FE 41기 > Section 별 내용 정리' 카테고리의 다른 글
section1/unit11/DOM(9/14) (0) | 2022.09.14 |
---|---|
section1/unit11/DOM(9/13) (0) | 2022.09.13 |
section1/unit10/Javascript 핵심 개념과 주요 문법(9/7) (0) | 2022.09.06 |
section1/unit10/Javascript 핵심 개념과 주요 문법(9/6) (0) | 2022.09.06 |
section1/unit9/Javascript 배열&객체(9/5) (0) | 2022.09.05 |