Javascript ile Object.getOwnPropertyNames
ve Object.keys
arasındaki fark nedir ? Ayrıca bazı örnekler takdir edilecektir.
Javascript ile Object.getOwnPropertyNames
ve Object.keys
arasındaki fark nedir ? Ayrıca bazı örnekler takdir edilecektir.
Yanıtlar:
Küçük bir fark var. nesnenin tüm kendi özelliklerini Object.getOwnPropertyNames(a)
döndürür . tüm numaralandırılabilir kendi özelliklerini döndürür . Bu, nesne özelliklerini bazılarını yapmadan tanımlarsanız, bu iki yöntemin size aynı sonucu vereceği anlamına gelir .a
Object.keys(a)
enumerable: false
Test etmek kolaydır:
var a = {};
Object.defineProperties(a, {
one: {enumerable: true, value: 'one'},
two: {enumerable: false, value: 'two'},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]
Bir özelliği özellik özellikleri tanımlayıcısı (kullanmamanız anlamına gelir) sağlamadan tanımlarsanız Object.defineProperties
, örneğin:
a.test = 21;
bu tür özellikler otomatik olarak numaralandırılır ve her iki yöntem de aynı diziyi üretir.
length
dizi nesnelerinin özellikleri numaralandırılamaz, bu nedenle görünmez Object.keys
.
length
Nesnelerin özelliği, nesnenin kendisinde değil, prototip üzerindedir, bu nedenle ne listeler ne Object.keys
de Object.getOwnPropertyNames
listeler.
Object.getOwnPropertyNames(anyArray)
içerirlength
Object.getOwnPropertyNames(anyArray)
gerçekten length
döndürülen diziye dahil!
Nesne oluştururken hazır gösterime karşı kurucu. İşte beni yakalayan bir şey.
const cat1 = {
eat() {},
sleep() {},
talk() {}
};
// here the methods will be part of the Cat Prototype
class Cat {
eat() {}
sleep() {}
talk() {}
}
const cat2 = new Cat()
Object.keys(cat1) // ["eat", "sleep", "talk"]
Object.keys(Object.getPrototypeOf(cat2)) // []
Object.getOwnPropertyNames(cat1) // ["eat", "sleep", "talk"]
Object.getOwnPropertyNames(Object.getPrototypeOf(cat2)) // ["eat", "sleep", "talk"]
cat1 // {eat: function, sleep: function, talk: function}
cat2 // Cat {}
// a partial of a function that is used to do some magic redeclaration of props
function foo(Obj) {
var propNames = Object.keys(Obj);
// I was missing this if
// if (propNames.length === 0) {
// propNames = Object.getOwnPropertyNames(Obj);
// }
for (var prop in propNames) {
var propName = propNames[prop];
APIObject[propName] = "reasign/redefine or sth";
}
}
Benim durumumda, foo
eğer cat2 tipinde nesneler verirsem fonksiyon çalışmadı.
Nesneleri yaratmanın başka yolları da vardır, böylece orada başka karışıklıklar da olabilir.
Object.getOwnPropertyNames
için özellik adlarını dönecektir cat1
değil cat2
. Nesneyi oluşturmak için iki seçenek arasındaki fark üretmezler Object.getOwnPropertyNames
ve Object.keys
.
Daha önce açıklandığı gibi, .keys
numaralandırılabilir özellikler döndürmez.
Örneklerle ilgili olarak, tuzak durumlarından biri bir Error
nesnedir: bazı özellikleri numaralandırılabilir.
Böylece console.log(Object.keys(new Error('some msg')))
verim []
,
console.log(Object.getOwnPropertyNames(new Error('some msg')))
verim["stack", "message"]
console.log(Object.keys(new Error('some msg')));
console.log(Object.getOwnPropertyNames(new Error('some msg')));
Başka bir fark (en azından nodejs ile) "getOwnPropertyNames" fonksiyonunun tuşların sırasını garanti etmemesidir, bu yüzden genellikle "keys" fonksiyonunu kullanırım:
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
getOwnPropertyNames
düzenli olmamaya dair herhangi bir örnek biliyor musunuz ? ES2015 belirten Çünkü siparişiObect.getOwnPropertyNames
ederken, siparişObect.keys
kadar uygulanmasına hala.
for-in loop
, Object.keys
ve Object.getOwnPropertyNames
. Bununla birlikte, her üçü de birbirine göre tutarlı bir şekilde numaralandırılacaktır.
Object.keys()
bunları döndürmez, döndürürObject.getOwnPropertyNames()
.