Reputation: 8134
I want to let the user define certain variables without overriding existing ones. For example, an allowed new variable:
myJSON = 123
And an invalid one:
JSON = 123
Because it overrides the existing JSON
object. Before adding I could simply check if the variable is different from undefined
. But I would prefer to show the user which variables are already taken too.
How can I get a comprehensive list of the browser's built-in variables?
Note that Object.keys(window)
and Object.keys(document)
don't contain JSON
. Which other places should I check to get a comprehensive list of taken variables?
Upvotes: 2
Views: 210
Reputation: 13678
So, originally, I thought that the limitation was that Object.keys
enumerates only an object's own properties and not inherited ones. However, trying a simple for...in
loop without a hasOwnProperty
check failed to yield much more than Object.keys
. I also tried looping over globalThis
to no avail.
A bit of further research showed that JSON
is part of the family of "Standard Built-In Objects". When researching that, I came upon a similar Stack Overflow question regarding how to list all standard built-in objects in Node, and the solution was to leverage getOwnPropertyNames
. This proved to be the solution-- rather than getting ≈300 results, I instead got 1000+, among which were "JSON"
and "Error"
.
const allWindowProperties = Object.getOwnPropertyNames(window);
console.log(allWindowProperties);
console.log(allWindowProperties.includes('JSON'));
console.log(allWindowProperties.includes('Error'));
So hopefully this solves your problem. My original comment, however, is still worth exploring: How has this use case manifested? Why is it a necessity to allow the user direct access to the runtime environment to declare variables at all, let alone in the global namespace? Perhaps you have a good reason, and I do think this is an interesting question, but I wonder if perhaps we have a classic X-Y problem here.
Upvotes: 2