Tôi thấy một vài giải pháp dự án mã .
Nhưng có triển khai thường xuyên trong JavaScript không?
Tôi thấy một vài giải pháp dự án mã .
Nhưng có triển khai thường xuyên trong JavaScript không?
Câu trả lời:
Nếu bạn phải viết mã cho Internet Explorer, hãy đảm bảo bạn đã chọn một triển khai, sử dụng các phép nối mảng. Chuỗi kết nối với +
hoặc +=
toán tử cực kỳ chậm trên IE. Điều này đặc biệt đúng với IE6. Trên các trình duyệt hiện đại +=
thường nhanh như mảng tham gia.
Khi tôi phải thực hiện nhiều phép nối chuỗi, tôi thường điền vào một mảng và không sử dụng lớp trình tạo chuỗi:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Lưu ý rằng các push
phương thức chấp nhận nhiều đối số.
[foo(), "bar", "baz"].join("");
tác phẩm cũng vậy.
push
có thể chấp nhận nhiều đối số. Những điều ngẫu nhiên bạn học được.
Tôi vừa kiểm tra lại hiệu suất trên http://jsperf.com/javascript-concat-vs-join/2 . Các trường hợp thử nghiệm nối hoặc tham gia bảng chữ cái 1.000 lần.
Trong các trình duyệt hiện tại (FF, Opera, IE11, Chrome), "concat" nhanh hơn khoảng 4-10 lần so với "tham gia".
Trong IE8, cả hai trả về kết quả như nhau.
Trong IE7, "tham gia" nhanh hơn khoảng 100 lần.
Không, không có hỗ trợ tích hợp để xây dựng chuỗi. Bạn phải sử dụng nối thay thế.
Tất nhiên, bạn có thể tạo một mảng gồm các phần khác nhau trong chuỗi của mình và sau đó gọi join()
vào mảng đó, nhưng sau đó phụ thuộc vào cách tham gia được thực hiện trong trình thông dịch JavaScript mà bạn đang sử dụng.
Tôi đã làm một thí nghiệm để so sánh tốc độ của str1+str2
phương pháp so với array.push(str1, str2).join()
phương pháp. Mã rất đơn giản:
var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++)
str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));
var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)
arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));
Tôi đã thử nghiệm nó trong Internet Explorer 8 và Firefox 3.5.5, cả trên Windows 7 x64.
Lúc đầu, tôi đã thử nghiệm với số lần lặp nhỏ (vài trăm, vài nghìn mục). Kết quả không thể đoán trước được (đôi khi việc nối chuỗi mất 0 mili giây, đôi khi phải mất 16 mili giây, tương tự cho việc nối mảng).
Khi tôi tăng số lượng lên 50.000, kết quả khác nhau ở các trình duyệt khác nhau - trong Internet Explorer, việc nối chuỗi nhanh hơn (94 mili giây) và tham gia chậm hơn (125 mili giây), trong khi trong Firefox, việc nối mảng nhanh hơn (113 mili giây) so với nối chuỗi (117 mili giây).
Sau đó, tôi đã tăng số lượng lên 500.000. Bây giờ array.join()
là chậm hơn so với chuỗi nối trong cả hai trình duyệt: nối chuỗi là 937 ms trong Internet Explorer, 1155 ms trong Firefox, mảng tham gia 1265 trong Internet Explorer, và 1207 ms trong Firefox.
Số lần lặp tối đa tôi có thể kiểm tra trong Internet Explorer mà không có "tập lệnh mất quá nhiều thời gian để thực thi" là 850.000. Sau đó, Internet Explorer là 1593 cho nối chuỗi và 2046 cho nối mảng và Firefox có 2101 cho nối chuỗi và 2249 cho nối chuỗi.
Kết quả - nếu số lần lặp lại nhỏ, bạn có thể thử sử dụng array.join()
, vì nó có thể nhanh hơn trong Firefox. Khi số lượng tăng lên, string1+string2
phương pháp nhanh hơn.
Tôi đã thực hiện thử nghiệm trên Internet Explorer 6 (Windows XP). Quá trình dừng lại để trả lời ngay lập tức và không bao giờ kết thúc, nếu tôi đã thử kiểm tra trên hơn 100.000 lần lặp. Trên 40.000 lần lặp lại, kết quả là
Time (strings): 59175 ms
Time (arrays): 220 ms
Điều này có nghĩa là - nếu bạn cần hỗ trợ Internet Explorer 6, hãy chọn array.join()
cách nhanh hơn so với nối chuỗi.
join()
là một phần của ECMAScript và afaik mỗi trình thông dịch JavaScript thực hiện nó. Tại sao nó "phụ thuộc"?
Mã đó trông giống như tuyến đường bạn muốn thực hiện với một vài thay đổi.
Bạn sẽ muốn thay đổi phương thức chắp thêm để trông như thế này. Tôi đã thay đổi nó để chấp nhận số 0 và để trả lại this
để bạn có thể xâu chuỗi các phụ lục của mình.
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
chuỗi rỗng undefined
, hoặc NaN
.
Phiên bản ECMAScript 6 (còn gọi là ECMAScript 2015) của JavaScript đã giới thiệu chuỗi ký tự .
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
Lưu ý rằng dấu tick ngược, thay vì dấu ngoặc đơn, kèm theo chuỗi.
Trong C # bạn có thể làm một cái gì đó như
String.Format("hello {0}, your age is {1}.", "John", 29)
Trong JavaScript, bạn có thể làm một cái gì đó như
var x = "hello {0}, your age is {1}";
x = x.replace(/\{0\}/g, "John");
x = x.replace(/\{1\}/g, 29);
{0}
được thay thế chứa {1}
.
Đối với những người quan tâm, đây là một giải pháp thay thế cho việc gọi Array.join:
var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);
Đầu ra, như mong đợi, là chuỗi 'foobar'. Trong Firefox, cách tiếp cận này vượt trội hơn Array.join nhưng vượt trội hơn so với + nối. Do String.concat yêu cầu mỗi phân đoạn được chỉ định làm một đối số riêng biệt, nên người gọi bị giới hạn bởi bất kỳ giới hạn số lượng đối số nào được áp đặt bởi công cụ JavaScript thực thi. Hãy xem tài liệu của Function.prototype.apply () để biết thêm thông tin.
Tôi đã xác định chức năng này:
function format() {
var args = arguments;
if (args.length <= 1) {
return args;
}
var result = args[0];
for (var i = 1; i < args.length; i++) {
result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
}
return result;
}
Và có thể được gọi như c #:
var text = format("hello {0}, your age is {1}.", "John", 29);
Kết quả:
xin chào John, tuổi của bạn là 29
Khi tôi thấy mình thực hiện nhiều phép nối chuỗi trong JavaScript, tôi bắt đầu tìm kiếm khuôn mẫu. Handlebars.js hoạt động khá tốt giúp HTML và JavaScript dễ đọc hơn. http://handlebarsjs.com
Làm thế nào về sys.StringBuilder()
thử bài viết sau đây.