Cách nhân một chuỗi JavaScript

Vì JavaScript nối các chuỗi với toán tử

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
0, sẽ rất tiện lợi nếu nó cũng cho phép bạn nhân các chuỗi bằng cách sử dụng e. g.
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
1 (ít nhất có thể được thực hiện bằng Python). Vì bạn không thể làm điều đó và không có phương pháp nhân chuỗi gốc nào được cung cấp, nên gần đây tôi đã khám phá một vài cách để thực hiện nó…

Một cách tiếp cận ngây thơ để viết một hàm nhân chuỗi giống như thế này

function mul0 (str, num) {
	if (!num) return "";
	var newStr = str;
	while (--num) newStr += str;
	return newStr;
}

Như nhiều JavaScripter đã biết, đó không phải là cách tiếp cận tốt nhất vì việc nối chuỗi có thể khá chậm trong Internet Explorer. Và mặc dù IE có xu hướng bị mang tiếng xấu vì điều này (may mắn thay, nhóm IE đang khắc phục sự cố trong phiên bản tiếp theo của trình duyệt của họ), Firefox cũng không thực sự nhanh chóng trong việc nối chuỗi. Do các vấn đề về hiệu suất, phương pháp nhân chuỗi điển hình là xây dựng một mảng và

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
2 nó. Đây là một cách hay, ngắn gọn để làm điều đó

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}

Lưu ý rằng việc xử lý

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
3 giả có thể không được đảm bảo trong trường hợp này vì hàm sẽ xử lý giá trị
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
0 một cách chính xác nếu không có nó. Dù sao thì nó cũng được thực hiện để giữ chức năng tương đương giữa các biến thể

Thật không may,

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
1 vẫn có thể khá chậm trong Firefox 2 khi nhân các chuỗi lớn lên nhiều lần. Nó có thể không được chú ý với các chuỗi nhỏ và số lặp lại, nhưng thời gian hoàn thành tăng lên với tốc độ siêu tuyến tính khi số lượng tăng lên. Để tìm kiếm giải pháp nhanh hơn, tôi đã thử sử dụng biểu thức chính quy để giảm kích thước của chuỗi đang được xử lý

var mul2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();

Ở trên nhân chuỗi hai ký tự "

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
2"
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
3 lần, sau đó sử dụng chuỗi đó để thay thế cho biểu thức chính quy khớp với phần đầu của chuỗi (
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
2 trả về văn bản ở bên phải của chuỗi). Làm thế nào mà thực hiện? . 29800ms (
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
1) khi sử dụng hệ số/độ dài chuỗi 2700x2700. Tuy nhiên, dựa trên thử nghiệm của tôi, kiểu tăng tốc đó dường như bị giới hạn ở Firefox và trong Safari 3 beta
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
6 chậm hơn đáng kể so với các phiên bản thay thế

Cuối cùng, tôi đã thử tạo một phiên bản nhân chuỗi với tốc độ cấp số nhân

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
0

Mặc dù đó có thể là nhiều mã hơn mức bạn sẵn sàng dành cho phương pháp nhân chuỗi, nhưng đây là phiên bản nhanh nhất trong số các phiên bản trên trên trình duyệt chéo trung bình. Tôi cũng đã thử một vài biến thể bằng cách sử dụng từ 0 đến 2 mảng và các phương thức mảng khác nhau (

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
7,
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
8, v.v. ), nhưng ở trên có vẻ là tốc độ trung bình nhanh nhất trên bốn trình duyệt lớn

Đảm bảo tự mình thử các bài kiểm tra và cho tôi biết suy nghĩ của bạn cũng như cách bạn sẽ cải thiện mã


Chỉnh sửa. Kris Kowal đã đóng góp

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
9 (hiển thị bên dưới và được thêm vào trang thử nghiệm). Nó sử dụng phép nội suy nhị phân và theo cách nói của Kris "nó tận dụng lợi thế của danh tính bitwise thú vị.
var mul2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();
0". Trên hệ thống của tôi, nó nhanh hơn đáng kể so với
var mul2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();
1 trong Firefox, nhưng chậm hơn một chút so với
var mul2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();
1 trong IE, Safari và Opera. Do tốc độ cao và trọng lượng nhẹ hơn, đây có vẻ là đối thủ đáng đánh bại. Hãy thử trang thử nghiệm trong một số trình duyệt và xem bạn nghĩ gì

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
7

Chỉnh sửa 2. LiuCougar của nhóm phát triển Dojo đã đăng một bài tiếp theo bao gồm một số biến thể bổ sung và David Andersson đã gửi email cho tôi thêm bốn biến thể bao gồm biến thể này

function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
8

Tuy nhiên, tôi nên làm rõ rằng đây chủ yếu chỉ là thảo luận học thuật, vì việc lặp lại các loại chuỗi trong trang kiểm tra nhiều lần là một ý tưởng khá điên rồ. Tuy nhiên, thật thú vị khi thử nghiệm.

Cách nhân một chuỗi JavaScript


Chỉnh sửa 3. Tất cả các biến thể được đăng hoặc gửi qua email để phản hồi bài đăng này có thể được nhìn thấy tại stevenlevithan. com/demo/mul/all. js. Để đảm bảo tính nhất quán, tôi đã thực hiện một vài điều chỉnh nhỏ đối với một số chức năng như chỉnh sửa khoảng trắng và đổi tên các đối số đầu vào thành

var mul2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();
3 và
function mul1 (str, num) {
	return num ? Array(num + 1).join(str) : "";
}
3

Bạn có thể nhân một chuỗi không?

Phép nhân. Bạn có thể làm một số điều thú vị với phép nhân và chuỗi. Khi bạn nhân một chuỗi với một số nguyên, Python sẽ trả về một chuỗi mới . Chuỗi mới này là chuỗi ban đầu, được lặp lại X số lần (trong đó X là giá trị của số nguyên).

Làm cách nào để sao chép một chuỗi trong JavaScript?

Chuỗi JavaScript repeat() .

Làm cách nào để nhân các giá trị trong JavaScript?

Toán tử nhân ( * ) nhân các số.

Làm cách nào để in một chuỗi nhiều lần trong js?

Ba cách để lặp lại một chuỗi trong JavaScript .
sử dụng vòng lặp while
sử dụng đệ quy
sử dụng phương thức lặp lại ES6()