为什么我无法获取 JavaScript 中导航器对象的属性计数?
Why can't I get properties count of navigator object in JavaScript?
运行 在您的浏览器中 (ES5+)
var propCount = Object.keys(navigator).length;
console.log(propCount); // 0
如果你对像这样的普通对象这样做
let obj = {
foo: 'bar',
breaking: 'bad'
}
let propCount = Object.keys(obj).length;
console.log(propCount); // 2
为什么会这样?
抱歉,如果它可能与另一个问题有关,例如当 Object.keys(obj)
只计算不包含 functions/arrays
的简单对象时,但这是我第一次遇到它。
并想知道其中的原因。
javascript中有可枚举和不可枚举的属性。 Object.keys()
将 return 对象的可枚举自身属性。所以在导航器对象中,似乎没有可枚举的自身属性。因此 Object.keys(navigator)
是 return 一个空数组。
来自文档,
The Object.keys() method returns an array of a given object's own
enumerable properties, in the same order as that provided by a
for...in loop.
如果要列出某个对象的所有可枚举和不可枚举的属性,则必须使用Object.getOwnPropertyNames()
编写自己的逻辑。
Note : getOwnPropertyNames will return both enum/non enum own
properties of an object.
function getAllProps(obj, props = []){
if(Object.getPrototypeOf(obj) == null){ return props; }
return getAllProps(Object.getPrototypeOf(obj),
props.concat(Object.getOwnPropertyNames(obj)));
}
console.log(getAllProps(navigator));
//This will give you all the properties.
如果您使用 for..in
循环,那么这将只为您提供原型链中的可枚举属性。而且你将不得不错过不可枚举的属性。
这是因为 navigator
的大部分属性都是在 Navigator
原型上设置的,navigator
实例继承了它,而 Object.keys
只有 returns 属性在 navigator
对象本身上设置。
您可以通过以下方式从原型中获取这些属性:
Object.keys(Object.getPrototypeOf(navigator));
附带说明一下,Firefox 在 navigator
对象本身中具有以下属性:
[ "doNotTrack", "mozPay", "mozContacts", "mozApps" ]
Object.keys() 函数 returns 直接赋给它的对象的属性。如果您执行以下操作:
console.log(navigator.hasOwnProperty('permissions')); // false
如果您想查看导航器的属性,请执行以下操作:
for(let i in navigator){
console.log(i);
}
它将列出 navigator 对象的所有属性,因为 for ... in ... 循环包括对象的原型。
运行 在您的浏览器中 (ES5+)
var propCount = Object.keys(navigator).length;
console.log(propCount); // 0
如果你对像这样的普通对象这样做
let obj = {
foo: 'bar',
breaking: 'bad'
}
let propCount = Object.keys(obj).length;
console.log(propCount); // 2
为什么会这样?
抱歉,如果它可能与另一个问题有关,例如当 Object.keys(obj)
只计算不包含 functions/arrays
的简单对象时,但这是我第一次遇到它。
并想知道其中的原因。
javascript中有可枚举和不可枚举的属性。 Object.keys()
将 return 对象的可枚举自身属性。所以在导航器对象中,似乎没有可枚举的自身属性。因此 Object.keys(navigator)
是 return 一个空数组。
来自文档,
The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in loop.
如果要列出某个对象的所有可枚举和不可枚举的属性,则必须使用Object.getOwnPropertyNames()
编写自己的逻辑。
Note : getOwnPropertyNames will return both enum/non enum own properties of an object.
function getAllProps(obj, props = []){
if(Object.getPrototypeOf(obj) == null){ return props; }
return getAllProps(Object.getPrototypeOf(obj),
props.concat(Object.getOwnPropertyNames(obj)));
}
console.log(getAllProps(navigator));
//This will give you all the properties.
如果您使用 for..in
循环,那么这将只为您提供原型链中的可枚举属性。而且你将不得不错过不可枚举的属性。
这是因为 navigator
的大部分属性都是在 Navigator
原型上设置的,navigator
实例继承了它,而 Object.keys
只有 returns 属性在 navigator
对象本身上设置。
您可以通过以下方式从原型中获取这些属性:
Object.keys(Object.getPrototypeOf(navigator));
附带说明一下,Firefox 在 navigator
对象本身中具有以下属性:
[ "doNotTrack", "mozPay", "mozContacts", "mozApps" ]
Object.keys() 函数 returns 直接赋给它的对象的属性。如果您执行以下操作:
console.log(navigator.hasOwnProperty('permissions')); // false
如果您想查看导航器的属性,请执行以下操作:
for(let i in navigator){
console.log(i);
}
它将列出 navigator 对象的所有属性,因为 for ... in ... 循环包括对象的原型。