Even though it looks superficially like slice
and substring
do the same thing, the big difference is in how they handle negative arguments.
When JavaScript was first created in Netscape 2.0, there was just a substring
method. If either of its arguments are negative, they are treated as 0.
When JavaScript 1.2 was introduced with Netscape 4.0, they wanted to add the behavior of allowing negative indexes to mean distances from the end of the string. They couldn't change substring
to have this new behavior because it would break backward compatibility with scripts that expected negative indexes to be treated as 0, so they had to create a new function to support the added feature. This function was called slice
, and was implemented on Array
as well as String
.
Another, smaller difference is that with substring
the order of the arguments doesn't matter, so substring(1, 4)
is the same as substring(4, 1)
. With slice
, order does matter, so slice(4, 1)
will just yield an empty string.