728x90

다음은 Vue.js 3 애플리케이션의 성능을 최적화하기 위한 몇 가지 팁입니다.

  1. v-if 명령어를 사용하세요v-if 명령어는 요소를 조건부로 렌더링하는 데 유용할 수 있지만 과도하게 사용할 경우 성능에 부정적인 영향을 미칠 수도 있습니다. 이는 'v-if' 조건이 거짓일 때 요소가 DOM에서 완전히 제거되어 요소를 전환할 때 브라우저가 많은 작업을 수행할 수 있기 때문입니다. 요소를 자주 전환해야 하는 경우, 대신 요소를 DOM에서 제거하지 않고 숨기기만 하는 'v-show' 명령어를 사용하는 것이 좋습니다.
  2. 깊이 중첩된 대형 템플릿 사용 안 함: Vue.js 컴파일러가 최적화하기 어렵고 렌더링 시간이 느려질 수 있습니다. 중첩된 요소가 많은 대형 템플릿이 있는 경우 컴파일러가 더 쉽게 최적화할 수 있도록 더 작은 component 로 분할하는 것이 좋습니다.
  3. 키 속성을 사용하여 목록 렌더링을 최적화합니다: Vue.js에서 항목 목록을 렌더링할 때 키 속성을 사용하여 가상 DOM 디핑 알고리즘이 목록을 보다 효율적으로 업데이트하는 데 도움이 되는 경우가 많습니다. 목록의 각 항목에 대해 고유한 키를 제공함으로써 Vue.js는 어떤 항목이 추가, 제거 또는 이동되었는지 더 쉽게 식별할 수 있으며 DOM을 더 효율적으로 업데이트할 수 있습니다.
  4. components 및 경로를 느리게 로드합니다: components 나 경로가 많은 대규모 응용프로그램을 사용하는 경우 초기 로드 시간을 개선하기 위해 지연 로드를 고려하세요. 이 작업은 import() 함수와 webpack 코드 분할 기능을 사용하여 수행할 수 있습니다.
  5. v-once 지시어를 사용하여 정적 컨텐츠를 최적화합니다: 템플릿에 변경되지 않는 콘텐츠가 있는 경우 v-once 지침을 사용하여 구성 요소가 업데이트될 때마다 Vue.js가 다시 렌더링하지 않도록 하십시오. 이를 통해 렌더링 성능을 향상시킬 수 있습니다.
  6. Vue.js devtools 브라우저 확장을 사용하여 성능 병목 현상을 식별하고 문제를 일으키는 구성 요소를 최적화할 수 있습니다.
  7. 공유 기능을 혼합 또는 상위 components 로 추상화하여 응용프로그램의 components 수를 최소화합니다.
  8. v-bind 지시문 또는 단방향 데이터 흐름을 사용하여 불필요한 재렌더를 방지합니다.
  9. v-lazy 지시문을 사용하여 이미지 및 기타 무거운 리소스를 느리게 로드합니다.
  10. 비동기 데이터가 로드될 때까지 기다리는 동안 완료되지 않은 템플릿이 표시되지 않도록 하려면 v-clock 지침을 사용합니다.
  11. v-pre 디렉티브를 사용하여 필요하지 않은 콘텐츠에 대해 컴파일을 건너뜁니다.
  12. 템플릿 요소가 불필요하게 생성되지 않도록 하려면 v-text 지시어를 사용합니다.
  13. 최종 애플리케이션에서 Vue.js의 프로덕션 빌드를 사용하여 최소화 및 트리 쉐이킹과 같은 최적화 기능을 활용하십시오.

이러한 모범 사례를 따르면 Vue.js 애플리케이션의 성능을 향상시키고 원활하고 효율적으로 실행될 수 있습니다.

728x90

'JAVASCRIPT > VUE' 카테고리의 다른 글

VUE3 - 라우팅 - routing  (0) 2022.12.22
VUE - 상태 관리 - state management  (0) 2022.12.21
VUE - 프로젝트 생성  (0) 2022.12.20
Vue3 란? Vue2 와의 차이점, Vue3 장점, Vue3 단점  (1) 2022.12.19
728x90

라우팅을 통해 응용프로그램의 특정 경로를 특정 구성요소에 매핑할 수 있습니다. 이렇게 하면 URL을 변경하여 탐색할 수 있는 여러 "페이지"가 있는 단일 페이지 응용프로그램(SPA)을 만들 수 있습니다.

