Ian's Archive 🏃🏻

Profile

Ian

Ian's Archive

Developer / React, SpringBoot ...

📍 Korea
Github Profile →
Categories
All PostsAlgorithm19Book1C1CI/CD2Cloud3DB1DesignPattern9ELK4Engineering1Front3Gatsby2Git2IDE1JAVA7JPA5Java1Linux8Nginx1PHP2Python1React9Security4SpatialData1Spring26
thumbnail

Javascript

Front
2022.12.28. (수정됨)

Series

  • 1Location 객체 정리
  • 2Javascript

작성중…

자바스크립트 특징에 대해 정리해보자

배열 vs 객체

배열

  • 순서가 있는 값, 순서는 인덱스로 구성

  • 값들은 요소(element)라고 부르며, 각각의 요소들은 쉼표(comma)로 구분

  • [ ] 을 통해 배열 생성

객체

  • 키와 값(key-value pair) 형태

  • 속성(Property)을 가지고, 한 쌍당 구분은 쉼표(comma)

  • { }로 객체 생성

Prototype

부모 역할을 담당하는 객체 - 자바스크립트의 모든 객체는 부모 역할을 담당하는 객체와 연결되어 있다.

  • 자바스크립트는 프로토타입 기반 객체지향 프로그래밍 언어
  • 객체 생성 시

scope

블록 레벨 스코프(Block-level scope)

모든 코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.

함수 레벨 스코프(Function-level scope)

함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다.

  • 전역 변수, 지역 변수 중복되는 경우 지역 변수 우선
  • 선언하지 않고 변수 사용시 전역변수 처럼 동작 -> 암묵적 연역이라 함
  • 전역 변수 사용을 억제하기 위해서 즉시 실행 함수로 만들어 사용

Hoisting

var 선언문이나 function 선언문 등을 해당 스코프의 선두로 옮긴 것처럼 동작하는 특성

변수 할당은
선언(실행 컨텍스트에 변수 객체 등록) -> 초기화(공간을 메모리에 확보)
-> 할당(undefined로 초기화 된 변수에 실제 값 할당) 순으로 이뤄지는데

var 선언문은 이 과정이 한번에 일어난다

let키워드는 선언 단계와 초기화 단계가 분리되어 진행 -> 블록 레벨 스코프 지원

Lexical Scope(Enviroment)

렉시컬 스코프는 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정된다.

복사
var a = 1

function afn() {
  var a = 10
  bfn()
}

function bfn() {
  console.log(a)
}

afn() // 10
bfn() // 10

Closure

함수 + 함수를 둘러싼 환경(Lexical environment)

Exports & Imports

exportImport 보통 분리시킨 코드를 사진과 같이 크게 2가지 방법으로 가져온다.

  1. default 키워드 사용

  2. named export - {}로 작은 단위로 불러오는게 가능하다.

복사
import * as Canvas from './modules/canvas.js';\

전체를 불러올 땐

  1. * 키워드 사용
  2. as 키워드를 통해 별칭 지정을 해 import할 수 있다.

Class

복사

class Person {
  construct() {
    gender = 'female';   // Property
  }

  printGender () {  // Method
    console.log(this.gender);
  }
}

class SangHyeok extends Person {
  constructor() {
    super();
    this.name = 'SangHyeok';
    this.gender = 'male'
  }
  printName() {  // Method
    console.log(this.name);
  }
}

const person = new Person();
person.printMyName();
person.printGender();

// output:
// "SangHyeok"
// "male"

// es6 style

class Person {
  gender = 'female';   // Property
  printGender = () => {  // Method
    console.log(this.gender);
  }
}

class SangHyeok extends Person {
  name = 'SangHyeok';
  gender = 'male'

  printName = () => {  // Method
    console.log(this.name);
  }
}

const person = new Person();
person.printMyName();
person.printGender();

// output:
// "SangHyeok"
// "male"

Rest/Spread Operators

객체 리터럴을 분해하고 병합하는데 편리한 기능 제공

Rest Parameter : 매개변수 내 사용 시 나머지 배열 값들을 받을 수 있음 Spread Parameter : 대상을 개별 요소로 분리 (대상이 이터러블 해야 함)

구조분해할당(Destructuring)

구조화된 배열 또는 객체를 비구조화하여 개별적인 변수에 할당 (값을 추출하여 변수에 할당하거나 반환할 때 유용)

배열

복사
const today = new Date()
const formattedDate = today.toISOString().substring(0, 10)
const [year, month, day] = formattedDate.split('-')

console.log([year, month, day])

// output
// ["2022", "07", "25"]

객체

복사
const users = [
  {
    name: 'Han',
    address: {
      city: 'Seoul',
    },
    phone: '010-1111-1111',
  },
  {
    name: 'Sang',
    address: {
      city: 'Ansan',
    },
    phone: '010-2222-2222',
  },
]

