JavaScript - template tag function


const tag = function(strs, arg1, arg2){
  return {strs: strs, args: [arg1, arg2]}
}

const res = tag `순서가 ${1}이렇게 ${2}`

strs : [“순서가 “, “이렇게 “, “”]

args : [1, 2]

tag 함수는 tag 함수 이름을 적고 뒤에 template literal을 적어주면 첫번째 인자에는 순수한 문자열의 배열을 넣어주고

string interpolation에 있는 값들을 인자로 넘긴다.

무조건 문자열이 interpolation보다 한 개 더 많아야 한다.

그래서 interpolation이 많아지면 그냥 알아서 문자열 배열에 있는 ““의 수를 얘네가 추가로 늘려준다.

const createCollection = {
  Map(keys, ...vals){
    const m = new Map()
    vals.forEach((val, i)=>{
      m.set(keys[i].trim(), val)
    })
    return m
  },
  
  wMap(keys, ...vals){
    const wm = new WeakMap()
    for(let i = 0; i < vals.length; i+=2){
      wm.set(vals[i], vals[i+1])
    }
    return wm
  },
}

const wkeys = [{a : 100}, {b : 200}]
const map = createCollection.Map `
  a ${10}
  b ${`what`}
  fn ${v=>v+10}
`
console.log(map)

Map{"a"=>10, "b"=>"what", "fn"=>f}가된다.