/JavaScript

๐Ÿ“Œ JavaScript study repository

๐Ÿ“Œ JavaScript-Study

  • JavaScript study ๐Ÿ“š
  • Code Review study ๐Ÿ’ป
  • CSS study ๐Ÿญ

1. Promise()

2. ๊ฐ€๋ณ€์˜์—ญ ๊ณ ์ •์˜์—ญ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ

  • ๊ฐ€๋ณ€์˜์—ญ์— calc() ์ ์šฉ
.main {
  width: calc(100% - 300px);
}
  • ๊ฐ€๋กœ๋ฐฐ์น˜
.main, .side {
  float: left;
}

1-1) Vendor prefix : Cross Browsing

  • chrome : -webkit-
  • firefox : -moz-
  • opera : -o-
  • IE : -ms-

2) table-layout

  • ๋ถ€๋ชจ ์˜์—ญ
.wrapper {
  display: table;
  width: 100%
}
  • ์ž์‹ ์˜์—ญ
.main, .side {
  display: table-cell
}

3) flex-box

  • ๋ถ€๋ชจ์˜์—ญ
.wrapper {
  display: flex;
}

3. Object Type

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด ๊ฐœ๋…์€ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ƒ์† ๋ฐฉ์‹ ๋“ฑ์—์„œ C++์ด๋‚˜ ์ž๋ฐ”์™€ ๊ฐ™์€ ๊ธฐ์กด ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ์˜ ๊ฐ์ฒด ๊ฐœ๋…๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด์— ๋น„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํด๋ž˜์Šค๋ผ๋Š” ๊ฐœ๋…์ด ์—†๊ณ , ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋“ฑ ๋ณ„๋„์˜ ์ƒ์„ฑ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

//  Object()์‚ฌ์šฉํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
var foo = new Object();

//  foo ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
foo.name = 'name'
foo.age = 30
foo.gender = 'male'

console.log(type of foo) // object
console.log(foo)  //  { name: 'name', age: 30, gender: 'male' }

2) ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹

  • ๋ฆฌํ„ฐ๋Ÿด์ด๋ž€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•
//  ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
var foo = {
  name: 'name',
  age: 30,
  gender: 'male'
}

//  foo ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
foo.name = 'name'
foo.age = 30
foo.gender = 'male'

console.log(type of foo) // object
console.log(foo)  //  { name: 'name', age: 30, gender: 'male' }

3) ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด์šฉ

  • ํ•จ์ˆ˜๋„ ๊ฐ์ฒด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด(First Class) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
//  ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์œผ๋กœ add() ํ•จ์ˆ˜ ์ •์˜
function add(x, y) {
  return x + y
}

//  add() ํ•จ์ˆ˜ ๊ฐ์ฒด์— result, status ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
add.result = add(3,2)
add.status = 'ok'

console.log(add.result) //  5
console.log(add.status)  // 'ok'
  • copy : copy.a๋Š” ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ
const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
  • merge : ์†์„ฑ์€ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ์—์„œ ๋” ๋’ค์— ์œ„์น˜ํ•œ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜ํ•ด ๋ฎ์–ด์“ฐ์ž„
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };

const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 } ๋Œ€์ƒ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋จ.
  • ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด ๊ณ ์œ  ์†์„ฑ์˜ ์ด๋ฆ„์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
  • ๋น„์—ด๊ฑฐํ˜•(non-enumerables)์„ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์›ํ•œ๋‹ค๋ฉด Object.getOwnPropertyNames()๋ฅผ ์ฐธ๊ณ 
  • enumerable ์†์„ฑ [key, value] ์Œ์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜
var params = {
  id: this.Id,
  startDate: this.startDate,
  endDate: this.endDate
}

params = Object.entries(params).map((param) => {
  return param.join('=')
}).join('&')
console.log(params) //  id=testId&startDate=02-01&endDate=02-03
  • Converting an Object to a Map
const obj = { first: 'hi', second: 25 }; 
const map = new Map(Object.entries(obj));
console.log(map); // Map { first: "hi", second: 25 }
  • array ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ
const obj = { first: 'hi', second: 25 };
Object.entries(obj).forEach(([key, value]) => console.log(`${key}: ${value}`)); // "first: hi", "second: 25"

4. Function

1) arguments ๊ฐ์ฒด

๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์ง€์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ์ „๋‹ฌ๋œ ์ธ์ž์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์— ์œ ์šฉ

function sum() {
  var result = 0
  
  for (var i = 0; i < arguments.length; i++){
    result += arguments[i]
  }
  return result
}