Vue.js 3에서는 라우팅이 Vue-router 라이브러리를 사용하여 처리됩니다. 라이브러리를 사용하려면 라이브러리를 설치한 다음 라우터 인스턴스를 만들어야 합니다. 다음은 Vue.js 3 응용 프로그램에서 라우팅을 설정하는 방법의 예입니다.

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

이 코드는 경로와 컴포넌트로 구성된 routes 배열을 만듭니다. path는 경로가 해당하는 URL이고 component 는 경로를 방문할 때 표시되는 Vue Component 입니다.

그런 다음 createRouter 함수와 routes 배열을 사용하여 router instance 를 만듭니다. router instance 는 라우터 옵션으로 새 Vue 인스턴스로 전달됩니다.

Vue component 에서 <router-link> 구성 요소를 사용하여 경로에 대한 링크를 생성할 수 있습니다. 예를 들어 다음 코드를 사용하여 /about 경로에 대한 링크를 생성할 수 있습니다.

<template>
  <nav>
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
  </nav>
</template>

사용자가 이러한 링크 중 하나를 클릭하면 라우터가 해당 경로로 이동하여 관련 component 를 표시합니다.

vue-router 의 두가지 모드

Vue.js 3에서 vue-router 라이브러리는 라우팅을 처리하기 위한 두 가지 모드, 즉 history 모드와 hash 모드를 제공합니다.

History mode

history 모드는 HTML5 history.pushState API 를 사용하여 페이지를 다시 로드하지 않고 URL을 업데이트합니다. 이렇게 하면 "실제" URL로 이동하여 다른 사용자와 공유할 수 있는 단일 페이지 응용프로그램(SPA)을 만들 수 있습니다.

Vue.js 3 Application 에서 history 모드를 사용하려면 vue-router에서 createWebHistory 함수를 가져와 기록 옵션으로 createRouter 함수에 전달해야 합니다. 다음은 이러한 설정 방법의 예입니다.

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(),
  routes: [ /* routes go here */ ]
})

history 모드가 작동하려면 모든 경로에 대한 요청을 처리하고 동일한 index.html 파일을 반환하도록 서버를 구성해야 합니다. 이를 통해 Vue.js 응용 프로그램이 클라이언트 측의 라우팅을 인계받아 처리할 수 있습니다.

Hash mode

hash 모드는 URL의 해시 부분(예: #/about)을 사용하여 현재 경로를 나타냅니다. 이렇게 하면 서버의 실제 페이지와 일치하지 않는 "실제"가 아닌 URL을 사용하여 SPA(Single-Page Application)를 만들 수 있습니다.

Vue.js 3 Application 에서 hash 모드를 사용하려면 vue-router 에서 createWebHashHistory 함수를 가져와 기록 옵션으로 createRouter 함수에 전달해야 합니다. 다음은 이러한 설정 방법의 예입니다.

import { createRouter, createWebHashHistory } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [ /* routes go here */ ]
})

hash 모드는 경로가 실제로 서버에서 처리되지 않기 때문에 특별한 서버 구성이 필요하지 않습니다.

728x90

'JAVASCRIPT > VUE' 카테고리의 다른 글

VUE3 - 성능 최적화  (0) 2022.12.23
VUE - 상태 관리 - state management  (0) 2022.12.21
VUE - 프로젝트 생성  (0) 2022.12.20
Vue3 란? Vue2 와의 차이점, Vue3 장점, Vue3 단점  (1) 2022.12.19
728x90

Vue.js 에서의 상태 관리는 응용프로그램을 구동하는 데이터를 저장, 업데이트 및 구성하는 프로세스를 말합니다.

 

Vue.js에서는 여러 가지 방법으로 상태를 관리할 수 있습니다. 한 가지 일반적인 접근 방식은 애플리케이션 전체 상태를 저장하고 관리하기 위해 Vuex와 같은 글로벌 스토어를 사용하는 것입니다. Vuex는 Vue.js와 함께 사용하도록 특별히 설계된 상태 관리 라이브러리입니다. 애플리케이션의 모든 데이터를 중앙 집중식으로 저장할 수 있으며, 단방향 데이터 흐름 모델을 사용하여 데이터가 일관되고 예측 가능하게 업데이트되도록 보장합니다.

Vue.js의 상태 관리를 위한 또 다른 옵션은 Vue.js3 에 도입된 Composition API 를 사용하는 것입니다. Composition API 는 보다 유연하고 재사용 가능한 방법으로 상태를 만들고 조작할 수 있는 기능 및 패턴 집합입니다. 상태 및 논리를 독립 실행형 함수로 정의한 다음 필요에 따라 구성 요소에서 사용할 수 있습니다.

