Cách tốt nhất để chuyển đổi một số thành một chuỗi trong JavaScript là gì?


517

Cách "tốt nhất" để chuyển đổi một số thành một chuỗi (về lợi thế tốc độ, lợi thế rõ ràng, lợi thế bộ nhớ, v.v.) là gì?

Vài ví dụ:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

Câu trả lời:


516

như thế này:

var foo = 45;
var bar = '' + foo;

Trên thực tế, mặc dù tôi thường làm như thế này vì đơn giản, nhưng hơn 1000 lần lặp lại nó xuất hiện với tốc độ thô có một lợi thế cho.toString()

Xem Kiểm tra hiệu suất tại đây (không phải bởi tôi, nhưng được tìm thấy khi tôi tự viết): http://jsben.ch/#/ghQYR

Nhanh nhất dựa trên thử nghiệm JSPerf ở trên: str = num.toString();

Cần lưu ý rằng sự khác biệt về tốc độ không quá đáng kể khi bạn cho rằng nó có thể thực hiện chuyển đổi theo bất kỳ cách nào 1 triệu lần trong 0,1 giây .

Cập nhật: Tốc độ dường như khác nhau rất nhiều bởi trình duyệt. Trong Chrome num + ''dường như là nhanh nhất dựa trên thử nghiệm này http://jsben.ch/#/ghQYR

Cập nhật 2: Một lần nữa dựa trên thử nghiệm của tôi ở trên, cần lưu ý rằng Firefox 20.0.1 thực thi .toString()chậm hơn khoảng 100 lần so với '' + nummẫu.


58
Có những trường hợp chuyển đổi có thể không trả về một câu trả lời thích hợp hơn: '' + 123e-50trả về "1.23e-48".
hongymagic

21
@hongymagic: câu trả lời đó thực tế là có thể hiểu được: con số không quan tâm cũng như không biết nó được nhập như thế nào và đại diện được in tiêu chuẩn có chính xác một chữ số trước dấu chấm.
Svante

4
Tôi đã chạy thử nghiệm trong jsben.ch/ghQYR , mỗi lần nó cho tôi thấy một kết quả khác nhau!
Maryam Saeidi

2
Tôi thích câu trả lời này vì null fookhông ném lỗi.
ttugates

2
@MaryamSaeidi: Sử dụng drublic 's jsperf.com thử nghiệm trên dường như phù hợp hơn.
Giraldi

364

Theo ý kiến ​​của tôi n.toString(), giải thưởng cho sự rõ ràng của nó và tôi không nghĩ rằng nó mang thêm bất kỳ chi phí nào.


Nó mang một số chi phí mặc dù nó không đáng kể trong các phiên bản trình duyệt gần đây. Trong Firefox Quantum ít nhất
peterchaula

11
Điều này là không an toàn. n có thể là null hoặc không xác định.
david.pfx

20
@ david.pfx câu hỏi hỏi làm thế nào để chuyển đổi giá trị số thành chuỗi. Cung cấp các ví dụ về các giá trị không phải số (ví dụ null, undefined) mà không làm việc với câu trả lời này hầu như không làm cho nó "không an toàn".
Michael Martin-Smucker

5
@ MichaelMartin-Smucker: Nếu bạn viết nhiều JS bạn nhận ra rằng mọi thứ hiếm khi bị cắt và làm khô. Câu hỏi đã được mở và IMO một câu trả lời tốt ít nhất phải thừa nhận vấn đề của một chuỗi thực sự là null hoặc không xác định. YMMV.
david.pfx

@ david.pfx Tôi đã viết RẤT NHIỀU js và tôi không nhớ lần cuối cùng tôi cần một số là một chuỗi và bất cứ điều gì ngoại trừ một số như một chuỗi sẽ có hiệu lực. Đây là câu trả lời chính xác. Không có câu trả lời cho việc xử lý nullhoặc undefinedvì nó là ứng dụng cụ thể, trong khi tôi tưởng tượng (n || defaultNumber).toString() là điều mà hầu hết mọi người sẽ muốn trong tình huống như vậy, tôi hoàn toàn không đồng ý chúng ta nên đưa nó vào tất cả các câu hỏi. Đây là về việc chuyển đổi số thành chuỗi, kiến ​​trúc tốt và chuyển đổi loại khác khi cần là những bài học riêng biệt.
George Reith

73

Chuyển đổi rõ ràng rất rõ ràng đối với người mới sử dụng ngôn ngữ này. Sử dụng kiểu ép buộc, như những người khác đã đề xuất, dẫn đến sự mơ hồ nếu một nhà phát triển không nhận thức được các quy tắc cưỡng chế. Cuối cùng, thời gian dành cho nhà phát triển tốn kém hơn thời gian của CPU, vì vậy tôi sẽ tối ưu hóa cho cái trước với chi phí sau. Điều đó đang được nói, trong trường hợp này sự khác biệt có thể không đáng kể, nhưng nếu không chắc chắn tôi có một số máy nén JavaScript tốt sẽ tối ưu hóa loại điều này.

