Deprecated and obsolete features

Trang này liệt kê các tính năng của JavaScript đã bị deprecated (tức là vẫn có sẵn nhưng được lên kế hoạch loại bỏ) và obsolete (tức là không còn có thể sử dụng được).

Tính năng đã bị deprecated

Các tính năng deprecated này vẫn có thể sử dụng, nhưng nên dùng cẩn thận vì chúng không bắt buộc phải được triển khai bởi mọi JavaScript engine. Bạn nên cố gắng loại bỏ việc sử dụng chúng khỏi mã của mình.

Một số tính năng deprecated này được liệt kê trong phần Annex B của đặc tả ECMAScript. Phần này được mô tả là normative optional — tức là, host trình duyệt web phải triển khai các tính năng này, trong khi host không phải web có thể không triển khai. Những tính năng này có thể ổn định vì việc loại bỏ chúng sẽ gây ra vấn đề tương thích ngược và làm hỏng các trang web cũ. (JavaScript có mục tiêu thiết kế là "đừng phá vỡ web".) Tuy nhiên, chúng không thể chuyển đổi cross-platform và có thể không được hỗ trợ bởi tất cả các công cụ phân tích, vì vậy bạn được khuyên không sử dụng chúng, như phần giới thiệu của Annex B nêu:

… Tất cả các tính năng ngôn ngữ và hành vi được chỉ định trong phụ lục này đều có một hoặc nhiều đặc điểm không mong muốn và nếu không có việc sử dụng kế thừa sẽ bị loại bỏ khỏi đặc tả này. …

… Lập trình viên không nên sử dụng hoặc giả định sự tồn tại của các tính năng và hành vi này khi viết mã ECMAScript mới. …

Một số tính năng khác, mặc dù trong phần thân chính của đặc tả, cũng được đánh dấu là normative optional và không nên phụ thuộc vào.

Chú thích HTML

Mã nguồn JavaScript, nếu được phân tích cú pháp như script, cho phép chú thích dạng HTML, như thể script là một phần của thẻ <script>.

Sau đây là JavaScript hợp lệ khi chạy trong trình duyệt web (hoặc Node.js, sử dụng V8 engine của Chrome):

js
<!-- comment
console.log("a"); <!-- another comment
console.log("b");
--> More comment
// Logs "a" and "b"

<!----> đều hoạt động như //, tức là bắt đầu chú thích dòng. --> chỉ hợp lệ ở đầu dòng (để tránh nhầm lẫn với postfix decrement theo sau là toán tử lớn hơn), trong khi <!-- có thể xuất hiện ở bất kỳ đâu trong dòng.

RegExp

Các thuộc tính sau đây đã bị deprecated. Điều này không ảnh hưởng đến việc sử dụng chúng trong replacement string:

$1–$9

Parenthesized substring matches, if any.

input, $_

The string against which a regular expression is matched.

lastMatch, $&

The last matched substring.

lastParen, $+

The last parenthesized substring match, if any.

