【问题标题】:Javascript arguments.sort() throw error sort is not a functionJavascript arguments.sort() 抛出错误排序不是一个函数
【发布时间】:2015-02-04 00:06:59
【问题描述】:

只是想知道为什么我在使用以下简单的 JavaScript 函数时会出错

function highest(){ 
  return arguments.sort(function(a,b){ 
    return b - a; 
  }); 
}
highest(1, 1, 2, 3);

错误信息:TypeError: arguments.sort 不是函数。

我对参数感到困惑,它是一个数组(我认为)。请帮助并解释原因。非常感谢

【问题讨论】:

  • 那是因为arguments不是一个数组,看看这个demo。这是一个Arguments Object,它的作用就像一个数组。由本机函数返回的许多类似数组的对象也是如此,例如 .getElementsByClassName,它返回一个 HTMLCollection 对象。
  • “我对参数感到困惑,它是一个数组。” arguments 不是一个数组。它有一个长度和索引属性,但如果你检查arguments instanceof Array,你会注意到它是false(还有Object.prototype.toString.call(arguments) === '[object Arguments]')。因此,它没有来自Array.prototype 的方法,包括sort
  • 好吧,这不是数组,我一直认为它是一个数组,因为我做了 arguments[0], arguments[1] 。为什么我会得到否定的结果....但是感谢我为我清除了一切

标签: javascript


【解决方案1】:

因为arguments 没有sort 方法。请注意arguments 不是Array 对象,它是一个类似数组的Arguments object

但是,您可以使用Array.prototype.slicearguments 转换为数组;然后你就可以使用Array.prototype.sort:

function highest(){ 
  return [].slice.call(arguments).sort(function(a,b){ 
    return b - a; 
  }); 
}
highest(1, 1, 2, 3); // [3, 2, 1, 1]

【讨论】:

  • 在现代引擎中,你也可以跳过对数组的转换,直接使用 Array.prototype.sort:[].sort.call( arguments, function(a,b) { ...
  • @Paulpro 我个人不喜欢更改Arguments 对象,我更喜欢使用数组而不是类似数组的对象。但确实,[].sort.call(arguments) 也应该可以工作(根据 IETester 的说法,甚至可以在 IE5.5 上工作)。
  • 谢谢这是我的错,因为我一直认为它是一个数组,当我使用参数 [0] 时,参数 [1]。现在一切都清楚了。
  • 如何对 JSON 数组中的特定属性进行排序?
【解决方案2】:

使用扩展语法将参数转换为真正的数组:

   function highest(...arguments){ 
      return arguments.sort(function(a,b){ 
        return b - a; 
      }); 
   }
   highest(1, 1, 2, 3);

输出:(4) [3, 2, 1, 1]

【讨论】:

    【解决方案3】:

    另一种方法是将参数声明为数组。

    var myArguments = [1, 1, 2, 3];
    var sortedArguments = [];
    

    因此highest()可以定义为;

    function highest(myArguments)
    { 
      return myArguments.sort(function(a,b)
      { 
        return b - a; 
      }); 
    }
    sortedArguments = highest(myArguments); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多