在JavaScript / jQuery中,如果我alert
某个对象,我会得到[object]
或[object Object]
有什么方法可以知道:
这两个对象有什么区别
这是什么类型的对象
此对象包含的所有属性以及每个属性的值
答案 0 :(得分:137)
您可以通过调用JavaScript的本机for in
循环来查找对象的键和值:
var obj = {
foo: 'bar',
base: 'ball'
};
for(var key in obj) {
alert('key: ' + key + '\n' + 'value: ' + obj[key]);
}
或使用jQuery的.each()
方法:
$.each(obj, function(key, element) {
alert('key: ' + key + '\n' + 'value: ' + element);
});
ECMA- / JavaScript中的 With the exception of six primitive types,一切是一个对象。阵列;功能;一切都是对象。即使大多数这些原语实际上也是具有有限选择方法的对象。必要时,它们被铸在引擎盖下的物体中。要知道基类名称,可以在对象上调用Object.prototype.toString
方法,如下所示:
alert(Object.prototype.toString.call([]));
以上将输出[object Array]
。
还有其他几个类名,例如[object Object]
,[object Function]
,[object Date]
,[object String]
,[object Number]
,[object Array]
和{{ 1}}。
答案 1 :(得分:13)
在Firefox中 - Firebug:
console.dir(<object>);
标准JS获取从Slashnick借来的对象密钥:
var fGetKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
// Example to call it:
var arrKeys = fGetKeys(document);
for (var i=0, n=arrKeys.length; i<n; i++){
console.log(i+1 + " - " + arrKeys[i] + document[arrKeys[i]] + "\n");
}
<object>
将替换为对象的变量引用。console.log()
将在控制台中使用,如果您不确定是什么,可以将其替换为alert()
答案 2 :(得分:7)
i)这两个对象之间有什么区别
简单的答案是[object]
表示没有内部类的宿主对象。宿主对象是一个对象,它不是您正在使用的ECMAScript实现的一部分,但是由主机作为扩展提供。 DOM是宿主对象的常见示例,但在大多数较新的实现中,DOM对象继承自原始Object并具有内部类名(例如 HTMLElement , Window 等) 。 IE的专有ActiveXObject是主机对象的另一个例子。
[object]
,因为它们是没有内部类名的主机对象。
ii)这是什么类型的对象
您可以使用Object.prototype.toString
获取对象的“类型”(内部类)。规范要求它始终以[object [[Class]]]
格式返回一个字符串,其中[[Class]]
是内部类名,例如 Object , Array ,< em> Date , RegExp 等。您可以使用
Object.prototype.toString.apply(obj);
许多isArray
实现使用此技术来发现对象是否实际上是一个数组(尽管it's not as robust in IE as it is in other browsers)。
iii)此对象包含的所有属性以及每个属性的值
在ECMAScript 3中,您可以使用for...in
循环遍历可枚举属性。请注意,大多数内置属性都是不可枚举的。某些主机对象也是如此。在ECMAScript 5中,您可以使用Object.getOwnPropertyNames(obj)
获取包含所有非继承属性名称的数组。该数组将包含不可枚举和可枚举的属性名称。
答案 3 :(得分:4)
我希望这不算垃圾邮件。在无休止的调试会话之后,我谦卑地结束了写一个函数:http://github.com/halilim/Javascript-Simple-Object-Inspect
function simpleObjInspect(oObj, key, tabLvl)
{
key = key || "";
tabLvl = tabLvl || 1;
var tabs = "";
for(var i = 1; i < tabLvl; i++){
tabs += "\t";
}
var keyTypeStr = " (" + typeof key + ")";
if (tabLvl == 1) {
keyTypeStr = "(self)";
}
var s = tabs + key + keyTypeStr + " : ";
if (typeof oObj == "object" && oObj !== null) {
s += typeof oObj + "\n";
for (var k in oObj) {
if (oObj.hasOwnProperty(k)) {
s += simpleObjInspect(oObj[k], k, tabLvl + 1);
}
}
} else {
s += "" + oObj + " (" + typeof oObj + ") \n";
}
return s;
}
<强>用法强>
alert(simpleObjInspect(anyObject));
或
console.log(simpleObjInspect(anyObject));
答案 4 :(得分:2)
获取Mozilla Firefox的FireBug。
使用console.log(obj);
答案 5 :(得分:1)
Spotlight.js是一个很棒的库,用于迭代窗口对象和寻找特定事物的其他主机对象。
// find all "length" properties
spotlight.byName('length');
// or find all "map" properties on jQuery
spotlight.byName('map', { 'object': jQuery, 'path': '$' });
// or all properties with `RegExp` values
spotlight.byKind('RegExp');
// or all properties containing "oo" in their name
spotlight.custom(function(value, key) { return key.indexOf('oo') > -1; });
你会喜欢它。
答案 6 :(得分:0)
扫描对象以确定道具的第一个实例:
var obj = {a:'Saludos',
b:{b_1:{b_1_1:'Como estas?',b_1_2:'Un gusto conocerte'}},
d:'Hasta luego'
}
function scan (element,list){
var res;
if (typeof(list) != 'undefined'){
if (typeof(list) == 'object'){
for(key in list){
if (typeof(res) == 'undefined'){
res = (key == element)?list[key]:scan(element,list[key]);
}
});
}
}
return res;
}
console.log(scan('a',obj));