Какая разница между Object.getOwnPropertyNames
и Object.keys
в JavaScript? Также некоторые примеры будут оценены.
javascript
kamilkp
источник
источник
Object.keys()
не возвращает их, аObject.getOwnPropertyNames()
делает.Ответы:
Есть небольшая разница.
Object.getOwnPropertyNames(a)
возвращает все собственные свойства объектаa
.Object.keys(a)
возвращает все перечисляемые собственные свойства. Это означает, что если вы определяете свойства вашего объекта, не создавая некоторые из них,enumerable: false
эти два метода дадут вам одинаковый результат.Это легко проверить:
Если вы определяете свойство без предоставления дескриптора атрибутов свойства (то есть не используете
Object.defineProperties
), например:тогда такое свойство автоматически становится перечислимым, и оба метода создают один и тот же массив.
источник
length
свойства объектов массива не перечисляются, поэтому они не отображаются вObject.keys
.length
Свойство объектов находится на прототипе, а не на самом объекте, поэтому ни перечислять его,Object.keys
ниObject.getOwnPropertyNames
перечислять не будем.Object.getOwnPropertyNames(anyArray)
включает в себяlength
Object.getOwnPropertyNames(anyArray)
действительно включаетlength
в возвращаемый массив!Другое отличие в том случае, если
Object.getOwnPropertyNames
метод массива вернет дополнительное свойствоlength
.источник
Буквенная нотация против конструктора при создании объекта. Вот то, что меня достало.
Так что в моем случае
foo
функция не сработала, если бы я дал ей объекты типа cat2.Существуют и другие способы создания объектов, поэтому там могут быть и другие изломы.
источник
Object.getOwnPropertyNames
вернет имена свойств дляcat1
а неcat2
. Два способа создания объекта не дают разницы междуObject.getOwnPropertyNames
иObject.keys
.Как уже объяснялось,
.keys
не возвращает перечислимых свойств.Что касается примеров, то одним из ловушек является
Error
объект: некоторые его свойства перечислимы.Так что в то время как
console.log(Object.keys(new Error('some msg')))
урожайность[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
урожайность["stack", "message"]
источник
Другое отличие состоит в том, что (по крайней мере, для nodejs) функция «getOwnPropertyNames» не гарантирует порядок ключей, поэтому я обычно использую функцию «keys»:
источник
getOwnPropertyNames
не в порядке? Потому что ES2015 определяет заказ наObect.getOwnPropertyNames
, в то время как заказ наObect.keys
все еще до реализации.for-in loop
,Object.keys
иObject.getOwnPropertyNames
. Тем не менее, все три будут перечислять в последовательном порядке по отношению друг к другу.