Не совсем.
Посмотрите, что происходит, когда вы вызываете String.substring.call ("foo", 1) и String (). Substring.call ("foo", 2):
>>> String.substring.call("foo", 1)
"1"
>>> String().substring.call("foo", 1)
"oo"
Array.slice равно * , неправильно ссылающимся на функцию слайса, присоединенную к прототипу Array, и функцию слайса, присоединенную к любому экземпляру экземпляра Array (например, Array () или []).
Тот факт, что Array.slice вообще не равен нулю, является неверной реализацией самого объекта (/ function / constructor). Попробуйте запустить эквивалентный код в IE, и вы получите ошибку, что Array.slice имеет значение null .
Вот почему Array.slice не ведет себя правильно (как и String.substring).
Доказательство (следующее - это то, чего никогда не следует ожидать на основании определения slice () ... точно так же, как substring () выше):
>>> Array.slice.call([1,2], [3,4])
3,4
Теперь, если вы правильно вызовете slice () для экземпляра объекта или для прототипа Array, вы получите то, что ожидаете:
>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]
Больше доказательств ...
>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false