Если вы откроете devtool здесь, на этой странице, и введете следующее, вы получите:
let scripts = $$('script');
scripts[0].src // => "http://something....."
typeof scripts[0] // => "object"
Но если я сделаю Object.keys(scripts[0]), я получу:
Object.keys(scripts[0]); //=> []
Почему? Разве HTMLScriptElement не объект? Если это не так, то что это? Как перечислить его свойства?
Согласно документация MDN, он «наследует свойства от своего родителя, HTMLElement». Object.keys возвращает только собственные перечисляемые свойства объектов, поэтому вы, вероятно, захотите использовать цикл for...inбез для проверки перечислимых свойств.
Он возвращает узлы DOM, а не объекты. @AlexanderNied for...in - единственный, который вам не следует использовать. forEach, for и for..of all должны работать
@arieljuod .properties кажется частью (устаревшей) API микроданных и не имеет ничего общего с Object.keys
@GifCo for..of не будет работать, поскольку узел DOM не является итерируемым. Обратите внимание, что OP не занимается итерацией набора узлов DOM, а перечисляет свойства узла DOM.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Object.keys() returns an array whose elements are strings corresponding to the enumerable properties found directly upon object
Источник: МДН
Это означает две вещи:
function foo() {
this.a = 1;
this.b = 2;
this.c = 3;
}
// you get `a`, `b` and `c` as they are defined on the instance
console.info(Object.keys(new foo()));
function bar() {
this.b = 2;
this.c = 3;
}
bar.prototype.a = 1;
// you don't get `a` as it is inherited from the prototype
console.info(Object.keys(new bar()));function foo() {
this.a = 1;
this.b = 2;
this.c = 3;
Object.defineProperty(this, 'a', {enumerable: false});
}
console.info(Object.keys(new foo()))Однако вы можете обойти это:
const s = document.querySelector('script');
console.info(Object.keys(Object.getPrototypeOf(s)));
Существует экспериментальное свойство
propertiesдля HTMLElements developer.mozilla.org/en-US/docs/Web/API/HTMLElement.