90% những Javascript coder sẽ trả lời sai câu đố đơn giản này
Đầu tiên hãy cùng xem câu hỏi nhé, đơn giản thôi:
123['toString'].length + '123' = ?
Bạn đã nghĩ ra câu trả lời ngay lập tức chứ? Tất nhiên, nó dễ ợt… Mà khoan đã trước khi bạn trả lời. Có lẽ bạn đã quen thuộc với chuyển đổi type, nhưng làm thế nào để chúng ta tính length của hàm toString? Và length của một hàm bình thường được tính như thế nào?
Có thể bạn đã biết (hoặc không)
Trong JavaScript, thuộc tính length của một hàm biểu thị số lượng parameter (đối số) mà hàm mong đợi khi nó được khai báo. Thuộc tính này đếm số lượng parameter mong đợi, không bao gồm toán tử tham số còn lại (…) sau nó, cũng không xem xét các tham số mặc định. Thuộc tính này thường được sử dụng trong reflection và một số tình huống lập trình hàm để hiểu số lượng parameter mà một hàm mong đợi nhận được.
Nghe có vẻ hơi rối rắm nhỉ, hãy cùng tìm hiểu kĩ hơn nhé. Còn về câu trả lời cho câu hỏi kia á, đừng lo, nếu giờ bạn chưa trả lời được thì sau khi đọc bài blog này bạn sẽ có thể làm được dưới sự hướng dẫn của 1 senior Javascript 9 năm kinh nghiệm 😉
Let’s go
Hãy bắt đầu tính length cho các hàm với số lượng parameter khác nhau nhé
1. Hàm không có parameter
function noParams() {}
console.log(noParams.length); // Outputs: 0
Hàm này không có parameter nào nên length của nó là 0
2. Hàm có 1 parameter
function oneParam(a) {}
console.log(oneParam.length); // Outputs: 1
Hàm này có một parameter, nên length của nó là 1.
3. Hàm có nhiều parameter
function multipleParams(a, b, c) {}
console.log(multipleParams.length); // Outputs: 3
Hàm này có 3 parameter, vậy nên length của nó là 3
Dễ quá nhỉ – câu tiếp thôi! Câu tiếp khó và sáng tạo hơn đấy
4. Hàm có nhiều parameter trong đó có defaut value
function defaultParams(a, b = 2, c) {}
console.log(defaultParams.length); // Outputs: 1
Bạn đã có câu trả lời chưa nào. Nếu có rồi thì cùng xem có đúng không nhé.
Khi một hàm có các tham số mặc định, thuộc tính length sẽ đếm đến tham số mặc định đầu tiên. Mặc dù có ba tham số được định nghĩa trong ví dụ này, vì tham số thứ hai là tham số mặc định, giá trị độ dài là 1.
5. Hàm có Rest trong parameter
function restParams(a, b, ...rest) {}
console.log(restParams.length); // Outputs: 2
Đối với các hàm sử dụng toán tử rest parameter
, thuộc tính length chỉ đếm các tham số trước tham số rest
. Trong ví dụ này, mặc dù hàm có thể chấp nhận số lượng tham số vô hạn, giá trị độ dài là 2, chỉ đếm các tham số trước ...rest
.
Những ví dụ này cho thấy rằng thuộc tính length của một hàm cung cấp một cách đơn giản để xem hàm đó mong đợi nhận bao nhiêu tham số, điều này có thể hữu ích trong một số thao tác lập trình.
Trong JavaScript, mọi số đều thừa hưởng các phương thức từ nguyên mẫu Number, bao gồm cả toString. Khi bạn truy cập 123[‘toString’], bạn thực sự đang truy cập phương thức toString của số 123. Thuộc tính .length của một hàm trong JavaScript chỉ ra số lượng tham số mà hàm mong đợi nhận, và vì Number.prototype.toString
có thể nhận một tham số (radix), nên thuộc tính .length của nó là 1.
Bạn có thể xem thêm về toString ở đây
Do đó, trong JavaScript:
123[‘toString’].length sẽ cho ra giá trị 1. Cộng 123 với giá trị này sẽ cho 1 + ‘123’, kết quả là ‘1123’. Vì vậy, 123['toString'].length + '123'
sẽ cho ra kết quả ‘1123’.
Chúc mừng bạn đã trả lời đúng hoặc học được thêm 1 điều mới trong thế giới Javascript đầy kì diệu này. Hẹn gặp lại các bạn ở một blog khác nhé!