Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嘶嘶声推涂_Javascript_Sizzle - Fatal编程技术网

Javascript 嘶嘶声推涂

Javascript 嘶嘶声推涂,javascript,sizzle,Javascript,Sizzle,为什么Sizzle选择器引擎会使用push.apply(结果…)overresults.push(…)对我来说似乎没有必要。有人能解释一下动机吗 更详细地说,我开始对编写/借用sizzle的一些代码来开发更轻的选择器引擎感兴趣。我想我不需要像:contains(text)这样的东西,这样可以进一步减轻重量。所以通过阅读我看到的来源 var arr = [], push = arr.push results = results || []; .... push.apply( r

为什么Sizzle选择器引擎会使用
push.apply(结果…)
over
results.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])
vs
a.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