Javascript 嘶嘶声推涂
为什么Sizzle选择器引擎会使用Javascript 嘶嘶声推涂,javascript,sizzle,Javascript,Sizzle,为什么Sizzle选择器引擎会使用push.apply(结果…)overresults.push(…)对我来说似乎没有必要。有人能解释一下动机吗 更详细地说,我开始对编写/借用sizzle的一些代码来开发更轻的选择器引擎感兴趣。我想我不需要像:contains(text)这样的东西,这样可以进一步减轻重量。所以通过阅读我看到的来源 var arr = [], push = arr.push results = results || []; .... push.apply( r
push.apply(结果…)
overresults.push(…)
对我来说似乎没有必要。有人能解释一下动机吗
更详细地说,我开始对编写/借用sizzle的一些代码来开发更轻的选择器引擎感兴趣。我想我不需要像:contains(text)
这样的东西,这样可以进一步减轻重量。所以通过阅读我看到的来源
var arr = [],
push = arr.push
results = results || [];
....
push.apply( results, context.getElementsByTagName( selector ) );
这段代码是有意义的,只是使用起来不是更简单吗
results.push( context.getElementsByTagName( selector ) );
我不想对这样一个小小的会议唠叨不休,我只想知道我是否遗漏了一些东西,比如上下文问题。它不是:
results.concat(array)
因为
concat
创建了一个额外的数组,但是push.apply
不会:
push.apply(results, array)
将缓存结果
数组,并且不会创建额外的数组
但你也可以这样做:
results.push.apply(results, array)
我不知道为什么需要arr
编辑:
我认为额外的
arr
可能需要将getElementsByTagName
返回的伪数组转换为真实数组。再次查看代码(休息后)。在第205行附近,Sizzle检查选择器模式是否为ID,并使用results.push
elem = context.getElementById( m );
results.push( elem );
return results;
第237行之后是元素或类,使用getElementsByTagName
或getElementsByClassName
以及push.apply(结果,…)
我想这是一个简写版本的
for( elem in context.getElementsByClassName( m ) ) {
results.push( elem );
}
就像Mozzila文档示例中的情况一样
比较
var a=[1];a、 推挤([2,3])
vsa.push.apply(a[2,3])
。我没有遵循concat
参考。array.push返回新数组的长度,据我所知,它不会在内部复制数组concat
每次使用时都会创建一个额外的数组,push
不会。请参阅第2点--“让A成为一个新数组,就像由表达式new array()创建一样,其中array是具有该名称的标准内置构造函数”。--正确的!对不起,我没有把concat作为push的替代品,完全没有抓住你的重点。我一直在关注apply的使用(并且想知道为什么您会提出一个不同的函数)。这是有道理的,而且会更快!因此,效率低下的版本是:results.concat([].slice.call(context.getElementsByTagName(selector))
// short hand
var max = Math.max.apply(null, numbers);
var min = Math.min.apply(null, numbers);
/* vs. simple loop based algorithm */
max = -Infinity, min = +Infinity;
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] > max)
max = numbers[i];
if (numbers[i] < min)
min = numbers[i];
}
var a = [1, 2, 3], b = [], c =[];
b.push( a ); // b.length = 1, now we have a multidimensional array
[].push.apply( c, a ); // c.length = 3, we now have a clean array, not a NodeList