leftContext, $`

The substring preceding the most recent match.

rightContext, $'

The substring following the most recent match.

Warning: Tránh sử dụng các thuộc tính static này, vì chúng có thể gây ra vấn đề khi tương tác với mã bên ngoài!

Phương thức compile() đã bị deprecated. Hãy tạo một instance RegExp mới thay thế.

Các cú pháp regex sau đây đã bị deprecated và chỉ có sẵn trong Unicode-unaware mode. Trong Unicode-aware mode, chúng đều là lỗi cú pháp:

  • Lookahead assertion có thể có quantifier.
  • Backreference không tham chiếu đến capturing group hiện có trở thành legacy octal escape.
  • Trong character class, phạm vi ký tự mà một boundary là character class biến - thành ký tự literal.
  • Escape sequence không được nhận diện trở thành "identity escape".
  • Escape sequence trong character class có dạng \cX trong đó X là số hoặc _ được giải mã giống như các escape sequence với chữ cái ASCII: \c0 giống như \cP khi lấy modulo 32. Ngoài ra, nếu gặp dạng \cX ở bất kỳ đâu mà X không phải là một trong các ký tự được nhận diện, thì dấu gạch chéo ngược được coi là ký tự literal.
  • Chuỗi \k trong regex không có named capturing group nào được coi là identity escape.
  • Các ký tự cú pháp ], {} có thể xuất hiện theo nghĩa đen mà không cần thoát nếu chúng không thể được diễn giải là kết thúc character class hoặc dấu phân cách quantifier.

Function

  • Thuộc tính caller của hàm và thuộc tính arguments.callee đã bị deprecated và không có sẵn trong strict mode.
  • Thay vì truy cập arguments như thuộc tính của hàm, bạn nên dùng đối tượng arguments bên trong function closure.

Object

String

Date

Chuỗi thoát

Câu lệnh

Câu lệnh with đã bị deprecated và không có sẵn trong strict mode.

Initializer trong khai báo var của header vòng lặp for...in đã bị deprecated và tạo ra lỗi cú pháp trong strict mode. Biểu thức initializer được đánh giá và gán cho biến, nhưng giá trị sẽ ngay lập tức bị gán lại trong lần lặp đầu tiên của vòng lặp.

Thông thường, khối catch của câu lệnh try...catch không thể chứa khai báo biến có cùng tên với các biến bound trong catch(). Một phần mở rộng ngữ pháp cho phép khối catch chứa biến được khai báo var có cùng tên với định danh catch-bound, nhưng chỉ khi catch binding là định danh đơn giản, không phải destructuring pattern. Tuy nhiên, việc khởi tạo và gán giá trị của biến này sẽ chỉ ảnh hưởng đến định danh catch-bound, không phải biến phạm vi trên, và hành vi có thể gây nhầm lẫn.

js
var a = 2;
try {
  throw new Error();
} catch (a) {
  var a = 1; // This 1 is assigned to the caught `a`, not the outer `a`.
}
console.log(a); // 2

try {
  throw new Error();
  // Note: identifier changed to `err` to avoid conflict with
  // the inner declaration of `a`.
} catch (err) {
  var a = 1; // This 1 is assigned to the upper-scope `a`.
}
console.log(a); // 1

Điều này được liệt kê trong Annex B của đặc tả và do đó có thể không được triển khai ở mọi nơi. Tránh xung đột tên giữa định danh catch-bound và biến được khai báo trong khối catch.

Tính năng đã obsolete

Những tính năng obsolete này đã bị loại bỏ hoàn toàn khỏi JavaScript và không thể sử dụng được nữa kể từ phiên bản JavaScript được chỉ định.

RegExp

Các thuộc tính sau hiện là thuộc tính của các instance RegExp, không còn của constructor RegExp:

Property Description
global Whether or not to test the regular expression against all possible matches in a string, or only against the first.
ignoreCase Whether or not to ignore case while attempting a match in a string.
lastIndex The index at which to start the next match.
multiline (also via RegExp.$*) Whether or not to search in strings across multiple lines.
source The text of the pattern.

Phương thức valueOf() không còn chuyên biệt hóa cho RegExp. Nó dùng Object.prototype.valueOf(), trả về chính nó.

Function

  • Thuộc tính arity của hàm đã obsolete. Hãy dùng length thay thế.

Object

Property Description Alternative
__count__ Returns the number of enumerable properties directly on a user-defined object. Object.keys()
__parent__ Points to an object's context. No direct replacement
__iterator__ Used with legacy iterators. Symbol.iterator and the new iteration protocols
__noSuchMethod__ A method called when a non-existent property is called as method. Proxy
Object.prototype.eval() Evaluates a string of JavaScript code in the context of the specified object. No direct replacement
Object.observe() Asynchronously observing the changes to an object. Proxy
Object.unobserve() Remove observers. Proxy
Object.getNotifier() Create a notifier object that allows to synthetically trigger a change observable with Object.observe(). No direct replacement
Object.prototype.watch() Attach a handler callback to a property that gets called when the property is assigned. Proxy
Object.prototype.unwatch() Remove watch handlers on a property. Proxy

String

  • Các phương thức String generic không chuẩn như String.slice(myStr, 0, 12), String.replace(myStr, /\./g, "!"), v.v. đã được giới thiệu trong Firefox 1.5 (JavaScript 1.6), bị deprecated trong Firefox 53 và bị loại bỏ trong Firefox 68. Bạn có thể dùng các phương thức trên String.prototype cùng với Function.call thay thế.
  • String.prototype.quote đã bị loại bỏ khỏi Firefox 37.
  • Tham số flags không chuẩn trong String.prototype.search, String.prototype.matchString.prototype.replace đã obsolete.

WeakMap

  • WeakMap.prototype.clear() đã được thêm vào Firefox 20 và bị loại bỏ trong Firefox 46. Không thể duyệt tất cả key trong WeakMap.

Date

  • Date.prototype.toLocaleFormat(), dùng format string theo định dạng được mong đợi bởi hàm strftime() trong C, đã obsolete. Hãy dùng toLocaleString() hoặc Intl.DateTimeFormat thay thế.

Array

  • Các phương thức Array generic không chuẩn như Array.slice(myArr, 0, 12), Array.forEach(myArr, myFn), v.v. đã được giới thiệu trong Firefox 1.5 (JavaScript 1.6), bị deprecated trong Firefox 68 và bị loại bỏ trong Firefox 71. Bạn có thể dùng các phương thức trên Array.prototype cùng với Function.call thay thế.
Property Description Alternative
Array.observe() Asynchronously observing changes to Arrays. Proxy
Array.unobserve() Remove observers. Proxy

Number

  • Number.toInteger() đã obsolete. Hãy dùng Math.floor, Math.round hoặc các phương thức khác thay thế.

Proxy

  • Proxy.createProxy.createFunction đã obsolete. Hãy dùng constructor Proxy() thay thế.
  • Các trap sau đã obsolete:

ParallelArray

  • ParallelArray đã obsolete.

Câu lệnh

  • for each...in đã obsolete. Hãy dùng for...of thay thế.
  • let block và let expression đã obsolete.
  • Expression closure (function () 1 là tốc ký của function () { return 1; }) đã obsolete. Hãy dùng function thông thường hoặc arrow function thay thế.

Lấy văn bản nguồn

Các phương thức toSource() của array, number, string, v.v. và hàm toàn cục uneval() đã obsolete. Hãy dùng toString(), hoặc viết phương thức serialization riêng của bạn thay thế.

Legacy generator và iterator

Các câu lệnh legacy generator function và legacy generator function expression đã bị loại bỏ. Cú pháp legacy generator function tái sử dụng từ khóa function, tự động trở thành generator function khi có một hoặc nhiều biểu thức yield trong thân — đây bây giờ là lỗi cú pháp. Hãy dùng function* statementfunction* expression thay thế.

Array comprehension và generator comprehension đã bị loại bỏ.

js
// Legacy array comprehensions
[for (x of iterable) x]
[for (x of iterable) if (condition) x]
[for (x of iterable) for (y of iterable) x + y]

// Legacy generator comprehensions
(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)

Firefox, trước phiên bản 26, đã triển khai một iterator protocol khác tương tự như Iterator protocol chuẩn. Một đối tượng là legacy iterator khi nó triển khai phương thức next(), tạo ra giá trị trên mỗi lần gọi và ném đối tượng StopIteration ở cuối lặp. Legacy iterator protocol này khác với iterator protocol chuẩn:

  • Giá trị được trả về trực tiếp làm giá trị trả về của các lời gọi next(), thay vì thuộc tính value của đối tượng IteratorResult.
  • Việc kết thúc lặp được biểu đạt bằng cách ném đối tượng StopIteration, thay vì thông qua thuộc tính done của đối tượng IteratorResult.

Tính năng này, cùng với constructor toàn cục StopIteration, đã bị loại bỏ trong Firefox 58+. Cho mục đích sử dụng trong tương lai, hãy xem xét dùng vòng lặp for...ofiterator protocol.

Sharp variable

Sharp variable đã obsolete. Để tạo cấu trúc circular, hãy dùng biến tạm thay thế.