10个最佳ES6特性

BeaReda 2年前
   <p>ES6,正式名称是 <strong>ECMAScript2015</strong> ,但是 <strong>ES6</strong> 这个名称更加简洁。 <strong>ES6</strong> 已经不再是JavaScript最新的标准,但是它已经广泛用于编程实践中。如果你还没用过 <strong>ES6</strong> ,现在还不算太晚…</p>    <p>下面是10个ES6最佳特性,排名不分先后:</p>    <ul>     <li>函数参数默认值</li>     <li>模板字符串</li>     <li>多行字符串</li>     <li>解构赋值</li>     <li>对象属性简写</li>     <li>箭头函数</li>     <li>Promise</li>     <li>Let与Const</li>     <li>类</li>     <li>模块化</li>    </ul>    <h2>1. 函数参数默认值</h2>    <p>不使用ES6</p>    <p>为函数的参数设置默认值:</p>    <pre>  <code class="language-javascript">function foo(height, color)  {   var height = height || 50;   var color = color || 'red';   //...  }  </code></pre>    <p>这样写一般没问题,但是,当参数的布尔值为 <strong>false</strong> 时,是会出事情的!比如,我们这样调用 <strong>foo</strong> 函数:</p>    <pre>  <code class="language-javascript">foo(0, "", "")  </code></pre>    <p>因为 <strong>0</strong> 的布尔值为 <strong>false</strong> ,这样 <strong>height</strong> 的取值将是 <strong>50</strong> 。同理 <strong>color</strong> 的取值为 <strong>‘red’</strong> 。</p>    <p>使用ES6</p>    <pre>  <code class="language-javascript">function foo(height = 50, color = 'red')  {   // ...  }  </code></pre>    <h2>2. 模板字符串</h2>    <p>不使用ES6</p>    <p>使用 <strong>+</strong> 号将变量拼接为字符串:</p>    <pre>  <code class="language-javascript">var name = 'Your name is ' + first + ' ' + last + '.'  </code></pre>    <p>使用ES6</p>    <p>将变量放在大括号之中:</p>    <pre>  <code class="language-javascript">var name = `Your name is ${first} ${last}.`  </code></pre>    <p>ES6的写法更加简洁、直观。</p>    <h2>3. 多行字符串</h2>    <p>不使用ES6</p>    <p>使用 <strong>“\n\t”</strong> 将多行字符串拼接起来:</p>    <pre>  <code class="language-javascript">var roadPoem = 'Then took the other, as just as fair,\n\t'   + 'And having perhaps the better claim\n\t'   + 'Because it was grassy and wanted wear,\n\t'   + 'Though as for that the passing there\n\t'   + 'Had worn them really about the same,\n\t'  </code></pre>    <p>使用ES6</p>    <p>将多行字符串放在反引号 <strong>``</strong> 之间就好了:</p>    <pre>  <code class="language-javascript">var roadPoem = `Then took the other, as just as fair,   And having perhaps the better claim   Because it was grassy and wanted wear,   Though as for that the passing there   Had worn them really about the same,`  </code></pre>    <h2>4. 解构赋值</h2>    <p>不使用ES6</p>    <p>当需要获取某个对象的属性值时,需要单独获取:</p>    <pre>  <code class="language-javascript">var data = $('body').data(); // data有house和mouse属性  var house = data.house;  var mouse = data.mouse;  </code></pre>    <p>使用ES6</p>    <p>一次性获取对象的子属性:</p>    <pre>  <code class="language-javascript">var { house, mouse} = $('body').data()  </code></pre>    <p>对于数组也是一样的:</p>    <pre>  <code class="language-javascript">var [col1, col2] = $('.column');  </code></pre>    <h2>5. 对象属性简写</h2>    <p>不使用ES6</p>    <p>对象中必须包含属性和值,显得非常多余:</p>    <pre>  <code class="language-javascript">var bar = 'bar';  var foo = function ()  {   // ...  }    var baz = {   bar: bar,   foo: foo  };  </code></pre>    <p>使用ES6</p>    <p>对象中直接写变量,非常简单:</p>    <pre>  <code class="language-javascript">var bar = 'bar';  var foo = function ()  {   // ...  }    var baz = { bar, foo };  </code></pre>    <h2>6. 箭头函数</h2>    <p>不使用ES6</p>    <p>普通函数体内的 <strong>this</strong> ,指向调用时所在的对象。</p>    <pre>  <code class="language-javascript">function foo()  {   console.log(this.id);  }    var id = 1;    foo(); // 输出1    foo.call({ id: 2 }); // 输出2  </code></pre>    <p>使用ES6</p>    <p>箭头函数体内的 <strong>this</strong> ,就是定义时所在的对象,而不是调用时所在的对象。</p>    <pre>  <code class="language-javascript">var foo = () => {   console.log(this.id);  }    var id = 1;    foo(); // 输出1    foo.call({ id: 2 }); // 输出1  </code></pre>    <h2>7. Promise</h2>    <p>不使用ES6</p>    <p>嵌套两个 <strong>setTimeout</strong> 回调函数:</p>    <pre>  <code class="language-javascript">setTimeout(function()  {   console.log('Hello'); // 1秒后输出"Hello"   setTimeout(function()   {   console.log('Fundebug'); // 2秒后输出"Fundebug"   }, 1000);  }, 1000);  </code></pre>    <p>使用ES6</p>    <p>使用两个 <strong>then</strong> 是异步编程串行化,避免了回调地狱:</p>    <pre>  <code class="language-javascript">var wait1000 = new Promise(function(resolve, reject)  {   setTimeout(resolve, 1000);  });    wait1000   .then(function()   {   console.log("Hello"); // 1秒后输出"Hello"   return wait1000;   })   .then(function()   {   console.log("Fundebug"); // 2秒后输出"Fundebug"   });  </code></pre>    <h2>8. Let与Const</h2>    <p>使用Var</p>    <p>var定义的变量未函数级作用域:</p>    <pre>  <code class="language-javascript">{   var a = 10;  }    console.log(a); // 输出10  </code></pre>    <p>使用let与const</p>    <p>let定义的变量为块级作用域,因此会报错:(如果你希望实时监控JavaScript应用的错误,欢迎免费使用 <a href="/misc/goto?guid=4959746568903379993" rel="nofollow,noindex">Fundebug</a> )</p>    <pre>  <code class="language-javascript">{   let a = 10;  }    console.log(a); // 报错“ReferenceError: a is not defined”  </code></pre>    <p>const与 <strong>let</strong> 一样,也是块级作用域。</p>    <h2>9. 类</h2>    <p>不使用ES6</p>    <p>使用构造函数创建对象:</p>    <pre>  <code class="language-javascript">function Point(x, y)  {   this.x = x;   this.y = y;   this.add = function()   {   return this.x + this.y;   };  }    var p = new Point(1, 2);    console.log(p.add()); // 输出3  </code></pre>    <p>使用ES6</p>    <p>使用 <strong>Class</strong> 定义类,更加规范,且你能够继承:</p>    <pre>  <code class="language-javascript">class Point  {   constructor(x, y)   {   this.x = x;   this.y = y;   }     add()   {   return this.x + this.y;   }  }    var p = new Point(1, 2);    console.log(p.add()); // 输出3  </code></pre>    <h2>10. 模块化</h2>    <p>JavaScript一直没有官方的模块化解决方案,开发者在实践中主要采用 <strong>CommonJS</strong> 和 <strong>AMD</strong> 规范。而 <strong>ES6</strong> 制定了模块(Module)功能。</p>    <p>不使用ES6</p>    <p>Node.js采用 <strong>CommenJS</strong> 规范实现了模块化,而前端也可以采用,只是在部署时需要使用 <a href="/misc/goto?guid=4958830652694960670" rel="nofollow,noindex">Browserify</a> 等工具打包。这里不妨介绍一下 <strong>CommenJS</strong> 规范。</p>    <p>module.js中使用 <strong>module.exports</strong> 导出 <strong>port</strong> 变量和 <strong>getAccounts</strong> 函数:</p>    <pre>  <code class="language-javascript">module.exports = {   port: 3000,   getAccounts: function(){   ...   }  }  </code></pre>    <p>main.js中使用 <strong>require</strong> 导入 <strong>module.js</strong> :</p>    <pre>  <code class="language-javascript">var service = require('module.js')  console.log(service.port) // 输出3000  </code></pre>    <p>使用ES6</p>    <p>ES6中使用 <strong>export</strong> 与 <strong>import</strong> 关键词实现模块化。</p>    <p>module.js中使用 <strong>export</strong> 导出 <strong>port</strong> 变量和 <strong>getAccounts</strong> 函数:</p>    <pre>  <code class="language-javascript">export var port = 3000  export function getAccounts(url){   ...  }  </code></pre>    <p>main.js中使用 <strong>import</strong> 导入 <strong>module.js</strong> ,可以指定需要导入的变量:</p>    <pre>  <code class="language-javascript">import {port, getAccounts} from 'module'  console.log(port) // 输出3000  </code></pre>    <p>也可以将全部变量导入:</p>    <pre>  <code class="language-javascript">import * as service from 'module'  console.log(service.port) // 3000  </code></pre>    <p> </p>    <p>来自:https://kiwenlau.com/2017/08/21/10-best-es6-feature/</p>    <p> </p>