2016-03-15 22 views
5

Tôi đang cố gắng để hiểu hành vi này:Tại sao kết quả Ngày thêm vào một chuỗi?

var d = new Date(); 

console.log(+d); // 1458049171381 
console.log(1 + d); // '1Tue Mar 15 2016 09:39:31 GMT-0400 (EDT)' 

Ngược lại với:

var obj = { 
    valueOf: function() { 
    return 123; 
    } 
}; 

console.log(+obj); // 123 
console.log(1 + obj); // 124 

Tại sao kết quả Date Ngoài ra trong một string khi Date.prototype.valueOf trả về một number?

Dưới đây là bản dịch ngây thơ của Addition Operator's spec JavaScript

function ToPrimitive(x) { 
    return x.valueOf(); 
} 

function IsString(x) { 
    return typeof x === 'string'; 
} 

function ToString(x) { 
    return x.toString(); 
} 

function ToNumber(x) { 
    try { 
    return parseFloat(x); 
    } catch (e) { 
    return NaN; 
    } 
} 

function AdditionOperator(lval, rval) { 

    let lprim = ToPrimitive(lval); 
    let rprim = ToPrimitive(rval); 

    if (IsString(lprim) || IsString(rprim)) { 
    return ToString(lprim) + ToString(rprim); 
    } else { 
    return ToNumber(lprim) + ToNumber(rprim); 
    } 
} 

Tuy nhiên, nếu tôi gọi này với một đối tượng Date, nó sẽ trả về một giá trị số:

AdditionOperator(new Date(), 1) // 1458049347088 

Ai đó có thể làm sáng tỏ về điều này?

+0

bạn đã đọc CHÚ THÍCH 1 chưa? – Hacketo

+0

@ Hacketo/facepalm ... Tôi sẽ chấp nhận câu trả lời của bạn nếu bạn đăng bài. –

+0

@iliacholy ya i đã sai. Đó là một quan niệm sai lầm. Cảm ơn ví dụ. –

Trả lời

4

Walk-through:

  • Trước khi việc bổ sung diễn ra, cả hai bên trái và các giá trị đúng của hoạt động nhị phân được chuyển đổi thành nguyên thủy (string hoặc number).

  • Tùy thuộc vào ngữ cảnh của giá trị, nó có thể được cung cấp 'gợi ý' cho biết loại nguyên thủy nào sẽ trở thành.

  • Nếu không có gợi ý nào được cung cấp, nó sẽ mặc định theo loại ưa thích của nó. Tất cả Object s có loại ưa thích là number ngoại trừ Date, thích string (và làm lẫn lộn mọi người).

Theo spec

Tất cả các đối tượng tiêu chuẩn ngoại trừ đối tượng ngày xử lý sự vắng mặt của một gợi ý như Number gợi ý được đưa ra; Các đối tượng ngày xử lý sự vắng mặt của một gợi ý như thể chuỗi gợi ý đã được đưa ra. Các đối tượng kỳ lạ có thể xử lý sự vắng mặt của một số cách khác theo cách khác.

Và trong trường hợp ngày họ thực hiện một exception

Trong số các đối tượng được định nghĩa trong đặc tả này chỉ ngày đối tượng (xem 20.3.4.45) và các đối tượng Symbol (xem 19.4.3.4) over-ride hành vi ToPrimitive mặc định. Đối tượng ngày xử lý không có gợi ý như thể gợi ý là Chuỗi.

Ngoài ra, kiểm tra this

Chức năng này được gọi bởi các nhà khai thác ngôn ngữ ECMAScript để chuyển đổi một đối tượng ngày đến một giá trị nguyên thủy. Các giá trị được phép cho gợi ý là "mặc định", "số" và "chuỗi".Đối tượng ngày tháng, là duy nhất trong số đối tượng ECMAScript tích hợp ở chỗ chúng xử lý "mặc định" là tương đương với "chuỗi", Tất cả các đối tượng ECMAScript tích hợp khác xử lý "mặc định" tương đương với "số".

Vì vậy, ngày được sử dụng làm chỉ chuỗi.

Các vấn đề liên quan