[英]JS code understanding
var arr = [
"rohan",
"markandeya",
"hanumante",
"sapan",
"Ritesh"
];
Array.prototype.longest=function() {
return this.sort(
function(a,b) {
if (a.length > b.length) return -1;
if (a.length < b.length) return 1;
return 0
}
)[0];
}
alert(arr.longest());
需要逐行理解上面的代码。 我完全没有得到 function(a,b) 部分任何人都可以解释它。
var arr = [
"rohan",
"markandeya",
"hanumante",
"sapan",
"Ritesh"
];
这定义了一个字符串数组并将其分配给变量arr
Array.prototype.longest=function() {
return this.sort(
function(a,b) {
if (a.length > b.length) return -1;
if (a.length < b.length) return 1;
return 0
}
)[0];
}
这将创建一个longest
的新函数并将其添加到Array
的prototype
中。 简而言之,添加到原型中可以使应用程序中任何具有Array
类型的对象都可以使用新函数。 例如,您现在可以调用arr.longest()
如代码的最后一行所示:(因为arr
是Array
类型)
alert(arr.longest());
现在是有趣的部分。 Array.prototype
已经包含一个sort
函数。 此函数需要一个compare function
的参数。 换句话说,您必须通过描述如何比较两个项目以查看哪个项目在排序过程中首先出现来定义数组中的项目如何排序。 这个函数在这里定义为:
function(a,b) {
if (a.length > b.length) return -1;
if (a.length < b.length) return 1;
return 0
}
现在,正如我所说, Array.prototype.sort
需要一个排序回调。 此回调应返回 0、1 或 -1 以指示应排序的两个项目(此处命名为a
和b
,但这些名称是任意的)的顺序。
从阅读这个函数来看,这些项目似乎是按属性length
排序的。 由于您的数组arr
是一个字符串数组,并且字符串有一个length
属性,所以这很好用。
那么为什么是 0、1 或 -1? 来自MDN:Array.prototype.sort() :(点击链接了解更多信息)
如果提供了 compareFunction,则数组元素将根据比较函数的返回值进行排序。 如果 a 和 b 是要比较的两个元素,则:
如果 compareFunction(a, b) 小于 0,则将 a 排序到比 b 低的索引,即 a 在前。
如果 compareFunction(a, b) 返回 0,则使 a 和 b 彼此保持不变,但相对于所有不同元素进行排序。 注意:ECMAscript 标准不保证这种行为,因此并非所有浏览器(例如至少可以追溯到 2003 年的 Mozilla 版本)都尊重这一点。
如果 compareFunction(a, b) 大于 0,则将 b 排序到比 a 低的索引。
当给定一对特定的元素 a 和 b 作为它的两个参数时,compareFunction(a, b) 必须始终返回相同的值。 如果返回不一致的结果,则排序顺序未定义。
我错过了一些重要的代码细节:
函数longest
不只是对数组进行排序。 当我第一次发布我的答案时,我阅读了这部分。 如果我们看下面的片段:
return this.sort(
function(a,b) {
if (a.length > b.length) return -1;
if (a.length < b.length) return 1;
return 0
}
)[0];
注意return
和[0]
部分。 正如我所解释的, this.sort
将根据字符串长度(最长的在前)对数组arr
排序。 然后,排序函数的结果的第一项被[0]
取走。 第一项是最长的,因为数组已排序。 然后由函数longest
返回。 因此,实际上, longest
函数返回数组中最长的字符串,首先按长度对该数组进行排序,然后返回该排序数组中的第一项(索引为 0)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.