console.log(sum(1, 2, 3)) //  6
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) //  45
  • arguments๋Š” ์œ ์‚ฌ๋ฐฐ์—ด์ด๋ฏ€๋กœ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋ถˆ๊ฐ€
argFunction(dynamicData)

//  arguments๋Š” ์œ ์‚ฌ๋ฐฐ์—ด์ด๋ฏ€๋กœ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋ถˆ๊ฐ€ -> call() ํ™œ์šฉ
function argFunction() {
    [].forEach.call(arguments, function(el) {
        console.log(el)
    })
}
  • html
<p>This text is red</p>
<div id="sidebar">
  <p>This text has the default color</p>
</div>
  • css
p {
  color: red;
}

#sidebar p {
  color: unset;
}

a. ์‚ฌ์šฉ ์ด์œ  & ๋ฐฐ๊ฒฝ

๊ธฐ์กด Web Task Manager (Gulp, Grunt)์˜ ๊ธฐ๋Šฅ + ๋ชจ๋“ˆ ์˜์กด์„ฑ ๊ด€๋ฆฌ ex) minification์„ webpack default cli๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ

$ webpack -p

b. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Code based Modules ๊ด€๋ฆฌ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ (ํŒŒ์ผ๋ฒ ์ด์Šค ๋ชจ๋“ˆํ™”x, ์ „์—ญ๋ณ€์ˆ˜ ๋“ฑ) : AMD, Common js, ES6(Modules)

  • ๋ฌธ์ œ์  : ์ „์—ญ๋ณ€์ˆ˜ ์ถฉ๋Œ, ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ์ˆœ์„œ, ๋ณต์žก๋„์— ๋”ฐ๋ฅธ ๊ด€๋ฆฌ์ƒ์˜ ๋ฌธ์ œ

<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="library1.js"></script>
<script src="module3.js"></script>

๊ธฐ๋ณธ ๋ชจ๋“ˆ ๋กœ๋”๋“ค๊ณผ์˜ ์ฐจ์ด์  : ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ Chunk ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ํ•„์š”ํ•  ๋•Œ ๋กœ๋”ฉ ํ˜„๋Œ€์˜ ์›น์—์„œ JS ์—ญํ• ์ด ์ปค์ง์— ๋”ฐ๋ผ , Client Side์— ๋“ค์–ด๊ฐ€๋Š” ์ฝ”๋“œ๋Ÿ‰์ด ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์ง ๋ณต์žกํ•œ ์›น์ ์•ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•˜๋Š” Common js, AMD, ES6 Modules ๋“ฑ์ด ๋“ฑ์žฅ ๊ฐ€๋…์„ฑ์ด๋‚˜ ๋‹ค์ˆ˜ ๋ชจ๋“ˆ ๋ฏธ๋ณ‘ํ–‰ ์ฒ˜๋ฆฌ๋“ฑ์˜ ์•ฝ์  ๋ณด์™„์œ„ํ•ด Webpack ๋“ฑ์žฅ

c. ์ฒ ํ•™

Everything is Module : ๋ชจ๋“  ์›น ์ž์›(js, css, html)์ด ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋กœ๋”ฉ๊ฐ€๋Šฅ

require('base.css')
require('main.js')

Load only 'what' you need and 'when' you need : ์ดˆ๊ธฐ์— ๋ถˆํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋กœ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉ

a. webpack.config.js

// webpack.config.js
// `webpack` command will pick up this config setup by default
var path = require('path');

module.exports = {
  entry: './app/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};
module.exports = {
  //...
  entry: {
    vendor: ['jquery', 'other-lib'],
    app: './entry'
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      // filename: "vendor.js"
      // (Give the chunk a different name)

      minChunks: Infinity,
      // (with more entries, this ensures that no other module
      //  goes into the vendor chunk)
    })
  ]
};

1) async, await๋Š” ES8(ECMAScript2017)์˜ ๊ณต์‹ ์ŠคํŽ™, ๋น„๊ต์  ์ตœ๊ทผ์— ์ •์˜๋œ ๋ฌธ๋ฒ•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜. ex) setTimeout, callback, promise ...

2) How to Use

  • function ํ‚ค์›Œ๋“œ ์•ž์— async๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ณ 
  • ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • await ๋’ท๋ถ€๋ถ„์ด ๋ฐ˜๋“œ์‹œ promise ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ
  • async function ์ž์ฒด๋„ promise ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ

3) Promise์™€ ๋น„๊ต

  • promise
const makeRequest = () =>
  getJSON()
    .then(data => {
      console.log(data)
      return "done"
    })

