Nó không làm việc như mong muốn trong tất cả các trường hợp ... Vấn đề là .toString
dự kiến sẽ trả về một chuỗi, vì vậy phương pháp chuỗi trong việc thực hiện cung cấp, sẽ không hoạt động, e. g. sum(2)(3).split()
sẽ gây ra lỗi.
Mặc dù chúng tôi có thể giả định kết quả sum()
sẽ luôn được mong đợi là một số, nhưng có thể không đúng trong một số trường hợp và có thể khó gỡ lỗi, e. g. Tôi nhận thấy vấn đề khi tôi đã thử nghiệm mã ban đầu được viết với .toString
chỉ trên jsbin.com (nó split
trên đối số console.log nội bộ, ghi đè nó).
Thay vào đó, .toString
sẽ trông giống như return String(result);
. Điều tốt là .toString
(khi không có .valueOf
hoặc hiện đại Symbol.toPrimitive
) sẽ xử lý chuyển đổi nguyên thủy, do đó, mã mong đợi một Số cũng sẽ hoạt động. Vấn đề có thể xảy ra ở đây có thể là chuyển đổi "gấp đôi" do điều này.
Giải pháp tốt hơn có thể là sử dụng một trong hai cặp .toString
và .valueOf
hoặc chỉ một Symbol.toPrimitive
nếu bạn chỉ nhắm mục tiêu các trình duyệt hiện đại.
Ví dụ sử dụng Symbol.toPrimitive
:
function sum(a) {
let result = a;
function f(b) {
result += b;
return f;
}
f[Symbol.toPrimitive] = hint => hint === 'string' ? String(result) : result;
return f;
}
Ví dụ sử dụng .toString
và .valueOf
cặp.
function sum(a) {
var result = a;
function f(b) {
result += b;
return f;
}
// avoiding double conversion which will happen in case of .toString
f.valueOf = function() { return result; };
f.toString = function() { return String(result); };
return f;
}
Nguồn
2017-09-30 15:54:43
Về cơ bản trong tổng cảnh báo đầu tiên (1) (2) là a & b và trong cảnh báo thứ hai là tổng (6) (- 1) (2) bây giờ cách hàm hiểu rằng (2) cũng là f (b) tranh luận. – PCA
@Babu loại bỏ suy nghĩ của a và b. Bạn có thể nghĩ rằng 'sum()' được gọi một lần, khởi tạo 'var sum' và sau đó nhận được overriden sau cuộc gọi đầu tiên, xử lý từng cuộc gọi liên tiếp bằng cách gọi' f (b) '(vì f chính nó mỗi lần trả về chính nó, do đó làm cho nó có thể làm thêm chuỗi) chức năng trừ khi một bối cảnh chuỗi xảy ra. Rõ ràng hơn bây giờ? – Christoph
giải thích tuyệt vời. Bạn có thể vui lòng cho tôi biết thay vì f.toString bạn có thể chỉ cho tôi mã để trả lại số tiền trực tiếp không. chức năng sum (a) { var sum = a hàm f (b) { sum + = b trở lại sum } // f.toString = function() {return sum} trở lại f } tổng (1) (2); – PCA