const {
  address: { city },
} = users[0]
const { phone } = users[0]

console.log(phone)
console.log(city)

const admin = users.filter(({ name }) => name == 'Han')

console.log(admin)

// output
/**
"010-1111-1111"
"Seoul"
[[object Object] {
  address: [object Object] {
    city: "Seoul"
  },
  name: "Han",
  phone: "010-1111-1111"
}]
 */

이런식으로 원하는 값들을 뽑아와 변수에 할당해 읽기 편한 코드를 작성할 수 있다.

원시 자료형와 자료 참조형

원시 자료형 할당 시 이 담기고 (6가지 자료형) 참조 자료형 할당 시 주소가 담긴다 (배열, 객체, 함수)

복사
const getUser = {
  name: 'Han',
}

const user1 = getUser

const user2 = {
  ...getUser,
}

getUser.name = 'hahahaha'

console.log(user1.name)
console.log(user2.name)

리액트에서 객체의 값을 사용 시, spread연산자로 값을 복사해 사용해야 한다.

strict mode

자바스크립트 문법을 엄격히 적용하여 기존에는 무시되던 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생 시킴

전역, 함수단위 strict mode 적용은 피하는게 좋다
->strict mode는 즉시실행함수로 감싼 스크립트 단위로 적용할 때 활용

eslint같은 자바스크립트 문법에서 에러를 표시해주는 도구를 사용하는게 좋다

Arrow Function

함수를 선언하는 방법

복사
const func = () => {

}

this로 인해 생긴 문제 해결

화살표 함수의 this는 언제나 상위 스코프의 this를 가르킨다. -> Lexical this

자바스크립트는 함수를 선언할 때 this에 바인딩 할 객체가 정적으로 결정 x 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다.

Iterator protocol이란?

value들의 sequence를 만드는 표준 방법

done (boolean) : iterator에 return값이 있으면 value값으로 지정
value : iterator으로 반환되는 모든 자바스크립트 값 (done이 true일 경우 생략 가능)

복사
function makeIterator(array) {
  var nextIndex = 0

  return {
    next: function () {
      return nextIndex < array.length
        ? { value: array[nextIndex++], done: false }
        : { done: true }
    },
  }
}

var it = makeIterator(['yo', 'ya'])

console.log(it.next().value) // 'yo'
console.log(it.next().value) // 'ya'
console.log(it.next().done) // true

비동기 처리

자바스크립트는 특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행 -> 일정 시간이 지난 후 순차적으로 실행해야 하는 부분에서 문제가 발생할 수 있다

이러한 문제는 콜백함수로 해결할 수 있으나 코드의 가독성 면에서 좋지 않다

Promise

복사
const promise = new Promise((resolve, reject) => {
  if (true)) {  // 성공
    resolve('result');
  }
  else { // 실패
    reject('failure reason');
  }
}).then(() => {
  // 다음 동작
}).catch(() => {
  // 에러처리
});

이런 형식으로 콜백 함수를 사용하는 방법보다는 가독성이 좋지만 then… 지옥에 빠질 수 있다.

async, await

복사
let play = async () => {
  // try - catch 에러 처리
  try {
    var user = await ajaxUser();
    if (user.id === 1) {
      ...
    }
  } catch (error) {
    console.log(error);
  }
};

유사 배열 객체 vs 배열

  • 유사 배열 객체 : key가 숫자, length값을 가지고 있는 객체
    • 배열 함수, for-of, 비구조화 할당, 전개 연산자(…) 사용 불가 -> 객체가 이터러블 하지 않기 때문
    • ex) 문자열(String), 함수의 매개변수 객체(arguments), 각종 DOM객체(HTML Collection, NodeList)
    • 유사 배열 객체는 Array.prototype.slice.call()로 배열로 만들 수 있다.
    • The iterator protocol로 구현 가능 (iterable한 객체로 만들기)

Javascript Inner Function

bind()

호출될 때 this 키워드가 제공된 값으로 설정되는 새로운 함수를 반환한다.

복사
bind(thisArg, arg1, ... , argN)
  1. thisArg : this가 가리킬 객체를 지정
  2. arg1, … , argN : 함수에 전달할 인자 값 thisArg는 전달하지 않고 null을 사용할 수도 있다.

Tip!!

빈값, null 체크

null, undefined, NaN, "", 0, false 체크 시 not 연산자로 체크

복사
let result = "";

if(!result){
  console.log('error');
}

indexOf, include

indexOf는 index를 활용할 때 사용 includes는 return해 true/false 처리할 때 사용


유용한 라이브러리 사용법과 개발하면서 자주 활용되는 javascript inner 함수는… 추후에 추가로 정리 해보자… 하핳ㅎ…

Reference

Previous Post
React Hooks & Http Request
Next Post
React Redux, Routing
Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.