궁극적으로 Vue.js 응용 프로그램에서 상태 관리를 위해 선택하는 접근 방식은 프로젝트의 특정 요구사항과 요구사항에 따라 달라집니다. 두 가지 옵션을 모두 고려하고 어떤 옵션이 사용 사례에 가장 적합한지 평가하는 것이 좋습니다.

vuex

다음은 Vue 3 컴포넌트에서 Vuex를 사용하는 방법의 예입니다.

import { defineComponent } from 'vue'
import { useStore } from 'vuex'

export default defineComponent({
  setup() {
    const store = useStore()
    const count = store.state.count
    const increment = () => store.commit('increment')
    const decrement = () => store.commit('decrement')

    return {
      count,
      increment,
      decrement
    }
  },
  template: `
    <div>
      <button @click="decrement">-</button>
      {{ count }}
      <button @click="increment">+</button>
    </div>
  `
})

이 예에서는 useStore 후크를 사용하여 컴포넌트에 Vuex Store에 대한 액세스 권한을 제공합니다. 그런 다음 컴포넌트는 state 및 commit 속성을 사용하여 Store 의 상태를 읽고 업데이트할 수 있습니다. 이 컴포넌트는 또한 클릭할 때 증가 및 감소 함수를 호출하는 두 개의 버튼을 가지고 있으며, 이 버튼은 Store 에 mutations 를 발생시킵니다.

composition api

Composition API는 Vue.js 3의 새로운 기능으로, 보다 유연하고 재사용 가능한 방식으로 상태 및 로직을 정의하고 조작할 수 있습니다. state 및 로직을 독립 실행형 함수로 정의한 다음 필요에 따라 컴포넌트에서 사용할 수 있는 일련의 함수 및 패턴을 제공합니다.

Composition API의 주요 이점 중 하나는 컴포넌트 로직을 더 작고 재사용 가능한 조각으로 쉽게 분할할 수 있다는 것입니다. 이렇게 하면 코드를 더 쉽게 이해, 테스트 및 유지 관리할 수 있습니다.

Vue.js 3 응용 프로그램에서 Composition API를 사용하려면 '@vue/composition-api' 패키지에서 'compose' 함수를 가져와 이를 사용하여 state 및 로직을 독립 실행형 함수로 정의할 수 있습니다. 그런 다음 컴포넌트의 템플릿 또는 스크립트 블록 내에서 이러한 기능을 호출하여 컴포넌트에서 이러한 기능을 사용할 수 있습니다.

<template>
  <div>
    <button @click="decrement">-</button>
    <span>{{ count }}</span>
    <button @click="increment">+</button>
  </div>
</template>

<script>
import { ref, computed, watch } from '@vue/composition-api'

export default {
  setup() {
    const count = ref(0)
    const increment = () => count.value++
    const decrement = () => count.value--
    return { count, increment, decrement }
  }
}
</script>

이 예에서는 'ref' 함수를 사용하여 'count' 라는 반응형 데이터 속성을 만들고 호출 시 'count' 의 값을 업데이트하는 'increment' 와 'decrement' 라는 두 가지 함수를 정의합니다. 컴포넌트의 'setup' 함수에서 이러한 값을 반환하여 컴포넌트 템플릿에서 사용할 수 있습니다.

vue2 option api 와 vue3 composition api 차이점

다음은 Vue 2의 옵션 API를 사용하는 구성 요소를 Vue 3의 Composition API를 사용하도록 변환하는 방법에 대한 예입니다.

// Vue 2 component using the options API
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}

// Vue 3 component using the Composition API
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const increment = () => { count.value++ }

    return {
      count,
      increment
    }
  }
}

이 예에서 'data' 함수와 'method' 개체는 'count' 및 'increment' 속성을 포함하는 개체를 반환하는 단일 'setup' 함수로 대체되었습니다. 'count' 속성은 구성 요소의 상태를 추적하는 데 사용할 수 있는 반응형 데이터 구조인 ref입니다. 'increment' 메서드는 'count' 참조 값을 증가시킵니다.

728x90

'JAVASCRIPT > VUE' 카테고리의 다른 글

VUE3 - 성능 최적화  (0) 2022.12.23
VUE3 - 라우팅 - routing  (0) 2022.12.22
VUE - 프로젝트 생성  (0) 2022.12.20
Vue3 란? Vue2 와의 차이점, Vue3 장점, Vue3 단점  (1) 2022.12.19
728x90

VUE CLI 설치

