직무적성검사
인적성 수리 문제
원시타입
객체타입
let foo
typeof foo === 'undefined' // true
function bar(hello) {
return hello
}
typeof bar() === 'undefined'// true
typeof null === 'object' // true
typeof null을 진짜 ‘null’로 표현하고자 하는 시도가 있었으나 호환성이슈로 받아들여지지 않았다.
Boolean
참(true)와 거짓(false)만을 가질 수 있는 데이터 타입
falsy |값|타입|설명| |:—|:—|:—| |false|Boolean|falsy| |0,-0,0n,0x0n|Number, BigInt|0은 부호나 소수점 유무에 상관없이 falsy| |NaN|Number|faslsy| |’’, “”, ``|String|빈 문자열은 falsy| |null|null|falsy| |undefined|undefined|falsy|
truthy
const a = 1
const maxInteger = Math.pow(2, 53)
maxInteger - 1 = Number.MAX_SAFE_INTEGER // true
const minInteger = -(Math.pow(2, 53) - 1)
minInteger === Number.MIN_SAFE_INTEGER // true
const 이진수_2 = 0b10 // 2진수
이진수_2 == (2).toString(2) // true (2)를 괄호로 선언한 이유는 2뒤에 점이 있으면 소수점으로 인식하기 때문에
const 팔진수_8 = 0o10 // 8진수(octal) 8
팔진수_8 == (8).toString(8) // true
10 == (10).toString(10) // true
const 십육진수_16 = 0x10 // 16진수(hexadecimal) 16
십육진수_16 == (16).toString(16)
toString()아닌가요. 괄호안에 2가 있으니까 false가 되네요.
const maxInteger = Number.MAX_SAFE_INTEGER console.log(maxInteger + 5 === maxInteger +6) // true const bigInt1 = 9007199254740995n // 끝에 ns을 붙이거나 const bigInt2 = BigInt(‘9007199254740995’) // BigInt 함수를 사용하면 된다.
const number = 9007199254740992 const bigint = 9007199254740992n
typeof number // number typeof bigint // bigint
number == bigint // true number === bigint // false(타입이 달라서 false가 반환된다) ```
// '\n안녕하세요.\n'
const longText=`
안녕하세요.
`
// Uncaught SyntaxError: Invalid or unexpected token
const longText = "
안녕하세요
"
console.log(foo[0]) // ‘b’
// 앞 글자를 다른 글자로 변경해 보았다. foo[0] = ‘a’
// 이는 반영되지 않는다. console.log(foo); // bar ```
// Symbol 함수에 같은 인수를 넘겨주더라도 이는 동일한 값으로 인정되지 않는다.
// 심벌 함수 내부에 넘겨주는 값은 Symbol 생성에 영향을 미치지 않는다(Symbol.for 제외).
const key = Symbol('key')
const key2 = Symbol('key')
key === key2 // false
// 동일한 값을 사용하기 위해서는 Symbol.for를 활용한다.
Symbol.for('hello') === Symbol.for('hello') // true
객체 타입 - 자바스크립트를 이루고 있는 대부분의 타입이 객체 타입 - 배열, 함수, 정규식, 클래스 등이 포함 - 참조를 전달한다고 해서 참조 타입으로 불린다. ```js typeof [] === ‘object’ // true typeof {} === ‘object’ // true
function hello() {} typeof hello === ‘function’ // true
const hello1 = function() {} const hello2 = function() {}
// 객체인 함수의 내용이 육안으로는 같아보여도 참조가 다르기 때문에 false가 반환된다. hello1 === hello2 // false
## 1.1.2 값을 저장하는 방식의 차이
- 값을 저장하는 방식의 차이가 동등 비교를 할 때 차이를 만드는 원인이 된다.
- 원시 타입은 불변 형태의 값으로 저장. 변수 할당 시점에 메모리 영역을 차지하고 저장
- 객체는 프로퍼티를 삭제, 추가, 수정할 수 있으므로 변경 가능한 형태로 저장, 값을 복사할 때도 값이 아닌 참조를 전달
```js
let hello = 'hello world'
let hi = hello; // 'hello world'라는 값이 hi에 복사
console.log(hello === hi) // true
var hello = { greet: 'hello, world' };
var hi = { greet: 'hello, world' };
console.log(hello === hi); // false
console.log(hello.greet === hi.greet); // 원시값인 내부 속성값을 비교하면 동일
Number.NaN === NaN // false Object.is(Number.NaN, NaN) // true
NaN === 0/0 // false Object.is(NaN, 0/0) // true
// Object.is를 사용한다 하더라도 객체 비교에는 별 차이가 없다. Object.is({}, {}) // false const a = { hello: ‘hi’ } const b = a Object.is(a, b) // true a === b // true ```
function is(x: any, y:any) {
return (
(x === y && (x !== 0 || 1/x === 1/y)) || (x !== x & y !== y)
)
}
// 런타임에 Object.is가 있다면 그것을 사용하고, 아니라면 위 함수를 사용하낟.
// Object.is는 인터넷 익스플로러 등에 존재하지 않기 때문에 폴리필을 넣어준 것으로 보인다.
const objectIs: (x: any, y: any) => boolean = typeof Object.is === 'function' ? Object.is : is
export default objectIs
작업을 수행하거나 값을 계산하는 등의 과정을 표현하고, 이를 하나의 블록으로 감싸서 실행 단위로 만들어 놓은 것을 의미
// 선언문
function add(a, b) {
return a + b
}
// 표현식
const sum = function sum(a, b) {
return a + b;
}
sum(10, 24); // 34
const add = new Function('a', 'b', 'return a + b')
add(10, 24); // 34
const add = (a, b) => {
return a + b
}
const add = (a, b) => a + b
class Component extends React.Component {
functionCountUp() {
console.log(this); // undefined
}
ArrowFunctionCountUp = () => {
console.log(this); // class Component
}
}
즉시 실행 함수
(function (a, b) {
return a + b
})(10, 24); // 34
((a, b) => {
return a + b
})(10, 24); // 34
고차 함수
// 함수를 매개변수로 받는 대표적인 고차함수, Array.prototype.map
const doubledARray = [1, 2, 3].map((item) => item * 2)
doubledArray // [2, 4, 6]
// 함수를 반환하는 고차 함수의 예
const add = function (a) {
// a가 존재하는 클로저를 생성
return function (b) {
// b를 인수로 받아 두 합을 반환하는 또 다른 함수를 생성
return a + b
}
}
고차 함수형 컴포넌트를 만들면 컴포넌트 내부에서 공통으로 관리되는 로직을 부닐해 관리할 수 있어 효율적으로 리팩터링할 수 있음. ```
함수의 부수 효과를 최대한 억제하라
가능한 한 함수를 작게 만들어라
누구나 이해할 수 있는 이름을 붙여라
배우는 이유
class Car {
// 단 하나만 존재할 수 있으며, 여러 개를 사용한다면 에러가 발생
// 생략 가능
constructor(name) {
// 프로퍼티란 클래스로 인스턴스를 생성할 때 내부에 정의할 수 있는 속성값을 의미
this.name = name;
}
// 인스턴스 메서드
// prototype에 선언되므로 프로토타입 메서드로 불리기도 한다.
// Object.getPrototypeOf(myCar) === Car.prototype === myCar.__proto__ // true
// Object.getPRototypeOf를 사용하는 것이 좋다.
hook() {
console.log(`${this.name}이 경적을 울립니다!`)
}
// 정적 메서드
// 인스턴스가 아닌 이름으로 호출할 수 있는 메서드
// this를 사용할 수 없지만 인스턴스를 생성하지 않아도 사용할 수 있다.
static hello() {
console.log('저는 자동차입니다');
}
// setter
set age(value) {
this.carAge = value;
}
// getter
get age() {
return this.carAge
}
}
// Car 클래스를 활용해 car 객체를 만들었다.
const myCar = new Car('자동차');
// 메서드 호출
myCar.honk();
// 정적 메서드는 클래스에서 직접 호출한다.
Car.hello()
// 정적 메서드는 클래스로 만든 객체에서는 호출할 수 없다.
myCar.hello(); // Uncaught TypeError: myCar.hello is not a function
// setter를 만들면 값을 할당할 수 있다.
myCar.age = 32;
// getter로 값을 가져올 수 있다.
console.log(myCar.age, myCar.name); // 32 자동차
function add() {
const a = 10
function innerAdd() {
const b = 20
console.log(a + b)
}
innerAdd() // 30
}
add()
전역 스코프
Leave a comment