Skip to content

Latest commit

 

History

History
99 lines (88 loc) · 2.74 KB

Flexible Arguments.md

File metadata and controls

99 lines (88 loc) · 2.74 KB

Flexible Arguments

  1. 使用数量可变的参数对我们有利

    function merge (root) {
      for (var i = 1; i < arguments.length; i++) {
        for (var key in arguments[i]) {
          root[key] = arguments[i][key]
        }
      }
      return root
    }
    var merged = merge({name: 'john'}, {city: 'boston'})
    console.log(merged.name === 'john', '原始name原封不动')
    console.log(merged.city === 'boston', 'city已经被复制了')
    // true '原始name原封不动'
    // true 'city已经被复制了'
  2. 我们怎么在数组中找到最大最小值?

    function smallest (array) {
      // ES5
      return Math.min.apply(Math, array)
      // ES6
      return Math.min(...array)
    }
    function largest (array) {
      // ES5
      return Math.max.apply(Math, array)
      // ES6
      return Math.max(...array)
    }
    console.log(smallest([0, 1, 2, 3]) === 0, '定位最小值')
    console.log(largest([0, 1, 2, 3]) === 3, '定位最大值')
    // true '定位最小值'
    // true '定位最大值'
  3. 另外一种可以的方式

    // 其实就是利用arguments对象
    function smallest () {
      return Math.min.apply(Math, arguments)
    }
    function largest () {
      return Math.max.apply(Math, arguments)
    }
    console.log(smallest(0, 1, 2, 3) === 0, '定位最小值')
    console.log(largest(0, 1, 2, 3) === 3, '定位最大值')
    // true '定位最小值'
    // true '定位最大值'
  4. 为什么这里出错?

    function highest () {
      // 会报错,因为arguments对象是一个array-like对象,并不是一个array,没有array方法
      return arguments.sort(function (a, b) {
        return b - a
      })
    }
    console.log(highest(1, 1, 2, 3)[0] === 3, '拿到最高值')
    // arguments.sort is not a function
  5. 我们必须将类 array 对象转成实际的 array

    function highest () {
      return makeArray(arguments).slice(1).sort(function (a, b) {
        return b - a
      })
    }
    function makeArray (array) {
      // 这里的Array()等同于[]
      return Array().slice.call(array)
    }
    console.log(highest(1, 1, 2, 3)[0] === 3, '拿到最高值')
    console.log(highest(3, 1, 2, 3, 4, 5)[1] === 4, '校验结果')
    // true '拿到最高值'
    // true '校验结果'
  6. 我们可以使用 callapply 去实现一个乘法函数

    function multiMax (multi) {
      // 此处multi默认代表第一参
      var allButFirst = Array().slice.call(arguments, 1)
      var largestAllButFirst = Math.max.apply(Math, allButFirst)
      return multi * largestAllButFirst
    }
    console.log(multiMax(3, 1, 2, 3) === 9, '3*3=9')
    // true '3*3=9'