Vue 3 로 새 Vue.js 프로젝트를 생성하려면 Node.js와 Vue CLI(Command Line Interface)가 시스템에 설치되어 있어야 합니다. Vue CLI를 설치하려면 터미널 창을 열고 다음 명령을 실행합니다.

npm install -g @vue/cli

위와 같이 입력후 실행하면 Vue CLI가 시스템에 전체적으로 설치됩니다. Vue CLI가 설치되면 터미널에서 다음 명령을 실행하여 새 Vue.js 프로젝트를 만들 수 있습니다.

프로젝트 생성

vue create my-project

그러면 "my-project"라는 디렉토리에 새 Vue.js 프로젝트가 생성됩니다. Vue CLI는 프로젝트의 사전 설정을 선택하라는 메시지를 표시합니다. 단일 Vue.js 구성 요소가 있는 기본 구성을 포함하는 기본 사전 설정을 선택하거나 "수동으로 기능 선택"을 선택하여 구성을 사용자 지정할 수 있습니다. 수동 설정의 경우 스페이스 바를 사용하여 기능을 선택하거나 선택 취소하고 화살표 키를 사용하여 옵션 사이를 이동할 수 있습니다. 프로젝트에 포함할 기능을 선택했으면 "Enter" 키를 눌러 계속합니다.

Vue CLI는 프로젝트를 생성하고 필요한 모든 종속성을 설치합니다. 그런 다음 프로젝트 디렉터리로 이동하고 다음 명령을 실행하여 개발 서버를 시작할 수 있습니다.

사전 설정을 선택하면 Vue CLI가 프로젝트를 생성하고 필요한 모든 종속성을 설치합니다. 그런 다음 프로젝트 디렉터리로 이동하고 다음 명령을 실행하여 개발 서버를 시작할 수 있습니다.

수동 설정시

Vue CLI로 새 Vue.js 프로젝트를 생성할 때 기능을 수동으로 선택할 때 다음 옵션 중에서 선택할 수 있습니다.

  • Babel: 대상 브라우저가 지원하지 않더라도 최신 JavaScript 구문 및 기능을 사용할 수 있게 해주는 JavaScript 컴파일러입니다.
  • TypeScript: 유형 검사 및 기타 기능을 언어에 추가하는 유형이 지정된 JavaScript 상위 집합입니다.
  • 라우터: Vue 라우터 라이브러리를 사용하여 클라이언트 측 라우팅에 대한 지원을 추가합니다.
  • Vuex: Vuex 라이브러리로 상태 관리 지원을 추가합니다.
  • CSS 전처리기: Sass, Less 또는 Stylus와 같은 CSS 전처리기에 대한 지원을 추가합니다.
  • Linter / Formatter: ESLint 및 Prettier와 같은 Linting 및 서식 지정 도구에 대한 지원을 추가합니다.
  • 단위 테스트: Jest 또는 Mocha와 같은 도구를 사용한 단위 테스트 지원을 추가합니다.
  • E2E 테스트: Cypress 또는 Nightwatch와 같은 도구를 사용하여 종단 간 테스트에 대한 지원을 추가합니다.

이러한 옵션의 조합을 선택하여 Vue.js 프로젝트를 사용자 정의할 수 있습니다.

VUE 애플리케이션 실행

cd my-project
npm run serve

이렇게 하면 개발 서버가 시작되고 기본 웹 브라우저에서 Vue.js 애플리케이션이 열립니다. 그런 다음 Vue.js 애플리케이션 구축을 시작할 수 있습니다.

728x90

'JAVASCRIPT > VUE' 카테고리의 다른 글

VUE3 - 성능 최적화  (0) 2022.12.23
VUE3 - 라우팅 - routing  (0) 2022.12.22
VUE - 상태 관리 - state management  (0) 2022.12.21
Vue3 란? Vue2 와의 차이점, Vue3 장점, Vue3 단점  (1) 2022.12.19
728x90

VUE3 란?

Vue.js는 사용자 인터페이스를 구축하기 위한 진보적인 자바스크립트 프레임워크입니다. 점진적으로 채택할 수 있도록 설계되어 있어 필요한 만큼 프레임워크를 사용하거나 적게 사용할 수 있으며 다른 라이브러리나 기존 프로젝트와 쉽게 통합할 수 있습니다.

Vue.js 버전 3은 2020년 9월에 출시된 Vue.js의 최신 주요 버전입니다. 향상된 성능, 향상된 TypeScript 지원, 유연하고 강력한 구성 요소 논리를 위한 새로운 Composition API 등 이전 버전에 비해 많은 새로운 기능과 개선 사항이 포함되어 있습니다.

