我有这个变量:
var stars = this.parentNode.children
,其值为:
[span.rate, span.rate, span.rate.rated, span.rate.rated, span.rate.rated]
现在我要反转它,但如果我尝试:
stars.reverse()
我获得了
Uncaught TypeError: stars.reverse is not a functionupdateRateStar @ app.js:75(anonymous function) @ app.js:98
我无法理解为什么它适用于如下数组:
[1,2,3]
所以,如果我尝试:
[1,2,3].reverse()
它有效。因此我无法理解这个问题
答案 0 :(得分:6)
您无法在Array.prototype.reverse
上致电NodeListCollection
。相反,你应该使用:
var stars = [].slice.call(stars, 0).reverse()
答案 1 :(得分:4)
使用
var revArray = Array.prototype.slice.apply( a ).reverse()
原因是你有一个NodeList而不是一个数组。在许多情况下,两者的行为相似,但NodeList没有数组方法。
使用
Array.prototype.slice.apply( a )
部分,我们将NodeList转换为一个数组,而不是可以反转的。
答案 2 :(得分:2)
这是一个NodeList,它没有反向。您可以使用:
告诉对象的原型(如其他语言中的类)Object.prototype.toString.call(stars)
返回[object NodeList]
。数组将返回[object Array]
。
如果您拥有原型(即,这不是库),您可以运行:
NodeList.prototype.reverse = Array.prototype.reverse
然后
stars.reverse()
会工作吗?与不断借用Array的方法相比,这更符合逻辑和令人愉悦。
再次,你在这里拥有原型,请注意,如果浏览器将来添加原型,你可以修复它。你可能更喜欢:
NodeList.prototype.sirkoReverse = Array.prototype.reverse
哪些仍然可以很好地阅读,但不太可能发生冲突。
答案 3 :(得分:1)
它有不同的类型,例如 NodeList 和数组。
我建议你使用这个功能:
var reverse = function(arr) {
var result = [];
for (var i = arr.length - 1;i !== 0;i--) {
result.push(arr[i]);
}
return result;
}
第二种变化:
function xorSwapHalf(array)
{
var i = null;
var r = null;
var length = array.length;
for (i = 0; i < length / 2; i += 1)
{
r = length - 1 - i;
var left = array[i];
var right = array[r];
left ^= right;
right ^= left;
left ^= right;
array[i] = left;
array[r] = right;
}
return array;
}
另一种称为解构分配的交换方法:http://wiki.ecmascript.org/doku.php?id=harmony:destructuring
解构分配:
function destructuringSwap(array)
{
var left = null;
var right = null;
var length = array.length;
for (left = 0, right = length - 1; left < right; left += 1, right -= 1)
{
[array[left], array[right]] = [array[right], array[left]];
}
return array;
}