Overwrite Array#concat method for handling the arguments object in Opera.

This commit is contained in:
Tobie Langel 2008-12-11 17:03:10 +01:00
parent 1395330440
commit 7f6b3e81a2
2 changed files with 18 additions and 6 deletions

View File

@ -134,14 +134,14 @@ Array.from = $A;
}
function concat() {
var array = [];
for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
var array = slice.call(this, 0), item;
for (var i = 0, length = arguments.length; i < length; i++) {
if (Object.isArray(arguments[i])) {
for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
array.push(arguments[i][j]);
item = arguments[i];
if (Object.isArray(item) && !('callee' in item)) {
for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
array.push(item[j]);
} else {
array.push(arguments[i]);
array.push(item);
}
}
return array;
@ -171,6 +171,13 @@ Array.from = $A;
toJSON: toJSON
});
// fix for opera
var CONCAT_ARGUMENTS_BUGGY = (function() {
return [].concat(arguments)[0][0] !== 1;
})(1,2)
if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
// use native browser JS 1.6 implementation if available
if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;

View File

@ -185,5 +185,10 @@ new Test.Unit.Runner({
this.assertEnumEqual(['a'], $w('a '));
this.assertEnumEqual(['a'], $w(' a'));
this.assertEnumEqual(['a', 'b', 'c', 'd'], $w(' a b\nc\t\nd\n'));
},
testConcat: function(){
var args = (function() { return [].concat(arguments) })(1, 2);
this.assertIdentical(1, args[0][0]);
}
});