Vue 3에 대해 자세히 알아보려면 Vue.js 웹 사이트(https://v3-docs.vuejs-korea.org)에서%EC%97%90%EC%84%9C)

설명서와 리소스를 찾을 수 있습니다. 비디오 튜토리얼, 기사 및 책을 포함하여 Vue.js 사용 방법을 배우는 데 온라인에서 사용할 수 있는 많은 리소스도 있습니다.

VUE2 vs VUE3

Vue.js 버전 2("Vue 2"라고도 합니다) 는 2016년에 출시되었으며 웹 애플리케이션 개발에 널리 사용되고 있습니다. Vue 2는 새로운 템플릿 구문, 구성 요소를 위한 더 나은 API, 향상된 성능을 포함하여 이전 버전에 비해 많은 개선 사항을 소개했습니다.

Vue.js 버전 3("Vue 3"라고도 합니다) 은 2020년 9월에 출시되었으며 Vue 2에 비해 많은 새로운 기능과 향상된 기능을 포함하고 있습니다.

주요 차이점은 다음과 같습니다.

성능: Vue 3은 Vue 2에 비해 성능이 향상되었으며 렌더링 시간이 더 빠르고 번들 크기가 더 작습니다.

TypeScript 지원: Vue 3은 더 나은 유형 추론과 더 정확한 유형 정의를 포함하여 TypeScript에 대한 지원을 향상시켰습니다.

Composition API: Vue 3은 Vue 2에서 사용되는 기존의 Options API의 대안으로 사용할 수 있는 유연하고 강력한 구성 요소를 구축하기 위한 새로운 Composition API를 도입합니다.

텔레포트 및 서스펜스: Vue 3은 텔레포트와 서스펜스라는 새로운 기능을 도입하여 개발자들이 콘텐츠를 DOM의 다른 위치에 렌더링하거나 특정 조건이 충족될 때까지 렌더링을 연기할 수 있게 합니다.

전반적으로, Vue3 는 웹 애플리케이션을 구축하기 위한 더 강력하고 효율적인 프레임워크를 만드는 많은 개선 사항과 새로운 기능을 포함합니다. 새 프로젝트에 Vue.js를 사용하는 것을 고려하고 있다면 Vue 2 대신 Vue 3을 사용하는 것을 고려해 볼 가치가 있습니다.

VUE3 장점

Vue 3의 주목할 만한 이점은 다음과 같습니다.

향상된 성능: Vue 3은 이전 버전에 비해 성능이 향상되었으며 렌더링 시간이 빨라지고 번들 크기가 작아졌습니다.

향상된 TypeScript 지원: Vue 3은 더 나은 유형 추론과 더 정확한 유형 정의를 포함하여 TypeScript에 대한 지원을 향상시켰습니다.

Composition API: Vue 3은 유연하고 강력한 구성요소를 구축하기 위한 새로운 Composition API를 도입하여 이전 버전에서 사용되던 기존 Options API의 대안으로 사용할 수 있습니다.

텔레포트 및 서스펜스: Vue 3은 텔레포트와 서스펜스라는 새로운 기능을 도입하여 개발자들이 콘텐츠를 DOM의 다른 위치에 렌더링하거나 특정 조건이 충족될 때까지 렌더링을 연기할 수 있게 합니다.

반응성 향상: Vue 3은 사용 및 디버깅이 더 용이한 새롭고 효율적인 반응성 시스템을 소개합니다.

개선된 문서 및 커뮤니티 지원: Vue 3은 문서화를 개선하고 지원과 지원을 제공할 수 있는 대규모의 적극적인 개발자 커뮤니티를 구축했습니다.

VUE3 단점

Vue 3 는 이전 버전의 프레임워크에 비해 크게 개선된 것으로 간주되며 웹 애플리케이션 구축을 위한 강력하고 효율적인 선택을 가능하게 하는 많은 이점과 새로운 기능을 가지고 있습니다. 그러나 다른 소프트웨어와 마찬가지로 Vue 3을 사용할 때 고려해야 할 몇 가지 잠재적인 단점도 있습니다.

호환성 문제: Vue 3은 이전 버전에서 일부 변경 사항을 도입하여 기존 Vue 2 프로젝트와의 호환성 문제를 야기할 수 있습니다. 기존 Vue 2 프로젝트를 Vue 3으로 업그레이드하는 경우 새 버전에서 작동하려면 코드를 변경해야 할 수 있습니다.

학습 곡선: 새로운 소프트웨어와 마찬가지로 Vue 3을 사용하는 데에는 학습 곡선이 있습니다. Vue.js를 처음 사용하거나 이전 버전만 사용한 경우 Vue 3에 도입된 새로운 기능과 API를 학습하는 데 시간과 노력을 투자해야 할 수 있습니다.

제한된 브라우저 지원: Vue 3은 일부 브라우저에서 지원되지 않는 최신 자바스크립트 기능을 사용합니다. 즉, 이전 브라우저를 지원해야 하거나 광범위한 브라우저를 지원해야 하는 경우 Vue 3 코드가 호환되는지 확인하기 위해 폴리필 또는 트랜스필러를 사용해야 할 수 있습니다.

Vue 3는 많은 이점을 가지고 있고 웹 애플리케이션을 구축하기 위한 강력하고 효율적인 프레임워크이지만, 프로젝트에 적합한 선택인지 여부를 결정할 때 이러한 잠재적인 단점을 주의 깊게 고려하는 것이 중요합니다.

 

다음 포스트엔 VUE3 를 통한 프로젝트 생성에 대한 내용을 알아 보겠습니다.

728x90

'JAVASCRIPT > VUE' 카테고리의 다른 글

VUE3 - 성능 최적화  (0) 2022.12.23
VUE3 - 라우팅 - routing  (0) 2022.12.22
VUE - 상태 관리 - state management  (0) 2022.12.21
VUE - 프로젝트 생성  (0) 2022.12.20
728x90

Math.ceil()

Math.ceil() 메서드는 주어진 숫자의 소수점 아래를 버리고 그 숫자보다 크거나 같은 정수 중 가장 작은 정수를 반환합니다. 예를 들어,

Copy code
Math.ceil(5.3) // 6
Math.ceil(5.7) // 6
Math.ceil(-5.3) // -5

같은 방법으로, 음수의 소수점 아래 숫자도 정수로 반환합니다.

Copy code
Math.ceil(-5.7) // -5

만약 정수가 주어졌다면, 그대로 반환합니다.

Copy code
Math.ceil(5) // 5

Math.floor()

Math.floor()은 숫자의 소수점 이하를 버리고 정수를 반환하는 함수입니다. 예를 들어 Math.floor(4.7)은 4를, Math.floor(-5.4)는 -6을 반환합니다.

음수의 경우, 모드에 따라 0에 가까워 지거나 0에서 멀어지는 방향으로 반올림 됩니다.

Math.floor() 함수는 아래와 같이 사용할 수 있습니다.

Copy code
// 소수점 이하를 버리고 정수로 반환합니다.
console.log(Math.floor(4.7));  // 4
console.log(Math.floor(-5.4)); // -6

이 함수는 소수점 이하의 숫자를 버리고 정수로 반환하기 때문에 주로 정수 범위 내의 값으로 변환할 때 사용합니다.

 

Math.round()

Math.round()은 숫자를 반올림하는 함수입니다. 예를 들어, Math.round(4.3)은 4를, Math.round(4.6)은 5를 반환합니다. 이 함수는 다음과 같이 사용할 수 있습니다:

Copy code
console.log(Math.round(4.3));  // 4
console.log(Math.round(4.6));  // 5

Math.round()은 소수점 첫째 자리에서 반올림합니다. 예를 들어, Math.round(4.23)은 4를, Math.round(4.26)은 4를 반환합니다.

Copy code
console.log(Math.round(4.23));  // 4
console.log(Math.round(4.26));  // 4

만약 숫자가 음수일 경우 Math.round()는 절대값이 같은 양수일 때와 동일하게 동작합니다. 예를 들어, Math.round(-4.3)은 -4를, Math.round(-4.6)은 -5를 반환합니다.

Copy code
console.log(Math.round(-4.3));  // -4
console.log(Math.round(-4.6));  // -5

만약 문자열을 인수로 넣었을 경우에는 이 문자열이 숫자로 변환되어 반올림이 수행됩니다. 만약 문자열이 숫자로 변환되지 않는다면, 이 메서드는 NaN 을 반환합니다.

Math.trunc()

 

Math.trunc() 는 숫자의 정수 부분만을 반환하는 함수입니다. 예를 들어, Math.trunc(3.5)  3 을 반환하고, Math.trunc(-5.5)  -5 을 반환합니다. 이 함수는 부동 소수점 숫자의 정수 부분을 제거할 때 유용하게 사용할 수 있습니다.

Copy code
Math.trunc(3.5);    // 3
Math.trunc(-5.5);   // -5
Math.trunc(3.49);   // 3
Math.trunc(-5.49);  // -5

주의해야 할 점은 Math.trunc() 가 제공되지 않는 브라우저에서는 작동하지 않을 수 있다는 것입니다. 이 경우에는 Number.prototype.toFixed() 를 사용하여 정수 부분만을 추출하는 대신 사용할 수 있습니다.

Copy code
function trunc(x) {
  return x < 0 ? Math.ceil(x) : Math.floor(x);
}

trunc(3.5);    // 3
trunc(-5.5);   // -5
trunc(3.49);   // 3
trunc(-5.49);  // -5

자세한 내용은 MDN의 문서를 참고하세요.

 

 

728x90
728x90

두 배열 사이의 중복값 구하기 - indexOf vs includes

존재하는 두 배열 사이에서 중복된 값을 가진 새로운 배열로 반환하고자 할때 아래의 두가지 방법으로 선언이 가능합니다.

방법1. indexOf

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 5, 6, 7, 8];

