Profile Image

2023.03.14.

Javascript deep dive 3

TIL / JavaScript

254p

함수 객체의 arguments 프로퍼티 값은 arguments 객체다. arguments 객체는 함수 호출시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이며, 함수 내부에서 지역 변수처럼 사용된다.

arguments 객체는 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 매우 유용하다.

function sum() {
  let res = 0

  for (let i = 0; i < argument.length; i++) {
    res += arguments[i]
  }

  return res
}

sum() // 0
sum(1, 2) // 3
sum(1, 2, 3) // 6
// ES6 Rest parameter
function sum(...args) {
  return args.reduce((pre, cur) => pre + cur, 0)
}

sum() // 0
sum(1, 2) // 3
sum(1, 2, 3) // 6

258p

hasOwnProperty

hasOwnProperty 메서드는 이름에서 알 수 있듯이 인수로 전달받은 프로퍼티 키가 객체 고유의 프로퍼티 키인 경우에만 true를 반환하고 상속받은 프로토타입의 프로퍼티 키인 경우 false를 반환한다.

const obj = { a: 1 }

obj.__proto__ === Object.prototype // true

obj.hasOwnProperty('a') // true
obj.hasOwnProperty('__proto__') // false

__proto__프로퍼티는 [[Prototype]]이라는 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티다. 내부 슬롯에는 직접 접근할 수 없고 간접적인 접근 방법을 제공하는 경우에 한하여 접근할 수 있다.


260p

객체지향 프로그래밍

객체지향 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.

객체지향 프로그래밍은 실세계의 실체(사물이나 개념)를 인식하는 철학적 사고를 프로그래밍에 접목하려는 시도에서 시작한다. 실체는 특징이나 성질을 나타내는 속성(attribute, property)을 가지고 있고, 이를 통해 실체를 인식하거나 구별할 수 있다.

예를들어, 사람에게는 다양한 속성(이름, 주소, 성별 등)이 있으나 우리가 구현하려는 프로르램에서는 사함의 이름과 주소라는 속성만 관심이있다고 가정하자. 이처럼 다양한 속성 중에서 프로그램에 필요한 속성만 간추려 내여 표현하는 것을 추상화라 한다.

const person = {
  name: 'Lee'
  address: 'Seoul'
}

프로그래머는 이름과 주소 속성으로 표현된 객체인 person을 다른 객체와 구별하여 인식할 수 있다. 이처럼 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조를 객체라 하며, 객체지향 프로그램은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임이다.


267p

Object.prototype

모든 객체는 프로토타입의 계층 구조인 프로토타입 체인에 묶여있다. 자바스크립트 엔진은 객체의 프로퍼티(메서드 포함)에 접근 하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 __proto__ 접근자 프로퍼티가 가리키는 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 프로토타입 체인의 종점, 즉 프로토타입 체인의 최상위 객체는 Object.prototype이며, 이 객체의 프로퍼티와 메서드는 모든 객체에 상속된다.


314p

Strict mode

strict mode는 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킨다.

strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 ‘use strict’; 를 추가한다. 전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.

ESLint 같은 린트 도구를 사용해도 strict mode와 유사한 효과를 얻을 수 있다. 린트 도구는 정적 분석 기능을 통해 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적인 오류만이 아니리 잠재적인 오류까지 찾아내고 오류의 원인을 리포팅해주는 유용한 도구다.


315p

strict mode의 적용

strict mode를 전역으로 사용하면 non-strict mode와 혼용될때 오류를 발생시킬수 있다.

strict mode를 함수 단위로 사용할때 또한 non-strict mode와 혼용될 수 있으며 일일이 strict mode를 명시해주어야 하기때문에 문제가 발생할 수 있다.

따라서 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.


320p

자바스크립트 객체

  • 표준 빌트인 객체: ECMAScript 사양에 정의된 객체를 말하며, 애플리케이션 전역의 공통 기능을 제공한다. 자바스크립트 실행 환경(브라우저 또는 Node.js)과 관계없이 언제나 사용할 수 있다. 전역 객체의 프로퍼티로서 제공된다. 따라서 별도의 선언 없이 전역 변수처럼 언제나 참조할 수 있다.
  • 호스트 객체: 호스트 객체는 ECMAScript 사양에 정의되어 있지 않지만 자바스크립트 실행 환경에서 추가로 제공하는 객체를 말한다. 브라우저 환경에서는 DOM, BOM, Canvas 같은 클라이언트 사이드 Web API를 호스트 객체로 제공한다.

Copyright © 2022 HHJ