Why is pop faster than shift?

前端 未结 6 1735
情深已故
情深已故 2020-12-01 11:46

Douglas Crockford, in JavaScript: The Good Parts, states that \"shift is usually much slower than pop\". jsPerf confirms this. Does anyone know why this is the case

6条回答
  •  失恋的感觉
    2020-12-01 12:43

    The difference can be negligible—Unoptimized executors may run shift much slower than pop, but optimized ones won't.

    You can optimize like this:

    let WrapArray = _=>{
      //Ensure no other ref to `_`.
    
      let numlike = _=>isNaN(_)?false:true
      let num = _=>Number(_)
      {
        let shift_q = 0
        return new Proxy(_, {
          get(first_t, k){
            switch(k){
              case 'shift': return (z={})=>(z.r=first_t[0 + shift_q], delete first_t[0 + shift_q++], z.r)
              break; case 'length': return first_t.length - shift_q
              break; default: return first_t[numlike(k)?num(k) +/*todo overflowguard*/shift_q:k]
            }
          },
          set(first_t, k, v){
            switch(k){
              case 'length': first_t.length = v + shift_q
              break; default: first_t[numlike(k)?num(k) +/*todo overflowguard*/shift_q:k] = v
            }
          }, 
          has(first_t, k){
            return (numlike(k)?num(k) +/*todo overflowguard*/shift_q:k) in first_t
          },
          deleteProperty(first_t, k){
            delete first_t[numlike(k)?num(k) +/*todo overflowguard*/shift_q:k];return 543
          },
          apply(first_t, t, s){
            first_t.call(t, s)
          },
          construct(first_t, s, t){
            new first_t(...s)
          },
        })
      }
    }
    (_=WrapArray(['a','b','c'])).shift()
    console.log(_.length/*2*/, _[0]/*b*/, _[1]/*c*/, _[2]/*undefined*/)
    

提交回复
热议问题