How does substring() differ from slice() in string manipulation?
const str = 'JavaScript';
const result = str.substring(4, 8);
substring() has unique characteristics: 1) Swaps arguments if start > end, 2) Treats negative indices as 0, 3) Less intuitive than slice() with negative values, 4) Maintains backward compatibility, 5) Part of original JavaScript string API, 6) Still widely used in legacy code, 7) Functions differently with invalid indices, 8) Important to understand for maintenance work.