javascript – jQuery merge()和array.length数据类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – jQuery merge()和array.length数据类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4203字,纯文字阅读大概需要7分钟。
内容图文
我一直在浏览一些jQuery源代码,然后我遇到了合并函数.这是它的源代码:
function merge(first, second) {
var l = second.length,
i = first.length,
j = 0;
if (typeof l === "number") {
for (; j < l; j++) {
first[i++] = second[j];
}
} else {
while (second[j] !== undefined) {
first[i++] = second[j++];
}
}
first.length = i;
return first;
}
虽然我理解代码,但对我来说没有意义.特别是if(typeof l ===“number”)部分.我已经尝试将数组传递给此函数,当我手动将.length属性更改为类似“3”并检查它的类型时,我仍然得到一种数字.
我的问题是,何时长度属性不是JavaScript数组中的一种数字?
解决方法:
您正在查看的合并函数是一个公共jQuery方法:jQuery.merge()或$.merge().所以你可能会认为阅读the jQuery.merge() documentation会对这个问题有所了解.
不幸的是,至少在撰写本文时,它没有.
正如其他答案和注释中所解释的,当第二个是数组时,对数字长度属性的此测试将始终成功,因为数组将始终具有数字长度.在代码中进行此测试的唯一可能原因是处理第二个不是数组的情况.
但是文档根本没有提到这个案例.它仅讨论第一个和第二个都是本机JavaScript Array对象而不是“类数组”对象的情况.
如果这个文档的使用是所有这个功能所做的那样,那将是非常无用的,因为JavaScript提供了一个非常好的原生array.concat(数组)方法,可以用来代替jQuery.merge().
所以看起来这个函数的真正目的必须是它的无证用途.让我们在jQuery.merge() doc page的Chrome控制台中试用它.打开开发人员工具,选择控制台选项卡,然后输入类似于文档中的示例:
jQuery.merge( [ 'a', 'b' ], [ 'c', 'd' ] )
然后用.concat()尝试相同的事情:
[ 'a', 'b' ].concat([ 'c', 'd' ])
他们都会记录完全相同的东西:
["a", "b", "c", "d"]
由于这是jQuery,“类似数组”对象的最可能的情况是jQuery对象.例如,该doc页面当前具有三个< h3>.它上面的元素,所以我们可以得到它们:
$('h3')
那会记录:
[?<h3>…</h3>, ?<h3>…</h3>, ?<h3>…</h3>]
这不是一个数组,但它看起来很像一个,它有一个数字长度属性,我们可以检查:
typeof $('h3').length
所以让我们尝试使用concat:
['x'].concat( $('h3') )
哎呀.这应该给我们一个由四个元素组成的数组,’x’后跟三个DOM元素.相反,我给了我们一个包含两个元素的数组,jQuery对象作为第二个元素:
[?e.fn.init[3] ]
看起来jQuery的“类似数组”对象对于.concat()来说不像数组那样.
奇怪的是,其他一些数组方法可以处理工作jQuery的类似数组的对象,例如.slice():
Array.prototype.slice.call( $('h3'), 1 )
记录正确的结果,包含两个元素的数组:
[?<h3>…</h3>, ?<h3>…</h3>]
所以让我们试试$.merge():
$.merge( ['x'], $('h3') )
果然,这记录了我们的预期:
["x", ?<h3>…</h3>, ?<h3>…</h3>, ?<h3>…</h3>]
还有另一种方法可以做到这一点. jQuery提供了一个.toArray()方法,所以我们可以通过将它与.concat()结合起来做同样的事情:
['x'].concat( $('h3').toArray() )
这记录了$.merge()调用的相同内容.
如果首先是jQuery对象怎么办?
$.merge( $('h1'), $('h3') )
这也有效:
[<h1 class="entry-title">jQuery.merge()</h1>,
?<h3>…</h3>, ?<h3>…</h3>, ?<h3>…</h3>]
所以这似乎是这个方法的目的:做array.concat() – 就像对jQuery对象的操作一样.
可是等等!这仍然没有回答为什么额外代码在那里用于非数字.length的问题.毕竟,jQuery对象确实有一个数字.length,所以我们仍然没有为非数字情况执行代码.
因此除了处理jQuery对象之外,这部分代码必须用于某些目的.那可能是什么?
我们可以通过转到jQuery source repository并在src目录中找到具有merge:code(它恰好是core.js)的文件来找到更多信息.然后use the Blame button并在页面内搜索合并:代码以查看代码的提交注释.同样,我们现在想知道的代码是else子句,其中typeof l不是数字.
The commit是在2009年12月9日John Resig,发表评论“重写合并()(现在更快,更少钝).修正了#5610.”在该页面的讨论中存在一些争议:
Well, your version is faster only in the special (very rare) case of overwritted length property. In all other cases, my one was little faster.
Also you are not considering the case obj.length = new Number(N) – but yeah it is not so relevant I suppose.
这有助于解释一下,但问题是什么#5610?也许这会告诉我们.在GitHub回购中没有看到问题跟踪器? jQuery有自己的issue tracker,如果我们在那里搜索#5610(或者谷歌搜索jquery问题5610,我们终于找到了issue #5610:
MAKEARRAY会导致浏览器在具有长度属性的非阵列物体上发生崩溃
描述
我没有用1.4测试过这个
对于具有强制转换为非零正整数的length属性的对象,makeArray将创建一个填充了undefined的长度的数组.
>>> jQuery.makeArray({'length': '5'})
[undefined, undefined, undefined, undefined, undefined]
如果length属性为零,负数或小数,则Firefox和Safari都会挂起. (FF显示无响应的脚本错误,Safari挂起,直到崩溃)
>>> jQuery.makeArray({'length': '0'})
>>> jQuery.makeArray({'length': '5.2'})
>>> jQuery.makeArray({'length': '-3'})
内容总结
以上是互联网集市为您收集整理的javascript – jQuery merge()和array.length数据类型全部内容,希望文章能够帮你解决javascript – jQuery merge()和array.length数据类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。