Vì vậy, vì những lý do trên tôi sẽ đi với: n.toString()hoặc String(n). String(n)có lẽ là một lựa chọn tốt hơn bởi vì nó sẽ không thất bại nếu nlà null hoặc không xác định.


12
Câu hỏi là về chuyển đổi số, không phải về chuyển đổi số, hoặc null, hoặc undefined. Nếu nnullhoặc undefineddo lỗi trong chương trình của tôi, thì tôi muốn chương trình của mình thất bại ở trạng thái này, để cho tôi cơ hội tốt hơn trong việc tìm và sửa lỗi. Sự cố chương trình là quà tặng cho lập trình viên, để giúp cô ấy tìm ra lỗi :-). Thay thế là cung cấp phần mềm không hoạt động như thiết kế, đã cẩn thận che giấu các lỗi. Vì vậy, tôi không phải là một fan hâm mộ của việc sử dụng String(n)để che giấu một lỗi.
Matt Wallis

1
String(n)là tốt để sử dụng trong một phong cách chức năng, ví dụ với sự kết hợp của gạch dưới _.compose(funcThatNeedsAStringParam, String).
Rik Martins

2
Chuỗi (null) sẽ không sập progam, nhưng nó sẽ trả về chuỗi ký tự "null", đây có thể không phải là điều bạn muốn. Nếu dữ liệu hợp pháp có thể là null, thì bạn cần xử lý nó một cách rõ ràng.
Peter Smartt

1
@MattWallis Tôi nghĩ đó phải là quyết định của nhà phát triển chứ không phải người trả lời, bạn có nghĩ vậy không?
forresthopkinsa

30

... Trình phân tích cú pháp của JavaScript cố phân tích ký hiệu dấu chấm trên một số dưới dạng chữ nổi.

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

Nguồn


17

Lưỡi trong rõ ràng:

var harshNum = 108;
"".split.call(harshNum,"").join("");

Hoặc trong ES6, bạn có thể chỉ cần sử dụng các chuỗi mẫu :

var harshNum = 108;
`${harshNum}`;

Nếu tôi chạy các điểm chuẩn với các mẫu ES6, đôi khi nó thậm chí còn chứng minh là nhanh hơn '' + numberphương thức. Điều này cho biết, kết quả của các điểm chuẩn này thay đổi rất nhiều khi thực hiện chúng nhiều lần nên không chắc chắn liệu chúng có nên được thực hiện quá nghiêm trọng hay không.
Nico Van Belle

15

Các câu trả lời khác đã bao gồm các tùy chọn khác, nhưng tôi thích câu trả lời này:

s = `${n}`

Ngắn gọn, súc tích, đã được sử dụng ở nhiều nơi khác (nếu bạn đang sử dụng phiên bản khung / ES hiện đại), vì vậy đây là một sự an toàn mà bất kỳ lập trình viên nào cũng sẽ hiểu.

Không phải là nó (thường) quan trọng lắm, nhưng nó cũng có vẻ là một trong những cách nhanh nhất so với các phương pháp khác .


Nó cũng an toàn nếu n có thể không phải là một số.
david.pfx

Nhưng n.toString()sau đó, phải không?
amn

1
@amn nếu nundefinednó sẽ ném một lỗi cú pháp bằng cách sử dụng.toString()
Jee Mok

Không phải điều này chỉ cho kết quả giống như String(n)trong mọi trường hợp sao? Sự khác biệt duy nhất là nó ít rõ ràng hơn.
Bennett McElwee

Và chậm hơn nhiều.
Adrian Bartholomew

12

Cách đơn giản nhất để chuyển đổi bất kỳ biến nào thành một chuỗi là thêm một chuỗi rỗng vào biến đó.

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
Lưu ý rằng nó cần phải nằm trong parens: (5.41 + '')để sử dụng các phương thức String như .substring()và các phương thức khác
Gjaa

Tại sao điều đó cần phải được lưu ý?
Adrian Bartholomew

7

Nếu bạn cần định dạng kết quả theo một số vị trí thập phân cụ thể , ví dụ để đại diện cho tiền tệ, bạn cần một cái gì đó giống như toFixed()phương thức.

number.toFixed( [digits] )

digits là số chữ số sẽ hiển thị sau vị trí thập phân.


2
Không an toàn trừ khi bạn biết đó là một con số.
david.pfx

6

Tôi đã sử dụng https://jsperf.com để tạo trường hợp thử nghiệm cho các trường hợp sau:

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-opes-conversion-speed-comparison

Kể từ ngày 24 tháng 7 năm 2018, kết quả nói rằng number + '' là tốc độ nhanh nhất trong Chrome, trong Firefox có mối quan hệ với các chuỗi ký tự mẫu.

Cả hai String(number), và number.toString()chậm hơn khoảng 95% so với tùy chọn nhanh nhất.

kiểm tra hiệu suất, mô tả ở trên


2

Tôi thích hai cái đầu tiên vì chúng dễ đọc hơn. Tôi có xu hướng sử dụngString(n) nhưng nó chỉ là một vấn đề của phong cách hơn bất cứ điều gì khác.