makeRequest()
  • async / await
const makeRequest = async () => {
  console.log(await getJSON())
  return "done"
}

makeRequest()

9. Cookie

  • cookie parameters (name, value, expires, path, domain, secure)
window.$cookies.set('cookieName', value, '0', '/')
window.$cookies.remove('cookieName')

1) web worker๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ(multi-thread)๋ฅผ ์ง€์›

2) ์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ๋„, ๋™์‹œ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์—…๋„ ๋ณ‘ํ–‰ ๊ฐ€๋Šฅ

3) ํ•„์š”ํ•œ ๊ฒฝ์šฐ

๋งค์šฐ ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ๊ณ„์‚ฐ ์ž‘์—… ์›๊ฒฉ์ง€์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ž‘์—…(๋˜๋Š” ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์•ก์„ธ์Šค ํ•˜๋Š” ๊ฒฝ์šฐ) ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์กฐ์šฉํžˆ ์˜ค๋žœ์‹œ๊ฐ„ ์ž‘์—…์• ํ– ํ•˜๋Š” ๊ฒฝ์šฐ UI ์“ฐ๋ ˆ๋“œ์— ๋ฐฉํ•ด ์—†์ด ์ง€์†์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋“ฑ

12. object-fit: cover IE ์ ์šฉ ๋ฐฉ๋ฒ•

  • ๋ถ€๋ชจ div
.cover-wrapper {
  width: 500px;
  height: 70px;
  position: relative;
  overflow: hidden;
}
  • ์ž์‹ img
cover-img {
  position: absolute;
  min-width: 1000%;
  min-height: 1000%;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) scale(0.1);
}

13. flat() & flatMap()

  • IE, Edge not support
arr.flat([depth]);
var arr1 = [1, 2, [3, 4]];
arr1.flat(); // [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat(); // [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2); // [1, 2, 3, 4, 5, 6]

//  ๋นˆ ์Šฌ๋กฏ ์ œ๊ฑฐ
var arr4 = [1, 2, , 4, 5];
arr4.flat(); // [1, 2, 4, 5]
// array๊ฐ€ nested array๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ flat ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด
array.flat(Infinity);
// โ†’ [1, 2, 3]

14. babel

1) polyfill ์ด๋ž€?

Polyfill์€ ๊ตฌํ˜„ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ์ƒ์‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค.

  • babel-polyfill์€ core-js, regenerator runtime์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“ˆ

babel์€ ๋ฌธ๋ฒ•์„ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•  ๋ฟ์ด๋‹ค. polyfill์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜์Œ์— ์‹œ์ž‘๋  ๋•Œ ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ๊ฐ object์˜ prototype์— ๋ถ™์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ฆ‰, babel์€ [์ปดํŒŒ์ผ-ํƒ€์ž„]์— ์‹คํ–‰๋˜๊ณ  babel-polyfill์€ [๋Ÿฐ-ํƒ€์ž„]์— ์‹คํ–‰๋œ๋‹ค.

3) .babelrc

:
 {
    "presets": [
      ["env", {
        "targets": {
          "browsers": ["last 2 versions", "ie >= 9", "> 5% in KR"]
        }
      }]
    ]
  }
:

15. Parallax

1) basic parallax test

.container {
  background-attachment: fixed;
  background-size: cover;
}
  • text underline
.scene header h1:after{
  content: '';
  border-bottom: 1px solid white;
  width: 8rem;
  display: block;
  margin: 0 auto;
  margin-top: 1rem;
}

16. Shallow & Deep Copy

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ถˆ๋ณ€ํ˜•์˜ ๋ฐ์ดํ„ฐ ๋ฅผ ์„ ์–ธํ•  ๋•Œ ํฌ์ธํ„ฐ์™€ ๊ฐ’ ๋ชจ๋‘ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์˜ค๋ธŒ์ ํŠธ(๋ฐฐ์—ด) ์„ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์„ ์œ„ํ•ด ํฌ์ธํ„ฐ๋งŒ ์ƒˆ๋กœ ํ• ๋‹นํ•  ๋ฟ์ด๋‹ค.

1) shallow copy

const a = 1;
const b = a;
b = 2;
console.log(a, b);
  • Object.assign()
  • Spread ๋ฌธ๋ฒ• ์‚ฌ์šฉ

2) deep copy

const a = { p : 1 };
const b = a;
b.p = 2;
console.log(a.p, b.p);
  • JSON ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์žฌ๊ท€ ์‚ฌ์šฉ

  • ์ฐธ๊ณ