如何在JavaScript/jQuery中获取对象的属性?

Sai*_*ful 93 javascript jquery

在JavaScript/jQuery中,如果我alert有一些对象,我会得到[object]或者 [object Object]

有什么办法可以知道:

  1. 这两个对象有什么区别

  2. 这是什么类型的对象

  3. 此对象包含的所有属性以及每个属性的值

jAn*_*ndy 139

您可以通过调用JavaScript的本机for in循环来查找对象的键和值:

var obj = {
    foo:    'bar',
    base:   'ball'
};

for(var key in obj) {
    alert('key: ' + key + '\n' + 'value: ' + obj[key]);
}
Run Code Online (Sandbox Code Playgroud)

或者使用jQuery的.each()方法:

$.each(obj, function(key, element) {
    alert('key: ' + key + '\n' + 'value: ' + element);
});
Run Code Online (Sandbox Code Playgroud)

除六种原始类型外,ECMA-/JavaScript中的所有内容都是一个对象.阵列; 功能; 一切都是对象.即使大多数这些原语实际上也是具有有限选择方法的对象.必要时,它们被铸在引擎盖下的物体中.要知道基类名称,可以Object.prototype.toString在对象上调用方法,如下所示:

alert(Object.prototype.toString.call([]));
Run Code Online (Sandbox Code Playgroud)

以上将输出[object Array].

还有其他一些类的名称,如[object Object],[object Function],[object Date],[object String],[object Number],[object Array],和[object Regex].

  • "一切都是一个对象",这不是真的,而且这是该语言中的一个重大误解.我们称之为原始类型:Number,String,Boolean,Undefined和Null.它们经常与原始包装器,使用内置构造函数创建的对象混淆,例如:`typeof new String("foo");`生成"对象",它是一个包装的原始值,而`typeof"foo"; `生成"字符串".[另见](http://stackoverflow.com/questions/3907613/how-is-a-javascript-string-not-an-object/) (31认同)
  • @CMS这也不是真的."原始"字符串_本身就是一个对象; 它只是有不同的方法选择.与数字和布尔值一样.但是,Undefined和Null是没有方法的原语. (7认同)

vol*_*ron 13

要获取对象属性/值的列表:

  1. 在Firefox中 - Firebug:

    console.dir(<object>);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 标准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");
       }
    
    Run Code Online (Sandbox Code Playgroud)

编辑:

  1. <object> 在上面将被替换为对象的变量引用.
  2. console.log() 将在控制台中使用,如果你不确定是什么,你可以用一个替换它 alert()


And*_*y E 7

i)这两个对象之间有什么区别

简单的答案是[object]指示没有内部类的宿主对象.宿主对象是一个对象,它不是您正在使用的ECMAScript实现的一部分,但是由主机作为扩展提供.DOM是宿主对象的常见示例,但在大多数较新的实现中,DOM对象继承自原始Object并具有内部类名(例如HTMLElement,Window等).IE的专有ActiveXObject是主机对象的另一个例子.

[object] 在Internet Explorer 7及更低版本中警告DOM对象时最常见,因为它们是没有内部类名的主机对象.

ii)这是什么类型的对象

您可以使用获取对象的"类型"(内部类)Object.prototype.toString.规范要求它始终返回格式的字符串[object [[Class]]],其中[[Class]]是内部类名,如Object,Array,Date,RegExp等.您可以将此方法应用于任何对象(包括宿主对象),使用

Object.prototype.toString.apply(obj);
Run Code Online (Sandbox Code Playgroud)

许多isArray实现使用此技术来发现对象是否实际上是一个数组(尽管它在IE中并不像在其他浏览器中那样健壮).


iii)该对象包含的所有属性以及每个属性的值

在ECMAScript 3中,您可以使用for...in循环遍历可枚举属性.请注意,大多数内置属性都是不可枚举的.某些主机对象也是如此.在ECMAScript 5中,您可以使用包含所有非继承属性的名称的数组Object.getOwnPropertyNames(obj).此数组将包含不可枚举和可枚举的属性名称.