jQuery()对象可以容纳非DOM对象吗?

cFr*_*eed 6 jquery

分析这个SO问题所显示的代码,我刚刚注意到它使用jQuery迭代JSON数组的方式:

$(data).each(function() {
Run Code Online (Sandbox Code Playgroud)

而在我看来,数组应该以这种方式迭代:

$.each(data, function() {
Run Code Online (Sandbox Code Playgroud)

实际上,jQuery.each()手册页指出:

$ .each()函数与$(selector).each()不同,后者用于独占于jQuery对象进行迭代.

但是由于OP似乎让他的代码至少部分工作,我很想测试,并发现它有效!
这是证明:

var data = [
  {"key": "value-1"},
  {"key": "value-2"},
  {"key": "value-3"}
];

$(data).each(function() {
  document.write('<br />' + this.key);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

所以,如果$(data).each()工作时data是一个JSON阵列,这似乎意味着该数组是一个可以接受的内容$(data)返回一个jQuery对象.

然后进行调查我检查了jQuery(elementArray)手册页并查看了jQuery( elementArray )一节,其中说明:

elementArray
类型:Array 包含要包装在jQuery对象中的一组DOM元素
的数组.

根据以上所述,对象数组(而不是DOM元素)应该失败.
所以我测试比较这个$(data)和简单的返回对象$('body').结果如下:

var data = [
  {"key": "value-1"},
  {"key": "value-2"},
  {"key": "value-3"}
];

function log(obj, init) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      var $row = $('tr[data-prop=' + prop + ']');
      if (!$row.length) {
        $row =
          $('<tr data-prop="' + prop + '"><th>' + prop + '</th></tr>')
          .appendTo($('table'));
        if (!init) {
          $row.append('<td></td>');
        }
      }
      $row.append('<td>' + JSON.stringify(obj[prop]).substr(0,25) + '</td>');
    }
  }
}

log($('body'), true);
log($(data), false);
Run Code Online (Sandbox Code Playgroud)
table {
  border-collapse: collapse;
  border: 1px solid #000;
}
th, td {
  border: 1px solid #000;
  padding: 5px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tr>
    <th>Property</th>
    <th>$('body')</th>
    <th>$(data)</th>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

实际上似乎所有东西都可以转换为jQuery对象.
我很困惑:我正在重新发明轮子!?

Bra*_*rad 1

您对文档的阅读太多了。

是的,通常jQuery(elementArray)会在元素数组中使用。但是,它可以是任何东西的数组。

目的是让您在具有普通元素的数组上使用以及可能的其他便捷方法$.each()您会发现,如果您的数组没有某种类型的元素,其他 jQuery 方法将不会与您的数组中的任何内容匹配。