一行代码实现数组中最大值与最小值的查找
发布于 8 年前 作者 yhc-yhc 10999 次浏览 来自 分享

var values = [1,2,3,4,5,6]; var max = Math.max.apply(Math,values); //求最大值 var min = Math.min.apply(Math,values); //求最小值 ECMA-262对内置对象的定义是:“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”意思就是说,开发人员不必显式地实例化内置对象,因为它们已经实例化了。 内置对象有:Object,Array,Date,RegExp,Function,Boolean,Number,String,Global,Math和JSON,一共11个。 其中String,Number和Boolean为包装对象,对应 字符串,数字和布尔值三种数据类型。

19 回复

直接[1,2,3].max() , 可以吗?

@hanzhong-yan 肯定不行了,数组没有max方法的,调用的是内置对象Math的max方法,建议读下js高级程序设计那本基础书,可以查下js中的call和apply的使用

how about

     var max = values.sort().pop
     var min = values.sort()[0]

even shorter

@russj 你没做测试吧,那样排序是不行的,会把数组的数字转成字符串后再排序,随便写几个数测试下: var values = [1,12,18,23,34,16,5]; values.sort();排序后结果为: [1, 12, 16, 18, 23, 34, 5] 可以看到排序结果并不正确!!! 数组的sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。

正确的做法还需要写一个比较函数,再传到sort里面去排序。

内置对象不止那几个. 既然你提到了String,Array, 那还有Function, Number, Boolean; 然后, 至少还有Date, RegExp,JSON

@yhc-yhc

var values = [1,12,23].sort((a,b) => a-b);
var max = values.pop();
var min = values.shift();

数组必须纯数字吧,有一个字符串就会返回NaN,导致max和min都是NaN

@William17 恩,对的,有人看完全文的每一个字呀

@CarlosRen 是的,是的

@findyourmagic es6都上来了,想问下es6的箭头函数在什么环境中做测试??我一般都是F12,在console里面做测试,可是像let,yiet,控制台好像都不支持呀!!求助

  1. chrome实现的也不少了,可以直接console里测试,let yield是可以用的。
  2. 要么通过babel提供的在线页面 http://babeljs.io/repl/

@yhc-yhc 谢谢!你的写法,我能看懂.我想写的更简洁点!

@hanzhong-yan 恩,一起学习,共同成长!

@hanzhong-yan

//首先
Array.prototype.max = function(){
    return Math.max.apply(Math,this); 
};
//然后就能
[1,2,3].max();

@houfeng 哦,在类上添加了原型方法,不是不建议这样嘛!

内置函数Math.max()Math.min()可以分别找出参数中的最大值和最小值。

Math.max(1, 2, 3, 4); // 4
Math.min(1, 2, 3, 4); // 1

这些函数对于数字组成的数组是不能用的。但是,这有一些类似地方法。

Function.prototype.apply()让你可以使用提供的this与参数组成的_数组(array)_来调用函数。

var numbers = [1, 2, 3, 4];
Math.max.apply(null, numbers) // 4
Math.min.apply(null, numbers) // 1

apply()第二个参数传递numbers数组,等于使用数组中的所有值作为函数的参数。

一个更简单的,基于ES2015的方法来实现此功能,是使用展开运算符.

var numbers = [1, 2, 3, 4];
Math.max(...numbers) // 4
Math.min(...numbers) // 1

此运算符使数组中的值在函数调用的位置展开。

from 每天一条JS小知识 #45

@sjfkai ES2015 是ES6还是ES7?测试了下,我电脑上的谷歌浏览器可以使用…展开运算符呀,不错。就是不知道兼容程序

@yhc-yhc 原po写的是ES2015 但 MDN中显示为ES6

回到顶部