對于任何JavaScript開發(fā)人員來說删壮,這確實是必需要掌握的!
## 1.三元運算符
當您只想if..else在一行中編寫一條語句時舍扰,這是一個很好的代碼保護程序砖茸。
<blockquote>
? ? const x = 20;
? ? let answer;
? ? if (x > 10) {
? ? ? ? answer = "greater than 10";
? ? } else {
? ? ? ? answer =? "less than 10";
? ? }
</blockquote>
我們可以這樣優(yōu)化:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const answer = x > 10 ? "greater than 10" : "less than 10";
</blockquote>
您還可以像這樣嵌套您的語句:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const answer = x > 10 ? "greater than 10" : x < 5 ? "less than 5" : "between 5 and 10";
</blockquote>
## 2.短路運算符
在將變量值分配給另一個變量時,您可能要確保源變量不為null碉碉,未定義或為空柴钻。您可以編寫if帶有多個條件的長語句,也可以使用短路運算符垢粮。
<blockquote>
? ? if (variable1 !== null || variable1 !== undefined || variable1 !== '') {
? ? let variable2 = variable1;
? ? }
</blockquote>
我們可以這樣優(yōu)化:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const variable2 = variable1? || 'new';
? ? let variable1;
? ? let variable2 = variable1? || 'bar';
? ? console.log(variable2 === 'bar'); // prints true
? ? variable1 = 'foo';
? ? variable2 = variable1? || 'bar';
? ? console.log(variable2); // prints foo
</blockquote>
請注意贴届,如果設置variable1為false或0,bar則將分配值。
## 3.聲明變量
在函數(shù)開始時聲明變量分配是一種很好的做法毫蚓。當同時聲明多個變量時占键,這種簡化方法可以節(jié)省大量時間和空間。
<blockquote>
? ? let x;
? ? let y;
? ? let z = 3;
</blockquote>
我們可以這樣優(yōu)化:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? let x, y, z=3;
</blockquote>
## 4.if語句
這可能微不足道元潘,但值得一提畔乙。執(zhí)行if檢查時,有時可以省略賦值運算符翩概。
<blockquote>
? ? if (likeJavaScript === true)
</blockquote>
我們可以這樣優(yōu)化:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? if (likeJavaScript)
</blockquote>
注意:這兩個示例并不完全相等啸澡,因為只要likeJavaScript是真實值,條件檢查就會通過氮帐。
這是另一個例子嗅虏。如果a不等于true,則執(zhí)行某些操作上沐。
<blockquote style='background-color: #ffffcc;border-left: 4px solid #ffeb3b;'>
? ? let a;
? ? if ( a !== true ) {
? ? // do something...
? ? }
? ? let a;
? ? if ( !a ) {
? ? // do something...
? ? }
</blockquote>
5. JavaScript For循環(huán)
如果您需要純JavaScript且不想依賴外部庫(例如jQuery或lodash)皮服,則此小技巧非常有用。
<blockquote>
? ? const fruits = ['mango', 'peach', 'banana'];
? ? for (let i = 0; i < fruits.length; i++)
</blockquote>
我們可以這樣優(yōu)化:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? for (let fruit of fruits)
</blockquote>
如果您只想訪問索引参咙,請執(zhí)行以下操作:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? for (let index in fruits)
</blockquote>
如果要訪問文字對象中的鍵龄广,這也將起作用:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const obj = {continent: 'Africa', country: 'Kenya', city: 'Nairobi'}
? ? for (let key in obj)
? ? console.log(key) // output: continent, country, city
</blockquote>
Array.forEach的簡寫:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? function logArrayElements(element, index, array) {
? ? console.log("a[" + index + "] = " + element);
? ? }
? ? [2, 5, 9].forEach(logArrayElements);
? ? // a[0] = 2
? ? // a[1] = 5
? ? // a[2] = 9
</blockquote>
## 6.短路運算
如果目標參數(shù)為null或未定義,則無需編寫六行代碼來分配默認值蕴侧,我們只需使用短路邏輯運算符并僅用一行代碼即可完成相同的操作择同。
<blockquote>
? ? let dbHost;
? ? if (process.env.DB_HOST) {
? ? dbHost = process.env.DB_HOST;
? ? } else {
? ? dbHost = 'localhost';
? ? }
</blockquote>
我可以簡化如下:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const dbHost = process.env.DB_HOST || 'localhost';
</blockquote>
## 7.小數(shù)基指數(shù)
您可能已經(jīng)看到了這一周圍。從本質上講净宵,這是寫數(shù)字而沒有尾隨零的一種奇特的方式敲才。例如,1e7本質上是指1后跟7個零择葡。它代表一個等于10,000,000的十進制基數(shù)(JavaScript將其解釋為浮點類型)紧武。
<blockquote>
? ? for (let i = 0; i < 10000; i++) {}
</blockquote>
可以簡化成如下:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? for (let i = 0; i < 1e7; i++) {}
? ? // All the below will evaluate to true
? ? 1e0 === 1;
? ? 1e1 === 10;
? ? 1e2 === 100;
? ? 1e3 === 1000;
? ? 1e4 === 10000;
? ? 1e5 === 100000;
</blockquote>
## 8.對象屬性
在JavaScript中定義對象文字可以使工作更加輕松。ES6提供了一種更為簡便的將屬性分配給對象的方法敏储。如果變量名與對象鍵相同阻星,則可以省略一個。
<blockquote>
? ? const x = 1920, y = 1080;
? ? const obj = { x:x, y:y };
</blockquote>
簡寫如下:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const obj = { x, y };
</blockquote>
## 9.箭頭函數(shù)
普通函數(shù)很容易以其簡單的形式進行讀寫已添,但是一旦您開始將其嵌套在其他函數(shù)調用中妥箕,它們的確會變得有些冗長和混亂。
<blockquote>
? ? function sayHello(name) {
? ? console.log('Hello', name);
? ? }
? ? setTimeout(function() {
? ? console.log('Loaded')
? ? }, 2000);
? ? list.forEach(function(item) {
? ? console.log(item);
? ? });
</blockquote>
重要的是要注意更舞,this箭頭函數(shù)內(nèi)部的值與普通函數(shù)的不同畦幢,因此這兩個示例并非嚴格等效。有關更多詳細信息疏哗,請參見本文有關箭頭函數(shù)語法的內(nèi)容呛讲。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? sayHello = name => console.log('Hello', name);
? ? setTimeout(() => console.log('Loaded'), 2000);
? ? list.forEach(item => console.log(item));
</blockquote>
## 10.隱式return
`return`是我們經(jīng)常用來返回函數(shù)最終結果的關鍵字禾怠。帶有單個語句的箭頭函數(shù)將隱式返回其評估結果(該函數(shù)必須省略花括號({})才能省略return關鍵字)返奉。
<blockquote>
? ? function calcCircumference(diameter) {
? ? return Math.PI * diameter
? ? }
</blockquote>
要返回多行語句(例??如對象文字)贝搁,有必要使用()而不是{}包裝函數(shù)主體。這樣可以確保將代碼作為單個語句進行評估芽偏。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? calcCircumference = diameter => (
? ? ? ? Math.PI * diameter;
? ? )
</blockquote>
## 11.默認參數(shù)值
您可以使用該if語句來定義函數(shù)參數(shù)的默認值雷逆。
<blockquote>
? ? function volume(l, w, h) {
? ? ? ? if (w === undefined)
? ? ? ? ? ? w = 3;
? ? ? ? if (h === undefined)
? ? ? ? ? ? h = 4;
? ? ? ? return l * w * h;
? ? }
</blockquote>
在ES6中,可以在函數(shù)聲明本身中定義默認值污尉。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? volume = (l, w = 3, h = 4 ) => (l * w * h);
? ? volume(2) //output: 24
</blockquote>
## 12.模板文字
您是否不厭倦使用' + '多個變量連接到字符串中膀哲?有沒有更簡單的方法可以做到這一點?
<blockquote>
? ? const welcome = 'You have logged in as ' + first + ' ' + last + '.'
? ? const db = 'http://' + host + ':' + port + '/' + database;
</blockquote>
如果您能夠使用ES6被碗,那么您很幸運某宪。您需要做的就是使用反引號,并將${}其括起來锐朴。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const welcome = `You have logged in as ${first} ${last}`;
? ? const db = `http://${host}:${port}/${database}`;
</blockquote>
## 13.銷毀分配
如果您正在使用任何流行的Web框架兴喂,則很有可能會使用對象文字形式的數(shù)組或數(shù)據(jù)在組件和API之間傳遞信息。
<blockquote>
? ? const observable = require('mobx/observable');
? ? const action = require('mobx/action');
? ? const runInAction = require('mobx/runInAction');
? ? const store = this.props.store;
? ? const form = this.props.form;
? ? const loading = this.props.loading;
? ? const errors = this.props.errors;
? ? const entity = this.props.entity;
</blockquote>
數(shù)據(jù)對象到達組件后焚志,您需要解壓縮它衣迷。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? import { observable, action, runInAction } from 'mobx';
? ? const { store, form, loading, errors, entity } = this.props;
</blockquote>
您甚至可以分配自己的變量名:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const { store, form, loading, errors, entity:contact } = this.props;
</blockquote>
## 14.多行字符串
如果您發(fā)現(xiàn)自己需要在代碼中編寫多行字符串,則可以這樣編寫:
<blockquote>
? ? const lorem = 'Lorem ipsum dolor sit amet, consectetur\n\t'
? ? + 'adipisicing elit, sed do eiusmod tempor incididunt\n\t'
? ? + 'ut labore et dolore magna aliqua. Ut enim ad minim\n\t'
? ? + 'veniam, quis nostrud exercitation ullamco laboris\n\t'
? ? + 'nisi ut aliquip ex ea commodo consequat. Duis aute\n\t'
? ? + 'irure dolor in reprehenderit in voluptate velit esse.\n\t'
</blockquote>
但是酱酬,有一種更簡單的方法壶谒。只需使用反引號即可。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const lorem = `Lorem ipsum dolor sit amet, consectetur
? ? adipisicing elit, sed do eiusmod tempor incididunt
? ? ut labore et dolore magna aliqua. Ut enim ad minim
? ? veniam, quis nostrud exercitation ullamco laboris
? ? nisi ut aliquip ex ea commodo consequat. Duis aute
? ? irure dolor in reprehenderit in voluptate velit esse.`
</blockquote>
## 15.解構運算符
ES6中引入的解構運算符具有多個用例膳沽,這些用例使JavaScript代碼更加高效和有趣汗菜。
<blockquote>
? ? // joining arrays
? ? const odd = [1, 3, 5];
? ? const nums = [2 ,4 , 6].concat(odd);
? ? // cloning arrays
? ? const arr = [1, 2, 3, 4];
? ? const arr2 = arr.slice()
</blockquote>
它可以用來替換某些數(shù)組函數(shù)。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? // joining arrays
? ? const odd = [1, 3, 5 ];
? ? const nums = [2 ,4 , 6, ...odd];
? ? console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]
? ? // cloning arrays
? ? const arr = [1, 2, 3, 4];
? ? const arr2 = [...arr];
</blockquote>
與該concat()函數(shù)不同挑社,可以使用解構運算符在另一個數(shù)組內(nèi)的任何位置插入一個數(shù)組呵俏。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const odd = [1, 3, 5 ];
? ? const nums = [2, ...odd, 4 , 6];
</blockquote>
您還可以與ES6解構符號結合使用:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 };
? ? console.log(a) // 1
? ? console.log(b) // 2
? ? console.log(z) // { c: 3, d: 4 }
</blockquote>
## 16.強制參數(shù)
如果未傳遞值,默認情況下滔灶,JavaScript會將函數(shù)參數(shù)設置為undefined普碎。其他一些語言將引發(fā)警告或錯誤。
<blockquote>
? ? function foo(bar) {
? ? ? ? if(bar === undefined) {
? ? ? ? ? ? throw new Error('Missing parameter!');
? ? ? ? }
? ? ? ? return bar;
? ? }
</blockquote>
要強制進行參數(shù)分配录平,可以在時使用if語句引發(fā)錯誤undefined麻车。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? mandatory = () => {
? ? ? ? throw new Error('Missing parameter!');
? ? }
? ? foo = (bar = mandatory()) => {
? ? ? ? return bar;
? ? }
</blockquote>
## 17. Array.find
如果您曾被要求使用純JavaScript編寫find函數(shù),那么您可能會使用for循環(huán)斗这。
<blockquote>
? ? const pets = [
? ? ? ? { type: 'Dog', name: 'Max'},
? ? ? ? { type: 'Cat', name: 'Karl'},
? ? ? ? { type: 'Dog', name: 'Tommy'},
? ? ? ? ]
? ? function findDog(name) {
? ? ? ? for(let i = 0; i<pets.length; ++i) {
? ? ? ? ? ? if(pets[i].type === 'Dog' && pets[i].name === name) {
? ? ? ? ? ? return pets[i];
? ? ? ? ? ? }
? ? ? ? }
? ? }
</blockquote>
在ES6中动猬,find()引入了一個名為的新數(shù)組函數(shù)。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? pet = pets.find(pet => pet.type ==='Dog' && pet.name === 'Tommy');
? ? console.log(pet); // { type: 'Dog', name: 'Tommy' }
</blockquote>
## 18.對象[鍵]
您知道嗎表箭,F(xiàn)oo.bar也可以寫成Foo['bar']赁咙,首先,似乎沒有理由應該這樣寫。但是彼水,此符號為您提供了編寫可重用代碼的基礎崔拥。
考慮以下簡化的驗證功能示例:
<blockquote>
? ? function validate(values) {
? ? ? ? if(!values.first)
? ? ? ? ? ? return false;
? ? ? ? if(!values.last)
? ? ? ? ? ? return false;
? ? ? ? return true;
? ? }
? ? console.log(validate({first:'Bruce',last:'Wayne'})); // true
</blockquote>
此功能可以完美地完成其工作。但是凤覆,請考慮以下情況:您有很多表單需要應用驗證链瓦,但是具有不同的字段和規(guī)則。構建可以在運行時配置的通用驗證功能不是很好嗎盯桦?
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? // object validation rules
? ? const schema = {
? ? ? ? first: {
? ? ? ? ? ? required:true
? ? ? ? },
? ? ? ? last: {
? ? ? ? ? ? required:true
? ? ? ? }
? ? }
? ? // universal validation function
? ? const validate = (schema, values) => {
? ? for(field in schema) {
? ? ? ? if(schema[field].required) {
? ? ? ? if(!values[field]) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? }
? ? }
? ? return true;
? ? }
? ? console.log(validate(schema, {first:'Bruce'})); // false
? ? console.log(validate(schema, {first:'Bruce',last:'Wayne'})); // true
</blockquote>
現(xiàn)在我們有了一個驗證函數(shù)慈俯,我們可以在所有形式中重復使用,而無需為每種形式編寫自定義驗證函數(shù)拥峦。
## 19. Double Bitwise NOT簡寫
按位運算符是您在初學者JavaScript教程中了解的功能之一贴膘,而您永遠無法在任何地方實現(xiàn)它們。此外略号,如果您不處理二進制刑峡,誰愿意使用1和0?
但是璃哟,Double Bitwise NOT運算符有一個非常實用的用例氛琢。您可以用它代替Math.floor()。Double Bitwise NOT運算符的優(yōu)點是執(zhí)行相同操作的速度更快随闪。您可以在此處閱讀有關Bitwise運算符的更多信息阳似。
<blockquote>
? ? Math.floor(4.9) === 4? //true
</blockquote>
可以這樣寫:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? ~~4.9 === 4? //true
</blockquote>
## 20.指數(shù)冪速記
<blockquote>
? ? Math.pow(2,3); // 8
? ? Math.pow(2,2); // 4
? ? Math.pow(4,3); // 64
</blockquote>
可以這樣寫:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? 2**3 // 8
? ? 2**4 // 4
? ? 4**3 // 64?
</blockquote>
## 21.將字符串轉換為數(shù)字
有時,您的代碼會收到字符串格式的數(shù)據(jù)铐伴,但需要以數(shù)字格式進行處理撮奏。沒什么大不了的,我們可以執(zhí)行快速轉換当宴。
<blockquote>
? ? const num1 = parseInt("100");
? ? const num2 =? parseFloat("100.01");
</blockquote>
可以這樣寫:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const num1 = +"100"; // converts to int data type
? ? const num2 =? +"100.01"; // converts to float data type
</blockquote>
## 22.對象屬性分配
考慮以下代碼:
<blockquote>
? ? let fname = { firstName : 'Black' };
? ? let lname = { lastName : 'Panther'}
</blockquote>
您如何將它們合并為一個對象畜吊?一種方法是編寫一個將數(shù)據(jù)從第二個對象復制到第一個對象的函數(shù)。不幸的是户矢,這可能不是您想要的-您可能需要創(chuàng)建一個全新的對象而不更改任何現(xiàn)有對象玲献。最簡單的方法是使用Object.assignES6中引入的功能:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? let full_names = Object.assign(fname, lname);
</blockquote>
您還可以使用ES8中引入的對象解構符號:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? let full_names = {...fname, ...lname};
</blockquote>
可以合并的對象屬性的數(shù)量沒有限制。如果確實具有具有相同屬性名稱的對象梯浪,則值將按照它們被合并的順序被覆蓋捌年。
## 23.按位索引
使用數(shù)組執(zhí)行查找時,該indexOf()函數(shù)用于檢索要查找的項目的位置挂洛。如果找不到該項目礼预,-1則返回該值。
<blockquote>
? ? if(arr.indexOf(item) > -1) { // Confirm item IS found
? ? }
? ? if(arr.indexOf(item) === -1) { // Confirm item IS NOT found
? ? }
</blockquote>
在JavaScript中虏劲,數(shù)字0被認為是“虛假的”托酸,而大于或小于數(shù)字0則被認為是“真實的”褒颈。結果,必須編寫這樣的正確代碼励堡。
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? if(~arr.indexOf(item)) { // Confirm item IS found
? ? }
? ? if(!~arr.indexOf(item)) { // Confirm item IS NOT found
? ? }
? ? 除了以外谷丸,bitwise(~)運算符將返回真實值-1。否定它就像這樣做一樣簡單!~念秧。另外淤井,我們也可以使用以下includes()功能:
? ? if(arr.includes(item)) { // Returns true if the item exists, false if it doesn't
? ? }
</blockquote>
## 24. Object.entries()
這是ES8中引入的一項功能布疼,使您可以將文字對象轉換為鍵/值對數(shù)組摊趾。請參閱以下示例:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const credits = { producer: 'John', director: 'Jane', assistant: 'Peter' };
? ? const arr = Object.entries(credits);
? ? console.log(arr);
? ? /** Output:
? ? [ [ 'producer', 'John' ],
? ? [ 'director', 'Jane' ],
? ? [ 'assistant', 'Peter' ]
? ? ]
? ? **/
</blockquote>
## 25. Object.values()
這也是ES8中引入的新功能,其功能與相似Object.entries()游两,但沒有關鍵部分:
<blockquote style='border-left: 4px solid #4CAF50;'>
? ? const credits = { producer: 'John', director: 'Jane', assistant: 'Peter' };
? ? const arr = Object.values(credits);
? ? console.log(arr);
? ? /** Output:
? ? [ 'John', 'Jane', 'Peter' ]
? ? **/
</blockquote>
如果您感覺文章對您有幫助砾层,請幫忙點個贊吧!謝謝贱案!??
查看原文點擊<a >這里</a>