const dupleArr = (a, b) => a.filter(i => b.indexOf(i) !== -1);

console.log(dupleArr(arr1, arr2);

// > [3, 5];

방법2. includes

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 5, 6, 7, 8];

const dupleArr = (a, b) => a.filter(i => b.includes(i));

console.log(dupleArr(arr1, arr2));

// > [3, 5];

indexOf vs includes 차이점

indexOf 는 중복된 값의 첫번째 인덱스 값을 반환하며, includes 는 해당 요소를 포함하고 있는지 판별하여 true, false (boolean) 값을 반환합니다.

indexOf

배열에서 지정된 요소를 찾을 수 있는 첫번째 인덱스를 반환하고 만약 존재하지 않는다면 -1을 반환합니다.

const arr1 = [1, 2, 3, 4, 5];

// (1)
console.log(arr1.indexOf(1));
// > 0

// (2)
console.log(arr.indexOf(3));
// > 2

// (3)
console.log(arr.indexOf(3, 3));
// > -1

(3) 과 같이 indexOf 의 두번째 인자를 넣을 수 있으며, 두번째 인자는 fromIndex 로써 검색을 시작할 인덱스를 지정해 줄 수 있습니다. (3) 에서 3이란 값은 존재하지만 검색을 index 3 = ‘4’ 부터 시작하므로 찾을 수 없기 때문에 -1 을 출력 합니다.

