It's not a deep copy. Yes, new memory is allocated for the array itself and its elements, but if objects are part of the array, they are copied as references. New objects are not created.
If it were a deep copy, changing an object stored in arr1 wouldn't change the corresponding object copied into arr2, but it does:
function copy(arr1, arr2) {
for (var i = 0; i < arr1.length; ++i) {
arr2[i] = arr1[i];
}
}
var arr1 = [1, 2, { 'foo': 'bar' }];
var arr2 = [];
copy(arr1, arr2);
console.dir(arr1);
console.dir(arr2);
arr1[2].foo = 'changed';
console.dir(arr1); // changed, of course
console.dir(arr2); // also changed. shallow copy.