Có giới hạn về độ dài của khóa (chuỗi) trong đối tượng JS không?


84

Vì vậy, chúng tôi đã có một trường hợp mà chúng tôi sẽ có một đối tượng, trong đó khóa là id (int) và giá trị là chuỗi. Nhưng chúng tôi nhận thấy rằng hầu hết các trường hợp, chúng tôi tìm kiếm id dựa trên chuỗi, vì vậy chúng tôi quyết định đảo ngược nó và đặt một chuỗi thành khóa và giá trị là id. Bởi vì theo cách đó thay vì đi qua từng mục và so sánh các giá trị, chúng tôi có thể làm var id = storage[text];. Dưới đây là những ví dụ về những gì chúng tôi đã làm.

Đây là ví dụ về cách triển khai cũ:

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}

Đây là ví dụ về cách triển khai mới:

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}

Tôi hiểu rằng bây giờ chuỗi là chìa khóa và bạn có thể lấy cùng một id cho các chuỗi giống nhau. Nhưng vì bây giờ chuỗi có thể có khả năng khá lớn (cơ hội mỏng, nhưng có thể là tối đa 1KB mỗi chuỗi), có giới hạn độ dài JS hoặc Android webview đặt trên các phím đối tượng không?

Và ngoài ra, cách triển khai này có nhược điểm gì không? Tôi đã không nhận thấy bất kỳ vấn đề cho đến nay, nhưng bạn không bao giờ biết.

Câu trả lời:


96

Tôi đã nghiên cứu điều này một chút.

MDN im lặng về vấn đề này, và thông số kỹ thuật ( ES5 , ES6 ) cũng vậy. Họ chỉ tuyên bố rằng trình truy cập thuộc tính phải là một chuỗi, không có bất kỳ trình độ nào - nói cách khác, không có giới hạn nào liên quan đến thông số kỹ thuật. Điều đó hầu như không đáng ngạc nhiên.

Làm thế nào các trình duyệt xử lý nó, là một vấn đề khác. Tôi đã thiết lập một thử nghiệm và chạy nó trên một số trình duyệt. Chrome 40 (Máy tính để bàn), Chrome 40 (Android 5.1), Firefox 36, Opera 27 và IE9 + có thể xử lý tên thuộc tính lên đến 2 27 ký tự. Safari 8 (OS X Yosemite) thậm chí có thể xử lý tên thuộc tính của 2 30 ký tự.

Đối với tất cả các trình duyệt đó ngoại trừ IE, độ dài thuộc tính tối đa bằng với độ dài chuỗi tối đa. IE9 + có thể xử lý độ dài chuỗi tối đa là ~ 2 30 ký tự, nhưng giới hạn cho các khóa đối tượng là 2 27 ký tự, giống như trong các trình duyệt khác.

Thử nghiệm không hoạt động trong IE8 và Safari trên iOS, có lẽ do sự cố bộ nhớ do mã thử nghiệm gây ra.

Tóm lại, sử dụng tên tài sản dài là an toàn, ngay cả khi nó quá cao. Miễn là bản thân các chuỗi nằm trong giới hạn mà trình duyệt có thể xử lý, bạn cũng có thể sử dụng chúng làm tên thuộc tính.


17
Bất kỳ hình phạt thời gian chạy nào cho các phím dài trên các trình duyệt hiện đại?
Ahmed Fasih

@AhmedFasih Tôi chưa thử nghiệm nó nên tôi không biết chắc. Nếu có một hình phạt về hiệu suất, tôi cho rằng nó sẽ liên quan đến việc so sánh các chuỗi dài. Tôi sẽ rất ngạc nhiên nếu có những vấn đề xảy ra trong thực tế - trừ khi các phím quá lớn và nhiều và bạn bắt đầu gặp phải những hạn chế về bộ nhớ, ví dụ như trên thiết bị di động.
hashchange

7
Đặc tả ES7 chỉ định giới hạn 2 ^ 53 - 1 của "phần tử" . Nhưng tôi nghĩ rằng nó bị giới hạn bởi kích thước tối đa đống
mems

6
" MDN im lặng về vấn đề này ... ". Không còn nữa . ;-)
RobG

2
Vì vậy, kích thước thực tế là 2 ^ 27 = 0,125 GB và 2 ^ 30 = 1 GB. Đó là rất nhiều đối với tôi :)
Sorin C

34

Không, không có giới hạn cho độ dài chuỗi (miễn là nó vừa với bộ nhớ) và việc triển khai của bạn cũng có vẻ ổn. Thực tế là khá phổ biến khi có các mảng 'quay vòng' với các giá trị boolean, ví dụ. Và đối với các chuỗi dưới dạng khóa: Các chuỗi là các ký hiệu bất biến được lưu trữ tại một địa chỉ nhất định và thứ thực sự được sử dụng làm chỉ mục cho mảng là địa chỉ đó (còn gọi là con trỏ hay còn gọi là tham chiếu) chứ không phải chính chuỗi.


7
"Các chuỗi là ký hiệu bất biến": Bạn học điều này ở đâu?
Andrew

4
Hấp dẫn. Bạn có thể thêm một tài liệu tham khảo hoặc nguồn?
hashchange

8
Trong nhiều ngôn ngữ, chuỗi là bất biến. Javascript là một trong những ngôn ngữ đó. developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89 18/02/16

3
chỉ để thêm một số rõ ràng nhỏ cho những người khác. điều này có nghĩa là bạn không thể thực hiện một hành động thay đổi một chuỗi. bạn có thể thao tác và trả về một chuỗi mới, nhưng không bao giờ thực sự thay đổi một
Patrick

Câu trả lời được chấp nhận là thực tế hơn, nhưng đây là câu trả lời thực sự.
theUtherSide

5

Dường như với ECMAScript 2016, bây giờ đã có câu trả lời chắc chắn cho câu hỏi này. Theo MDN Web Docs on string.length :

ECMAScript 2016 (ấn bản 7) đã thiết lập độ dài tối đa là 2 ^ 53 - 1 phần tử. Trước đây, không có độ dài tối đa nào được chỉ định.

Bạn cũng có thể tìm thấy điều này được chỉ định trong Đặc tả ngôn ngữ ECMAScript® 2016 :

Kiểu chuỗi là tập hợp tất cả các chuỗi có thứ tự của 0 hoặc nhiều hơn các giá trị số nguyên không dấu 16 bit (“phần tử”) có độ dài tối đa là 2 phần tử 53 -1.

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.