Hướng dẫn do keys have to be strings in javascript? - khóa có phải là chuỗi trong javascript không?

Các đối tượng tích hợp của JavaScript cung cấp chức năng Hashtable bằng cách sử dụng ký hiệu dấu ngoặc vuông cho các thuộc tính, miễn là các khóa của bạn là chuỗi hoặc số

Điều đó dường như không chính xác - Keysare đối tượng luôn luôn có thể là chuỗi hoặc (kể từ ECMAScript 2015, còn gọi là các ký hiệu ECMA -262 ED 6). Nhưng đó là một chủ đề khác để truy cập thuộc tính khung vuông.

Xem ECMA-262 ED 3 § 11.2.1 (Vui lòng xem ECMAScript 2017 (Dự thảo).):

Các thuộc tính được truy cập theo tên, sử dụng ký hiệu dấu chấm:

MemberExpression. Định danh

Faillexpression. Định danh

hoặc ký hiệu khung:

MemberExpression [Biểu hiện]

Faillexpression [Biểu thức]

Ký hiệu chấm được giải thích bằng chuyển đổi cú pháp sau:

MemberExpression. Định danh

Faillexpression. Định danh

hoặc ký hiệu khung:

MemberExpression [Biểu hiện]

Faillexpression. Định danh

Faillexpression. Định danh

hoặc ký hiệu khung:

MemberExpression [Biểu hiện]

Faillexpression [Biểu thức]

Ký hiệu chấm được giải thích bằng chuyển đổi cú pháp sau:

var y = {};
var x = 'foo';
y[x] = 'foo value';

giống hệt nhau trong hành vi của nó với

Memberexpression []

và tương tự

y.bar = 'bar value';

Faillexpression []

trong đó một chuỗi theo nghĩa đen chứa cùng một chuỗi các ký tự sau khi xử lý các chuỗi thoát Unicode như định danh.

y[5] = 5;

Vì vậy, khi sử dụng ký hiệu DOT, bit sau dấu chấm phải phù hợp với các tiêu chí cho định danh. Nhưng khi sử dụng dấu ngoặc vuông, một biểu thức được cung cấp được đánh giá và giải quyết thành một chuỗi.

Tóm lại, ký hiệu khung vuông được cung cấp để các thuộc tính có thể được truy cập bằng cách sử dụng biểu thức, ví dụ:

Ở trên, x được cung cấp trong ngoặc vuông để nó được đánh giá, trả về chuỗi 'foo'. Vì tài sản này chưa tồn tại trên

y.bar = 'bar value';
0, nên nó được thêm vào. Thuộc tính
y.bar = 'bar value';
1 của
y.bar = 'bar value';
0 sau đó được gán giá trị 'giá trị foo'.

Đối với những người đã làm việc với JavaScript trong một thời gian, bạn sẽ hiểu có những hành vi nhất định về ngôn ngữ khiến nó có vẻ như nó hoạt động theo một cách nhất định, trong thực tế, nó không, chẳng hạn như sử dụng == và == Để kiểm tra sự bình đẳng giữa hai giá trị khác nhau.

Đối với những gì nhiều người nghĩ, các khóa đối tượng JavaScript không thể là các giá trị loại, boolean, null hoặc không xác định. Các phím đối tượng chỉ có thể là chuỗi và mặc dù nhà phát triển có thể sử dụng các loại dữ liệu khác để đặt khóa đối tượng, JavaScript tự động chuyển đổi các phím thành một chuỗi giá trị.JavaScript object keys cannot be Number, Boolean, Null, or Undefined type values. Object keys can only be strings, and even though a developer can use other data types to set an object key, JavaScript automatically converts keys to a string a value.

Là các kỹ sư, nhà phát triển, lập trình viên hoặc người đam mê giỏi, bạn nên cố gắng không tin tưởng này, mà thay vào đó, hãy kiểm tra ngôn ngữ. Đó là lý do tại sao tôi xác nhận quan điểm của mình bằng cách chạy một loạt các thử nghiệm nhanh với JavaScript

  • Phím đối tượng thử nghiệm trong JavaScript
    • Truy cập các giá trị bằng cách sử dụng thuộc tính của Square Brackets
  • Hiểu tại sao
      • Truy cập các giá trị bằng cách sử dụng trình truy cập thuộc tính dot hoặc gán các giá trị bằng cách sử dụng phá hủy đối tượng
      • Tại sao nó hoạt động bằng cách sử dụng Trình truy cập tài sản Square Brackets?
  • Các trường hợp khác gây ra sự nhầm lẫn
  • Sự kết luận

Phím đối tượng thử nghiệm trong JavaScript

Truy cập các giá trị bằng cách sử dụng thuộc tính của Square Brackets



var test = { 1: 'Number One' };


Hiểu tại sao

Hướng dẫn do keys have to be strings in javascript? - khóa có phải là chuỗi trong javascript không?