includes

배열이 특정 요소를 포함하고 있는지를 판별 합니다.

const arr2 = [3, 5, 6, 7, 8];

// (1)
console.log(arr2.includes(3));
// true

// (2)
console.log(arr2.includes(9));
// false

// (3)
console.log(arr2.includes(3, 1));
// false

indexOf 와 마찬가지로 두번째 인자를 통해 fromIndex 값을 설정 해줄 수 있으며, (3) 과 같이 값이 있지만 시작 인덱스의 설정값으로 인해 false 값을 출력 합니다.

폴리필

indexOf

// ECMA-262, 제 5 판, 15.4.4.14의 생산 단계
// 참조 : <http://es5.github.io/#x15.4.4.14>
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. 이 값을 인수로 전달하는 ToObject를 호출 한 결과를
    // o라고합니다.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. lenValue를 Get 함수를 호출 한 결과로 둡니다.
     // 인수가 "length"인 o의 내부 메소드.
     // 3. len을 ToUint32 (lenValue)로 지정합니다.
    var len = o.length >>> 0;

    // 4. len이 0이면 -1을 반환합니다.
    if (len === 0) {
      return -1;
    }

    // 5.Index에서 인수가 전달 된 경우 n을
    // ToInteger (fromIndex); 그렇지 않으면 n은 0이됩니다.
    var n = fromIndex | 0;

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

   // 7. n> = 0 인 경우 k를 n이라고 합니다.
   // 8. 그렇지 않으면 n <0, k는 len - abs (n)이됩니다.
   // k가 0보다 작은 경우 k를 0으로 만듭니다.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. k 

includes

// <https://tc39.github.io/ecma262/#sec-array.prototype.includes>
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      // 1. Let O be ? ToObject(this value).
      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      function sameValueZero(x, y) {
        return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
      }

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        if (sameValueZero(o[k], searchElement)) {
          return true;
        }
        // c. Increase k by 1.
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}
728x90
728x90

1~N 만큼의 배열을 선언후 사용할일이 있을 경우, [1 2, 3, 4, 5 … N] 만큼의 값을 선언 후 사용하는 방법도 있으나, 자바스크립트에서 제공하는 Array.from 과 map 내장함수를 이용하여 함수화 하여 선언 후 사용이 가능합니다.