Đó là trừ khi bạn có một dòng như

var n = 5;
console.log ("the number is: " + n);

đó là rất tự giải thích


2

Tôi nghĩ nó phụ thuộc vào tình huống nhưng dù sao bạn cũng có thể sử dụng .toString()phương pháp này vì nó rất rõ ràng để hiểu.


2

.toString () là chức năng typecasting tích hợp, tôi không phải là chuyên gia về chi tiết đó nhưng bất cứ khi nào chúng ta so sánh các phương pháp luận rõ ràng về kiểu đúc sẵn, các cách giải quyết tích hợp luôn được ưu tiên.


1

Nếu tôi phải cân nhắc mọi thứ, tôi sẽ đề nghị làm theo

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO, cách nhanh nhất để chuyển đổi thành chuỗi. Đúng nếu tôi đã sai lầm.


1

Giải pháp hợp lệ duy nhất cho hầu hết các trường hợp hiện tại và tương lai có thể có (đầu vào là số, null, không xác định, Biểu tượng, bất cứ điều gì khác) làString(x) . Không sử dụng 3 cách cho hoạt động đơn giản, dựa trên các giả định loại giá trị, như "ở đây tôi chuyển đổi số chắc chắn thành chuỗi và ở đây chắc chắn là boolean thành chuỗi".

Giải trình:

String(x) xử lý null, không xác định, Ký hiệu, [bất cứ thứ gì] và các cuộc gọi .toString() cho các đối tượng.

'' + x các cuộc gọi .valueOf() trên x (truyền tới số), ném vào Biểu tượng, có thể cung cấp kết quả phụ thuộc thực hiện.

x.toString() ném vào null và không xác định.

Lưu ý: String(x)vẫn sẽ thất bại trên các đối tượng không có nguyên mẫu như Object.create(null).

Nếu bạn không thích các chuỗi như 'Xin chào, không xác định' hoặc muốn hỗ trợ các đối tượng không có nguyên mẫu, hãy sử dụng chức năng chuyển đổi loại sau:

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

Với số bằng chữ, dấu chấm để truy cập thuộc tính phải được phân biệt với dấu thập phân. Điều này để lại cho bạn các tùy chọn sau nếu bạn muốn gọi String () trên số theo nghĩa đen 123:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

Dưới đây là các phương thức để chuyển đổi một số nguyên thành chuỗi trong JS

Các phương pháp được sắp xếp theo thứ tự hiệu suất giảm dần.

(Kết quả kiểm tra hiệu suất được đưa ra bởi @DarckBlezzer trong câu trả lời của anh ấy)

var num = 1

Cách 1:

num = `$ {num}`

Cách 2:

num = num + ''

Cách 3:

num = Chuỗi (num)

Cách 4:

num = num.toString ()

Lưu ý: Bạn không thể gọi trực tiếp chuỗi () từ một số

Ví dụ: 2.toString () sẽ ném Uncaught SyntaxError : Mã thông báo không hợp lệ hoặc không mong muốn


0

Nếu bạn tò mò về việc ai là người thực hiện nhiều nhất, hãy kiểm tra xem tôi sẽ so sánh tất cả các chuyển đổi Số -> Chuỗi khác nhau.

Hình như 2+''hoặc 2+""là nhanh nhất.

https://jsperf.com/int-2- chuỗi


0

Chúng ta cũng có thể sử dụng hàm tạo String . Theo tiêu chuẩn này, đây là cách nhanh nhất để chuyển đổi Số thành Chuỗi trong Firefox 58 mặc dù tốc độ chậm hơn so với " + numtrình duyệt phổ biến Google Chrome.


0

Phương pháp toFixed()cũng sẽ giải quyết mục đích.

var n = 8.434332;
n.toFixed(2)  // 8.43

0

Bạn có thể gọi Numberđối tượng và sau đó gọi toString().

Number.call(null, n).toString()

Bạn có thể sử dụng thủ thuật này cho các đối tượng gốc javascript khác.


0

Gần đây, phương pháp 3 và 4 không phù hợp vì cách các chuỗi được sao chép và sau đó ghép lại với nhau. Đối với một chương trình nhỏ, vấn đề này không đáng kể, nhưng đối với bất kỳ ứng dụng web thực tế nào, hành động này mà chúng ta phải xử lý các thao tác chuỗi tần số có thể ảnh hưởng đến hiệu suất và khả năng đọc.

Đây là liên kết đọc .


0

Tôi sẽ chỉnh sửa lại dữ liệu này với nhiều dữ liệu hơn khi có thời gian, vì hiện tại điều này vẫn ổn ...

Kiểm tra trong nodejs v8.11.2: 2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

đầu ra

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

Yay - test4 là thứ tôi thường xuyên sử dụng !!
Adrian Bartholomew

0

Có vẻ như kết quả tương tự khi sử dụng node.js. Tôi đã chạy tập lệnh này:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

và nhận được kết quả như sau:

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

Lần tương tự mỗi lần tôi chạy nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.