Описание аргумента массива вызывает непредвиденную ошибку

Опробовал узел 6.9.0 и написал следующий пример:

'use strict'

function hello (opts) {
  let [ firstName, lastName, age ] = opts
  console.log(`Hello ${firstName} ${lastName}. Glad you're feeling ${age}`)
}
hello({})

В результате я получил:

/Users/hiphipjorge/runnable/blog-posts/november-2016/index.js:6
  let [ firstName, lastName, age ] = opts
                                     ^

TypeError: undefined is not a function
    at hello (/Users/hiphipjorge/runnable/blog-posts/november-2016/index.js:6:38)
    at Object.<anonymous> (/Users/hiphipjorge/runnable/blog-posts/november-2016/index.js:9:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)

На какую undefinedфункцию ссылается ошибка? Могу ли я предоставить массив интерфейса любому объекту для разрушения массива?

1 ответ

  1. Для этого необходимо предоставить объекту генератор итераторов (*[Symbol.iterator]()).

    'use strict'
    
    class KindaSortaLikeAnArray {
      *[Symbol.iterator](){
        yield 1;
        yield 2;
        yield 3;
      }
    }
    
    function hello (opts) {
      let [ firstName, lastName, age ] = opts
      console.log(`Hello ${firstName} ${lastName}. Glad you're feeling ${age}`)
    }
    hello(new KindaSortaLikeAnArray())
    

    Этот итератор может пройти через ключи объекта следующим образом:

    'use strict'
    
    var obj = {
      hello: 'world',
      wow: 'great',
      a: 'b'
    }
    obj[Symbol.iterator] = function*(){
      let keys = Object.keys(this)
      for (let key of keys) {
        yield this[key]
      }
    }
    
    function hello (opts) {
      let [ firstName, lastName, age ] = opts
      console.log(`Hello ${firstName} ${lastName}. Glad you're feeling ${age}`)
    }
    hello(obj)