mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 01:04:49 -05:00
Explain what is happening in 'isNumericName'.
This commit is contained in:
@@ -4084,6 +4084,21 @@ module ts {
|
||||
}
|
||||
|
||||
function isNumericName(name: string) {
|
||||
// The intent of numeric names is that
|
||||
// - they are names with text in a numeric form, and that
|
||||
// - setting properties/indexing with them is always equivalent to doing so with the numeric literal 'numLit',
|
||||
// acquired by applying the abstract 'ToNumber' operation on the name's text.
|
||||
//
|
||||
// The subtlety is in the latter portion, as we cannot reliably say that anything that looks like a numeric literal is a numeric name.
|
||||
// In fact, it is the case that the text of the name must be equal to 'ToString(numLit)' for this to hold.
|
||||
//
|
||||
// Consider the property name '"0xF00D"'. When one indexes with '0xF00D', they are actually indexing with the value of 'ToString(0xF00D)'
|
||||
// according to the ECMAScript specification, so it is actually as if the user indexed with the string '"61453"'.
|
||||
// Thus, the text of all numeric literals equivalent to '61543' such as '0xF00D', '0xf00D', '0170015', etc. are not valid numeric names
|
||||
// because their 'ToString' representation is not equal to their original text.
|
||||
// This is motivated by ECMA-262 sections 9.3.1, 9.8.1, 11.1.5, and 11.2.1.
|
||||
//
|
||||
// Here, we test whether 'ToString(ToNumber(name))' is exactly equal to 'name'.
|
||||
return (+name).toString() === name;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user