Object.getOwnPropertyNames와 Object.열쇠들.
와의 차이는 무엇입니까?Object.getOwnPropertyNames
그리고.Object.keys
javascript로요?또한 몇 가지 예를 들어주시면 감사하겠습니다.
약간의 차이가 있다. Object.getOwnPropertyNames(a)
개체의 모든 속성을 반환합니다.a
.Object.keys(a)
열거할 수 있는 모든 자체 속성을 반환합니다.즉, 오브젝트 속성을 정의하지 않고enumerable: false
이 두 가지 방법은 동일한 결과를 얻을 수 있습니다.
테스트는 간단합니다.
var a = {};
Object.defineProperties(a, {
one: {enumerable: true, value: 1},
two: {enumerable: false, value: 2},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]
속성 속성 설명자를 제공하지 않고 속성을 정의하는 경우(즉, 사용하지 않음)Object.defineProperties
예를 들어 다음과 같습니다.
a.test = 21;
그러면 이러한 속성은 자동으로 열거할 수 있고 두 가지 방법 모두 동일한 배열을 생성합니다.
또 다른 차이점은 어레이의 경우입니다.Object.getOwnPropertyNames
메서드는 다음과 같은 추가 속성을 반환합니다.length
.
var x = ["a", "b", "c", "d"];
Object.keys(x); //[ '0', '1', '2', '3' ]
Object.getOwnPropertyNames(x); //[ '0', '1', '2', '3', 'length' ]
개체를 만들 때 리터럴 표기 vs 생성자.여기 나를 놀라게 한 것이 있다.
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";
}
}
그래서 저 같은 경우에는foo
cat2 타입의 오브젝트를 지정해도 기능하지 않습니다.
물체를 만드는 다른 방법이 있기 때문에 그 안에 다른 꼬임도 있을 수 있습니다.
이미 설명했듯이.keys
열거할 수 없는 속성은 반환되지 않습니다.
예시와 관련하여, 함정 사례 중 하나는Error
object: 속성 중 일부는 열거할 수 없습니다.
그래서 그러는 동안console.log(Object.keys(new Error('some msg')))
수율[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
수율["stack", "message"]
console.log(Object.keys(new Error('some msg')));
console.log(Object.getOwnPropertyNames(new Error('some msg')));
또 다른 차이점은 (적어도 nodejs의 경우) "GetOwnPropertyNames" 함수는 키의 순서를 보증하지 않는다는 것입니다.그래서 저는 보통 "keys" 함수를 사용합니다.
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
언급URL : https://stackoverflow.com/questions/22658488/object-getownpropertynames-vs-object-keys
'programing' 카테고리의 다른 글
Java에서 a.getClass()와 A.class의 차이점은 무엇입니까? (0) | 2022.10.05 |
---|---|
C구조를 인라인으로 할당하려면 어떻게 해야 합니까? (0) | 2022.10.05 |
모든 호스트에서 MySQL 루트 액세스 (0) | 2022.10.05 |
마리아 표의 여러 열을 업데이트하는 방법DB (0) | 2022.10.05 |
tzlocal()을 사용하여 datetime을 MariaDB에 저장하는 방법 (0) | 2022.10.05 |