01/10/2018, 11:15

Cho em hỏi về hàm SORT trong javascript ạ

Em có đoạn code sau ạ:

 // xây dựng một object Person
 function Person(id, name){
      this.id = id;
      this.name = name;
      // override phương thức toString
      this.toString = function(){
           return this.name;
      };
 }
 // khởi tạo mảng
 var arrayPerson = [];
 arrayPerson.push(new Person(1, "Jackie"));
 arrayPerson.push(new Person(2, "Anna"));
 arrayPerson.push(new Person(3, "Avi"));
 // sort
 alert(arrayPerson.sort());

Ở đây theo em hiểu, thì ban đầu em có một object , obj đó có 2 attribute và 1 phương thức , sau đó mình tạo một mảng trống, và thêm vào mảng đó cái obj (được tạo từ obj cũ ở trên)
Rồi cuối cùng là alert ra mảng đó, theo suy nghĩ lúc đầu, em lại cứ tưởng là nó sẽ phải trả về kiểu như {object}{object}{object} nhưng hình như khi gọi hàm sort , mảng đã “tự ý” gọi phương thức của từng phần tử obj con đúng không ạ , mọi người giúpem với , em ngồi search gg cả ngày hôm nay rồi :’(

Vô Thin viết 13:24 ngày 01/10/2018

Trong JavaScript thì Array cũng là Object, Object cũng là Array, và function cũng là hai cái của quý này luôn. Cho nên, tốt hơn hết là thử dùng typeof xem nó đang là cái quái quỉ gì.

*grab popcorn* viết 13:15 ngày 01/10/2018


Nếu bạn muốn biết hàm nó hoạt động như thế nào thì bạn đầu tiên coi kiểu của biến gọi hàm đó là gì
Ví dụ arrayPerson là Array
Sau đó thêm .prototype vô -> Array.prototype và cuối cùng là .[tên hàm]
~> Array.prototype.sort

Sau khi đc keyword trên, bạn search là sẽ ra reference và khuyên bạn đọc ở developer.mozilla.org


Còn đây là câu trả lời:

If compareFunction is not supplied, elements are sorted by converting them to strings and comparing strings in Unicode code point order. For example, “Banana” comes before “cherry”. In a numeric sort, 9 comes before 80, but because numbers are converted to strings, “80” comes before “9” in Unicode order.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Ngắn gọn là hàm sort mặc định sẽ đổi sang string các giá trị trong mảng rồi so sánh chuỗi đó.
Lớp Person override hàm toString trả về name. -> Khi này hàm sort sẽ so sánh theo name.

Nếu bạn bỏ this.toString = … thì sẽ ra đc như bạn dự đoán.

Thành Long viết 13:29 ngày 01/10/2018

dạ là có phải mặc định khi chạy hàm sort thì hàm toString sẽ tự động chạy đúng không ạ , và tác giả của đoạn code đó đã override lên nó nên nó chỉ convert name thành string rồi so sánh bằng string thôi đúng không anh, huhu thế mà cả ngày hôm qua em đau não vì nó

Thành Long viết 13:18 ngày 01/10/2018

anh ơi cho em hỏi thêm về mình muốn coi cả structure của hàm mình vào đâu anh nhỉ , kiểu như hàm sort,ví dụ như:
function sort(a,b){
return bla bla bla;
}
thì em coi ở dâu ạ

Thành Long viết 13:26 ngày 01/10/2018

với cả hàm sort được sử dụng bubble sort hay loại sort nào vậy anh

*grab popcorn* viết 13:17 ngày 01/10/2018

Tùy vào JS Engine mà sẽ có cách sort khác nhau
Như Gecko mình search thử thì ra Merge Sort (Xem source ở đây)
V8 thì kết hợp InsertionSort and QuickSort (Xem ở đây)

Muốn coi hàm mặc định của các engine thì theo mình chỉ có nước là nhúng tay mò source thôi ~.~ (2 link trên đấy)

Bài liên quan
0