{"action":"opened","issue":{"url":"https://api.github.com/repos/mqyqingfeng/Blog/issues/35","repository_url":"https://api.github.com/repos/mqyqingfeng/Blog","labels_url":"https://api.github.com/repos/mqyqingfeng/Blog/issues/35/labels{/name}","comments_url":"https://api.github.com/repos/mqyqingfeng/Blog/issues/35/comments","events_url":"https://api.github.com/repos/mqyqingfeng/Blog/issues/35/events","html_url":"https://github.com/mqyqingfeng/Blog/issues/35","id":243904385,"number":35,"title":"JavaScript专题之如何求数组的最大值和最小值","user":{"login":"mqyqingfeng","id":11458263,"avatar_url":"https://avatars3.githubusercontent.com/u/11458263?v=4","gravatar_id":"","url":"https://api.github.com/users/mqyqingfeng","html_url":"https://github.com/mqyqingfeng","followers_url":"https://api.github.com/users/mqyqingfeng/followers","following_url":"https://api.github.com/users/mqyqingfeng/following{/other_user}","gists_url":"https://api.github.com/users/mqyqingfeng/gists{/gist_id}","starred_url":"https://api.github.com/users/mqyqingfeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mqyqingfeng/subscriptions","organizations_url":"https://api.github.com/users/mqyqingfeng/orgs","repos_url":"https://api.github.com/users/mqyqingfeng/repos","events_url":"https://api.github.com/users/mqyqingfeng/events{/privacy}","received_events_url":"https://api.github.com/users/mqyqingfeng/received_events","type":"User","site_admin":false},"labels":[{"id":618327137,"url":"https://api.github.com/repos/mqyqingfeng/Blog/labels/%E4%B8%93%E9%A2%98%E7%B3%BB%E5%88%97","name":"专题系列","color":"0071b5","default":false}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2017-07-19T02:23:58Z","updated_at":"2017-07-19T02:23:58Z","closed_at":null,"body":"## 前言\r\n\r\n取出数组中的最大值或者最小值是开发中常见的需求，但你能想出几种方法来实现这个需求呢？\r\n\r\n## Math.max\r\n\r\nJavaScript 提供了 Math.max 函数返回一组数中的最大值，用法是：\r\n\r\n```js\r\nMath.max([value1[,value2, ...]])\r\n```\r\n\r\n值得注意的是：\r\n\r\n1. 如果有任一参数不能被转换为数值，则结果为 NaN。\r\n2. max 是 Math 的静态方法，所以应该像这样使用：Math.max()，而不是作为 Math 实例的方法 (简单的来说，就是不使用 new )\r\n3. 如果没有参数，则结果为 `-Infinity` (注意是负无穷大)\r\n\r\n而我们需要分析的是：\r\n\r\n1.如果任一参数不能被转换为数值，这就意味着如果参数可以被转换成数字，就是可以进行比较的，比如：\r\n\r\n```js\r\nMath.max(true, 0) // 1\r\nMath.max(true, '2', null) // 2\r\nMath.max(1, undefined) // NaN\r\nMath.max(1, {}) // NaN\r\n```\r\n\r\n2.如果没有参数，则结果为 -Infinity，对应的，Math.min 函数，如果没有参数，则结果为 Infinity，所以：\r\n\r\n```js\r\nvar min = Math.min();\r\nvar max = Math.max();\r\nconsole.log(min > max);\r\n```\r\n\r\n了解了 Math.max 方法，我们以求数组最大值的为例，思考有哪些方法可以实现这个需求。\r\n\r\n## 原始方法\r\n\r\n最最原始的方法，莫过于循环遍历一遍：\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\n\r\nvar result = arr[0];\r\nfor (var i = 1; i < arr.length; i++) {\r\n    result =  Math.max(result, arr[i]);\r\n}\r\nconsole.log(result);\r\n```\r\n\r\n## reduce\r\n\r\n既然是通过遍历数组求出一个最终值，那么我们就可以使用 reduce 方法：\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\n\r\nfunction max(prev, next) {\r\n    return Math.max(prev, next);\r\n}\r\nconsole.log(arr.reduce(max));\r\n```\r\n\r\n## 排序\r\n\r\n如果我们先对数组进行一次排序，那么最大值就是最后一个值：\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\n\r\narr.sort(function(a,b){return a - b;});\r\nconsole.log(arr[arr.length - 1])\r\n```\r\n\r\n## eval\r\n\r\nMath.max 支持传多个参数来进行比较，那么我们如何将一个数组转换成参数传进 Math.max 函数呢？eval 便是一种\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\n\r\nvar max = eval(\"Math.max(\" + arr + \")\");\r\nconsole.log(max)\r\n```\r\n\r\n## apply\r\n\r\n使用 apply 是另一种。\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\nconsole.log(Math.max.apply(null, arr))\r\n```\r\n\r\n## ES6 ...\r\n\r\n使用 ES6 的扩展运算符：\r\n\r\n```js\r\nvar arr = [6, 4, 1, 8, 2, 11, 23];\r\nconsole.log(Math.max(...arr))\r\n```\r\n\r\n有更多的方法欢迎留言哈~\r\n\r\n## 专题系列\r\n\r\nJavaScript专题系列目录地址：[https://github.com/mqyqingfeng/Blog](https://github.com/mqyqingfeng/Blog)。\r\n\r\nJavaScript专题系列预计写二十篇左右，主要研究日常开发中一些功能点的实现，比如防抖、节流、去重、类型判断、拷贝、最值、扁平、柯里、递归、乱序、排序等，特点是研(chao)究(xi) underscore 和 jQuery 的实现方式。\r\n\r\n如果有错误或者不严谨的地方，请务必给予指正，十分感谢。如果喜欢或者有所启发，欢迎 star，对作者也是一种鼓励。"}}
{"actor":{"display_login":"mqyqingfeng"}}