<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaScript &#8211; 寂静花园</title>
	<atom:link href="https://www.addesp.com/archives/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Fri, 02 Oct 2020 15:28:33 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>为什么 JavaScript String 会有 slice() 和 substring() 这两个方法？</title>
		<link>https://www.addesp.com/archives/1902</link>
					<comments>https://www.addesp.com/archives/1902#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Thu, 01 Oct 2020 16:17:57 +0000</pubDate>
				<category><![CDATA[笔记]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=1902</guid>

					<description><![CDATA[slice() 和 substring() 这两个方法都可以截取字符串，那么为什么会设计这两个 API 呢？]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">写在前面</h2>



<p class="wp-block-paragraph"><code>slice()</code> 和 <code>substring(</code>) 这两个方法都可以截取字符串，那么为什么会设计这两个 API 呢？</p>



<h2 class="wp-block-heading">二者的区别</h2>



<p class="wp-block-paragraph"><code>substring()</code> 和 <code>slice()</code> 方法几乎是相同的，但两者之间有一些微妙的区别，特别是在处理负参数的方式上。</p>



<p class="wp-block-paragraph">如果 <code>indexStart</code> 大于 <code>indexEnd</code>，<code>substring()</code> 方法会交换两个参数，这意味着仍然会返回一个字符串。但是 <code>slice()</code> 方法面对这种情况会返回一个空字符串。</p>



<pre class="wp-block-code"><code>let text = 'Mozilla'
console.log(text.substring(5, 2))  // => "zil" 
console.log(text.slice(5, 2))      // => ""</code></pre>



<p class="wp-block-paragraph">如果参数中的一个或两个都是负数或 <code>NaN</code>，则 <code>substring()</code> 将它们当作 0 处理。</p>



<pre class="wp-block-code"><code>console.log(text.substring(-5, 2))  // => "Mo"
console.log(text.substring(-5, -2)) // => "" </code></pre>



<p class="wp-block-paragraph"><code>slice()</code> 也将 <code>NaN</code> 参数视为 0，但当它为负时，它会从字符串的末尾向前数，以找到索引。</p>



<pre class="wp-block-code"><code>console.log(text.slice(-5, 2))   // => ""
console.log(text.slice(-5, -2))  // => "zil"</code></pre>



<h2 class="wp-block-heading">共存的原因</h2>



<p class="wp-block-paragraph">乍一看 <code>slice()</code> 和 <code>substring()</code> 做的是同样的事情，但最大的区别在于它们如何处理负参数。</p>



<p class="wp-block-paragraph">当 Netscape 2.0 首次实现 JavaScript 时，只有一个 <code>substring()</code> 方法。如果它的任何一个参数是负数，就会被当作 0 处理。</p>



<p class="wp-block-paragraph">当 Netscape 4.0 引入 JavaScript 1.2 后，他们希望通过支持负索引来从反向遍历字符串。不过不能修改 <code>substring()</code> 的行为 ，因为这会破坏现有的代码的兼容性，所以只能创建一个新的函数来支持新增的功能。这个函数就是 <code>slice()</code>，在 <code>Array</code> 和 <code>String</code> 上都实现了。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring" target="_blank" rel="noreferrer noopener">String.prototype.substring() &#8211; JavaScript | MDN</a></li><li><a href="https://stackoverflow.com/questions/18224226/why-two-different-methods-slice-substring" target="_blank" rel="noreferrer noopener">javascript &#8211; Why two different methods slice() &amp; substring()? &#8211; Stack Overflow</a></li><li><a href="https://www.arungudelli.com/tutorial/javascript/javascript-string-substring-vs-string-substr-vs-string-slice-differences/" target="_blank" rel="noreferrer noopener">JavaScript Substring Vs Substr Vs Slice Differences With Examples | Arunkumar Blog</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/1902/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