Truy cập các giá trị bằng cách sử dụng thuộc tính của Square Brackets

Hiểu tại sao



console.log(test[1]);  // it displays "Number One"


Hiểu tại sao

Truy cập các giá trị bằng cách sử dụng trình truy cập thuộc tính dot hoặc gán các giá trị bằng cách sử dụng phá hủy đối tượng

Truy cập các giá trị bằng cách sử dụng trình truy cập thuộc tính dot hoặc gán các giá trị bằng cách sử dụng phá hủy đối tượng

Tại sao nó hoạt động bằng cách sử dụng Trình truy cập tài sản Square Brackets?



// Attempt using the Dot property accessor
console.log(test.1); // it will fail

// First attempt using object destructuring
var { 1 } = test; // it will fail as 1 it is not a correct identifier

// Second attempt using object destructuring
var { 1 : number } = test; // it will succeed
console.log(test.number);  // it displays "Number One"

Các trường hợp khác gây ra sự nhầm lẫn

Tại sao nó hoạt động bằng cách sử dụng Trình truy cập tài sản Square Brackets?

Các trường hợp khác gây ra sự nhầm lẫn



console.log(test[1]);  // it displays "Number One"

Dựa trên định nghĩa của tôi, tôi không thể xác định khóa bằng cách sử dụng kiểu dữ liệu khác với chuỗi. Hãy để tiếp tục và thử tạo đối tượng sau:



console.log(test['1']); // it also displays "Number One"

Nếu bạn đã thử như sau, bạn nhận thấy bạn đã không nhận được bất kỳ lỗi nào. Trên thực tế, nếu bạn sử dụng các công cụ nhà phát triển trình duyệt yêu thích của bạn và thử chạy các thử nghiệm của bạn ở đó, nó sẽ cung cấp cho bạn ấn tượng ban đầu, bạn có thể thêm số cho một khóa đối tượng.

Các trường hợp khác gây ra sự nhầm lẫn

Dựa trên định nghĩa của tôi, tôi không thể xác định khóa bằng cách sử dụng kiểu dữ liệu khác với chuỗi. Hãy để tiếp tục và thử tạo đối tượng sau:



var test = {
  true: 'True Boolean',
  false: 'False Boolean',
  null: 'Null data type',
  undefined: 'Undefined data type'
};

// it will succeed displaying all the object properties when using 
// square brackets or Dot property acccessors
console.log(test[true]);
console.log(test.true);
console.log(test[false]);
console.log(test.false);
console.log(test[null]);
console.log(test.null);
console.log(test[undefined]);
console.log(test.undefined);

Nếu bạn đã thử như sau, bạn nhận thấy bạn đã không nhận được bất kỳ lỗi nào. Trên thực tế, nếu bạn sử dụng các công cụ nhà phát triển trình duyệt yêu thích của bạn và thử chạy các thử nghiệm của bạn ở đó, nó sẽ cung cấp cho bạn ấn tượng ban đầu, bạn có thể thêm số cho một khóa đối tượng.

Hướng dẫn do keys have to be strings in javascript? - khóa có phải là chuỗi trong javascript không?

Sự kết luận

JavaScript cung cấp nhiều cách để truy cập các thuộc tính đối tượng có thể dẫn đến việc giải thích sai lệch liên quan đến cách thức hoạt động của ngôn ngữ, như gán các khóa cho một đối tượng. Cách tốt nhất để chứng minh mọi thứ hoạt động bằng cách này hay cách khác là tự mình thử nghiệm ngôn ngữ lập trình.

Khóa có phải là một chuỗi không?

Bạn không cần phải sử dụng các chuỗi hoặc số nguyên mà bạn có thể sử dụng phao, booleans, thậm chí cả bộ đếm làm phím.—you can use floats, Booleans, even tuples as keys.

Điều gì có thể là một chìa khóa trong JavaScript?

Tên thuộc tính đối tượng JavaScript (khóa) chỉ có thể là các chuỗi hoặc ký hiệu - tất cả các khóa trong ký hiệu khung vuông được chuyển đổi thành chuỗi trừ khi chúng là ký hiệu.strings or Symbols — all keys in the square bracket notation are converted to strings unless they are Symbols.

Một đối tượng có thể là một JavaScript khóa?

Bạn có thể sử dụng các đối tượng làm khóa đối tượng trong JavaScript không?# Câu trả lời ngắn gọn là không".Tất cả các phím đối tượng JavaScript là chuỗi.All JavaScript object keys are strings.

Các phím đối tượng có chuyển đổi thành chuỗi không?

Nếu khóa của bạn không phải là một chuỗi, JavaScript sẽ chuyển đổi nó thành một chuỗi khi bạn sử dụng nó làm tên thuộc tính.Lưu ý rằng nếu bạn không cung cấp tostring, các phím sẽ là chuỗi "[đối tượng đối tượng]".. Note that if you didn't provide a toString , the keys would have been the string "[object Object]" .