Hướng dẫn javascript array push maximum call stack size exceeded - mảng javascript đẩy kích thước ngăn xếp cuộc gọi tối đa vượt quá

Mã đơn giản dưới đây tạo ra

const arr = [];

for [let i = 0; i < 10; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr2.join[', ']];
0

const arr = []
for [let i = 0; i < 135000; i++] {
    arr.push[i]
}
const arr2 = []
// something else here that changes arr2
arr2.push[...arr]

1] Tại sao điều này xảy ra? [Tôi chỉ đơn giản là thêm phần tử vào một mảng, tại sao nó tăng kích thước ngăn xếp?]

2] Làm thế nào để khắc phục lỗi này? [Mục tiêu của tôi là tạo một bản sao nông của ARR vào ARR2]

Khi được hỏi ngày 11 tháng 5 năm 2020 lúc 22:36May 11, 2020 at 22:36

2

Toán tử lây lan ở đó đẩy tất cả các phần tử trong mảng ban đầu vào ngăn xếp, giống như

const arr = [];

for [let i = 0; i < 10; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr2.join[', ']];
1:

const arr = [];

for [let i = 0; i < 10; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr2.join[', ']];

Vì vậy, lượng dữ liệu bạn có thể xử lý trong cả hai trường hợp bị giới hạn bởi kích thước ngăn xếp:

const arr = [];

for [let i = 0; i < 135000; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr.length, arr2.length];

Bạn có thể làm điều này thay thế:

const arr = [];

for [let i = 0; i < 135000; i++] {
  arr.push[i];
}

let arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

arr2 = [...arr2, ...arr];

console.log[arr.length, arr2.length];

Đã trả lời ngày 11 tháng 5 năm 2020 lúc 23:07May 11, 2020 at 23:07

DanzigerdanzigerDanziger

17,5K4 Huy hiệu vàng46 Huy hiệu bạc77 Huy hiệu đồng4 gold badges46 silver badges77 bronze badges

Khi bạn sử dụng toán tử lây lan, tất cả các mục của mảng nguồn được lưu trữ trong danh sách các đối số, do đó, có một số lượng lớn các mục [~> 100k] sẽ khiến kích thước ngăn xếp này vượt quá.

Công việc đơn giản nhất là để đẩy từng vật phẩm theo cách thủ công.

Bạn có thể có chức năng trợ giúp/tiện ích như thế này:

function largePush[src, dest]{
    const len = src.length
    for[let i = 0; i < len; i++]{
        dest.push[src[i]]
    }
}

và sử dụng nó như thế này:

const arr = []
for [let i = 0; i < 135000; i++] {
    arr.push[i]
}
const arr2 = []
largePush[arr, arr2]

Đã trả lời ngày 22 tháng 8 lúc 10:45Aug 22 at 10:45

DahoudahouDahou

5034 Huy hiệu bạc11 Huy hiệu đồng4 silver badges11 bronze badges

//I hope this will help you to make shallow copy of arr into arr2

let arr = []
for [let i = 0; i < 135000; i++] {
    arr.push[i]
}
let arr2 = []
// something else here that changes arr2
arr2=arr

console.log[arr2[0],arr[0]];
//Both 0,0
arr[0]=100

console.log[arr[0],arr2[0]]

//Both 100,100

Đã trả lời ngày 11 tháng 5 năm 2020 lúc 23:44May 11, 2020 at 23:44

1

Hôm nay, làm việc với Preact, tôi đã nhận thấy & nbsp; ngoại lệ gây ra bởi

const arr = [];

for [let i = 0; i < 10; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr2.join[', ']];
2 được sử dụng với cú pháp lan truyền [
const arr = [];

for [let i = 0; i < 10; i++] {
  arr.push[i];
}

const arr2 = [];

// Something else here that changes arr2:
arr2.push[0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

Array.prototype.push.apply[arr2, arr];

console.log[arr2.join[', ']];
3].

Tôi đã quyết định lặp lại bài kiểm tra về trường hợp đơn giản hơn, AO tập lệnh mà tôi đã thử nghiệm theo Google Chrome & NBSP; 97.0.4676:



	const array = Array[500000].fill[0];
	const backup = Array[];

	backup.push[...array];

	console.log[array.length];
	console.log[backup.length];

Exception:

push_test.htm:6 Uncaught RangeError: Maximum call stack size exceeded
    at push_test.htm:6

Screenshot:

Rangeerror chưa được thực hiện: vượt quá kích thước ngăn xếp cuộc gọi tối đa

Bất kỳ ý tưởng tại sao nó không được phép thêm các mặt hàng theo cách này? Có một số tái phát bên trong?

Trong JavaScript, các chức năng có & nbsp; một số lượng hạn chế các đối số cho mỗi cuộc gọi.

Trong trường hợp trên ____ 14 & nbsp; vượt qua số lượng lớn các Arument trong cuộc gọi.

Đó là cùng một trường hợp như & nbsp; bạn không thể & nbsp; để sử dụng ________ 15 & nbsp; Gọi chức năng Polling & nbsp; ____ ____ 16 mảng - cùng một vấn đề.

Cố gắng sử dụng & nbsp; vòng lặp:



	const array = Array[500000].fill[0];
	const backup = Array[];

	for [let i = 0; i < array.length; ++i]
		backup.push[array[i]];

	console.log[array.length];
	console.log[backup.length];

Preview:

Array Push [] với vòng lặp.

JavaScript kích thước ngăn xếp tối đa là gì?

Hậu quả của việc áp dụng một chức năng với quá nhiều đối số [nghĩ nhiều hơn hàng chục ngàn đối số] khác nhau giữa các động cơ [JavaScriptCore có giới hạn đối số khó mãhành vi] không được xác định.JavaScriptCore has hard-coded argument limit of 65536], because the limit [indeed even the nature of any excessively-large-stack behavior] is unspecified.

Nó có nghĩa là gì khi vượt quá kích thước ngăn xếp cuộc gọi tối đa?

Ngoại lệ JavaScript "quá nhiều đệ quy" hoặc "kích thước ngăn xếp cuộc gọi tối đa xảy ra" xảy ra khi có quá nhiều cuộc gọi chức năng hoặc một hàm bị thiếu một trường hợp cơ sở.occurs when there are too many function calls, or a function is missing a base case.

Callstack là gì?

Một ngăn xếp cuộc gọi là một cơ chế cho trình thông dịch [như trình thông dịch JavaScript trong trình duyệt web] để theo dõi vị trí của nó trong một tập lệnh gọi nhiều chức năng - chức năng nào hiện đang được chạy và các hàm nào được gọi từ trong chức năng đó, v.v..a mechanism for an interpreter [like the JavaScript interpreter in a web browser] to keep track of its place in a script that calls multiple functions — what function is currently being run and what functions are called from within that function, etc.

Bài Viết Liên Quan

Chủ Đề