예제

// 1 ~ 10  까지의 배열 선언이 필요한 경우

// 방법 (1)
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 방법 (2)
const arr2 = Array.from({length: 10}).map((v, k) => k + 1);
// > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 방법 (3)
const arr3 = Array.from({length: 10}, (v, k) => k + 1);
// > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

또한 특정 문자열에 대해 각각의 문자를 기준으로 배열 변환이 필요한 경우에도 마찬가지로 Array.from 을 이용하여 변환이 가능합니다

예제 - 문자열 배열 변환

const arr = Array.from('Hello world');
// > ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
const arr2 = Array.from('12345678910');
// > ['1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0']

시퀀스 함수를 구현해 놓는다면 재사용성 높게 활용이 가능합니다.

const range = n => Array.from({length:n}, (v, k) => k);
console.log(range(10));

// > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Array.from 은 length 속성과 인덱싱 요소를 가진 객체(유사배열객체) 나 반복 가능한 객체에 대해 배열로의 반환이 가능함으로, Set, Map에서의 배열 변환도 가능합니다.

예제 - Set 배열 변환

const arr = new Set(['hello world', window]);
Array.from(arr);
// > ['hello world', Window]

예제 - Map 배열 변환

const map = new Map([[1, 2], [2, 4], [4, 8]]);
Array.from(map);
// > [[1, 2], [2, 4], [4, 8]]

const mapper = new Map([['1', 'a'], ['2', 'b']]);
Array.from(mapper.values());
// > ['a', 'b'];

Array.from(mapper.keys());
// > ['1', '2'];

Array.from 은 Array.from(arrayLike[, mapFn[, thisArg]]) 이와같이 mapFn 을 선택 매개변수로 가지고 있으며 필요에 따라 배열의 각 요소를 맵핑할때 사용이 가능합니다.

그렇기 때문에 처음 1~N 까지의 배열을 만들때 방법 (3)과 같이 선언하여 사용하는 방법도 가능하게 됩니다.

Array.from 은 ES6 에 추가된 문법으로써, 어떠한 표준 구현체에서는 사용할 수 없을 수 있습니다.

다른 모든 코드 이전 최상단에 아래 코드를 넣으면 지원하지 않는 플랫폼에서도 Array.from 기능을 사용할 수 있습니다.

코드

// Production steps of ECMA-262, Edition 6, 22.1.2.1
if (!Array.from) {
  Array.from = (function () {
    var toStr = Object.prototype.toString;
    var isCallable = function (fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };
    var toInteger = function (value) {
      var number = Number(value);
      if (isNaN(number)) { return 0; }
      if (number === 0 || !isFinite(number)) { return number; }
      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
    };
    var maxSafeInteger = Math.pow(2, 53) - 1;
    var toLength = function (value) {
      var len = toInteger(value);
      return Math.min(Math.max(len, 0), maxSafeInteger);
    };

    // The length property of the from method is 1.
    return function from(arrayLike/*, mapFn, thisArg */) {
      // 1. Let C be the this value.
      var C = this;

      // 2. Let items be ToObject(arrayLike).
      var items = Object(arrayLike);

      // 3. ReturnIfAbrupt(items).
      if (arrayLike == null) {
        throw new TypeError('Array.from requires an array-like object - not null or undefined');
      }

      // 4. If mapfn is undefined, then let mapping be false.
      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
      var T;
      if (typeof mapFn !== 'undefined') {
        // 5. else
        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
        if (!isCallable(mapFn)) {
          throw new TypeError('Array.from: when provided, the second argument must be a function');
        }

        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length > 2) {
          T = arguments[2];
        }
      }

      // 10. Let lenValue be Get(items, "length").
      // 11. Let len be ToLength(lenValue).
      var len = toLength(items.length);

      // 13. If IsConstructor(C) is true, then
      // 13. a. Let A be the result of calling the [[Construct]] internal method
      // of C with an argument list containing the single item len.
      // 14. a. Else, Let A be ArrayCreate(len).
      var A = isCallable(C) ? Object(new C(len)) : new Array(len);

      // 16. Let k be 0.
      var k = 0;
      // 17. Repeat, while k < len… (also steps a - h)
      var kValue;
      while (k < len) {
        kValue = items[k];
        if (mapFn) {
          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
        } else {
          A[k] = kValue;
        }
        k += 1;
      }
      // 18. Let putStatus be Put(A, "length", len, true).
      A.length = len;
      // 20. Return A.
      return A;
    };
  }());
}
728x90

+ Recent posts