[英]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.