2014-09-25 15 views
15

Sắp xếp cố gắng ra một số tật trong javascript:Tại sao số + chuỗi một chuỗi trong javascript?

Đầu tiên tôi đã làm

console.log("5" + 1); 

này in 51, điều này là bình thường đúng, cả về số lượng và chuỗi có toán tử +, nhưng kể từ khi chuỗi là biến đầu tiên nó sẽ chuyển đổi 1 thành chuỗi.

Bây giờ khi tôi đã làm điều này:

console.log(1 + "5") 

tôi mong đợi đầu ra là 6, như tôi nghĩ rằng nó sẽ chuyển đổi chuỗi thành một số. Tuy nhiên, kết quả phép thuật là 15.

Có ai có kinh nghiệm hơn trong javascript làm sáng tỏ điều này cho tôi không?

+5

Một sự bổ sung (ngay cả các loại khác nhau) mà theo [luật giao hoán] (http://www.mathsisfun.com/definitions/commutative-law .html) không phải là điều xấu nói chung ;-) – linqu

+2

có thể trùng lặp: http://stackoverflow.com/questions/5961000/javascript-sign-concatenates-instead-of-giving-sum-of-variables (đầu tiên tìm thấy, tôi chắc chắn có rất nhiều ở đó) – rlemon

+2

@linqu Mong rằng nó không * giao hoán vì '" 5 "+ 1 ==" 51 "! =" 15 "== 1 +" 5 "'. – Bakuriu

Trả lời

27

Trích dẫn ECMAScript đặc tả The Addition operator (+) section:

  1. Nếu Kiểu (lprim) là String hay Loại (rprim) là String, sau đó
    Return String đó là kết quả của việc ghép nối ToString (lprim) theo sau bởi ToString (rprim)

Vì vậy, thứ tự không quan trọng ở đây.

+0

Đánh bại tôi với nó ... Nguyên tắc chung là: Nếu bạn thêm một số và một chuỗi, kết quả sẽ là một chuỗi! – Joshpbarron

+0

Aye, một quy tắc kỳ lạ mặc dù –

+5

Tại sao lẻ? Nếu có một chuỗi, thì kết quả sẽ là chuỗi. Dễ nhớ. Nó sẽ là lạ nếu kết quả phụ thuộc vào thứ tự của toán hạng, tôi nghĩ. – dfsq

2

Trong cả hai trường hợp, giá trị sẽ được chuyển đổi thành chuỗi. Khi bạn thêm một số vào một chuỗi hoặc một chuỗi vào một số, kết quả là một chuỗi.

Chỉ cần sử dụng parseInt(value) hoặc toString(value) để buộc chuyển đổi.

+0

Câu trả lời hay, ngoại trừ không có trích dẫn nào! –

-6

Ghép cũng sử dụng + trong Javascript.

var result = "String" + number + obj; 
// is equivalent to 
string result = "String" + number.ToString() + obj.ToString(); 

Tuy nhiên, bạn có thể làm điều tương tự và bạn sẽ nhận được kết quả tương tự - System.Console.WriteLine("result is " + 10 + 20);.

Trong chuỗi JavaScript (và C# cho vấn đề đó) là không thay đổi. Họ không bao giờ có thể thay đổi, chỉ thay thế bằng các chuỗi khác. Bạn có thể biết rằng kết hợp + "String" không trực tiếp sửa đổi biến kết hợp - thao tác tạo ra một chuỗi mới là kết quả của việc nối hai chuỗi lại với nhau, nhưng bạn phải gán chuỗi mới đó cho biến kết hợp nếu bạn muốn nó được thay đổi.

Đối số về cách sử dụng toán tử để thực hiện nối chuỗi được cho là đối số "không chính xác", nhưng cũng có một đối số được thực hiện rằng việc sử dụng + để thực hiện nhiều chuỗi nối có thể rất chậm.

+0

"nhưng cũng có một lập luận được thực hiện rằng việc sử dụng + để thực hiện nhiều chuỗi nối có thể rất chậm." điều này không còn đúng nữa. http://jsperf.com/string-concat-without-sringbuilder/5 mà tôi đã liên kết từ [câu trả lời này] (http://stackoverflow.com/a/4717855/829835) – rlemon

+11

Làm thế nào điều này thậm chí còn trả lời câu hỏi? – nhahtdh

+1

Tôi không hiểu tại sao rất nhiều downvote, đã chỉ đưa ra một lời giải thích đơn giản để OP về câu hỏi của mình! Cái quái gì vậy!! –

8

console.log (1 + "5") Tôi dự kiến ​​đầu ra là 6, như tôi nghĩ nó sẽ chuyển đổi chuỗi thành một số. ...

Nhưng sau đó bạn sẽ mong đợi điều gì nếu bạn đã viết như sau?

console.log(1 + " fine day") 

hoặc

console.log(1 + " answer(s) to my question") 

Không thể có sự bảo đảm như một quy luật chung mà một chuỗi là chuyển đổi thành một số. Nhưng bất kỳ số nào cũng có thể được chuyển đổi thành chuỗi. Đó là lý do tại sao các quy tắc chuyển đổi được viết để chuyển sang loại tương thích. (Trong các ngữ cảnh mà bạn là một lập trình viên biết rằng một chuỗi có thể được chuyển đổi an toàn thành một số, thì bạn có thể làm như vậy một cách rõ ràng để thao tác + nằm giữa hai số. Nhưng điều đó không đúng chung cho các chuỗi.)

Trong các ngữ cảnh khác, đây cũng là lý do tại sao các ints nhỏ và các float chính xác thấp sẽ được chuyển thành các ints lớn hoặc các float chính xác kép khi hoạt động trên các kiểu hỗn hợp mà các kiểu sau. Bạn có thể chuyển đổi một cách an toàn các biểu mẫu giới hạn thành các biểu mẫu lớn hơn, nhưng bạn không thể đi một cách an toàn theo một hướng khác nói chung. Một int nhỏ có thể được biểu diễn như một int lớn hoặc một đôi, nhưng hướng khác thường không phải là một chuyển đổi an toàn.

Vì vậy, quy tắc chuyển đổi cho hoạt động trên các loại hỗn hợp được viết càng nhiều càng tốt để chuyển sang các loại tương thích lẫn nhau là các loại phổ biến an toàn. Nó được để lại cho các lập trình viên để viết chuyển đổi rõ ràng cho các trường hợp đặc biệt, nơi một loại tổng quát hơn có thể được chuyển đổi một cách an toàn thành một loại hạn chế hơn.

1

Bạn có thể thử mã:
console.log(1 + parseInt("5")) => 6

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