Câu trả lời:
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 '' + num
mẫu.
null foo
không ném lỗi.
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.
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".
null
hoặc undefined
vì 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.
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 n
là null hoặc không xác định.
null
, hoặc undefined
. Nếu n
có null
hoặc undefined
do 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.
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)
.
... 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
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}`;
'' + number
phươ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.
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.toString()
sau đó, phải không?
n
là undefined
nó sẽ ném một lỗi cú pháp bằng cách sử dụng.toString()
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.
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'
(5.41 + '')
để sử dụng các phương thức String như .substring()
và các phương thức khác
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.
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.
.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.
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));
}
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()
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
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.
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
" + num
trình duyệt phổ biến Google Chrome.
Phương pháp toFixed()
cũng sẽ giải quyết mục đích.
var n = 8.434332;
n.toFixed(2) // 8.43
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.
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
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ó.
'' + 123e-50
trả về"1.23e-48"
.