如果您的代码必须在任意环境中工作,那么向内置对象添加属性并不是一个好主意。如果您确实扩展了此类对象,则不应使用其他人可能会使用的属性名称来做相同或类似的事情。
似乎有不止一种方法可以“移动”一个成员,你似乎在做的事情可以更好地命名为“交换”,所以:
if (!Array.prototype.swap) {
Array.prototype.swap = function(a, b) {
var t = this[a];
this[a] = this[b];
this[b] = t;
}
}
我希望简单地重新分配值比调用需要创建新数组并多次修改旧数组的方法更有效。但无论如何,这可能没有实际意义。上面的内容当然更容易阅读,并且输入的字符更少。
另请注意,以上是稳定的,array.swap(4,8)
给出与 相同的结果array.swap(8,4)
。
如果你想创建一个健壮的函数,你首先需要弄清楚在任何一个索引大于 array.length 或者一个不存在的情况下该怎么做,等等。例如
var a = [,,2]; // a has length 3
a.swap(0,2);
在上面,没有成员在 0 或 1,只有在 2。所以结果应该是:
a = [2]; // a has length 1
或者应该是(这将是上述结果):
a = [2,,undefined]; // a has length 3
或者
a = [2,,,]; // a has length 3 (IE may think it's 4, but that's wrong)
编辑
请注意,在 OP 中,结果为:
var b = [,,2];
b.move(0,2);
是
alert(b); // [,2,];
这可能不是预期的,并且
b.move(2,0);
alert(b); // [2,,];
所以它也不稳定。