亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript中的一些實用小技巧總結

2024-05-06 16:49:39
字體:
來源:轉載
供稿:網友

前言

這篇文章主要記錄一下平時自己實踐得到的, 博客中學習的以及在一些項目源碼中看到的 javascript 技巧。有些東西可以說是奇淫技巧,有些可能是 ES6+ 中一些比較具有實用性的新語法。

&& 和 || 的妙用

有時候我們需要在某個函數或變量為 true 時執行另外一個函數。例如:

const task1 = () => { console.log('執行 task1'); return Math.random() >= 0.5;}const task2 = () => console.log('task1 執行成功后執行 task2');if (task1()) task2();

上面的 if 語句可以使用 && 直接簡寫為:

task1() && task2();

如果還要在 task1 失敗(也就是task1返回false)后執行 task3, 可以使用:

const task3 = () => console.log('task1 執行失敗后執行 task3');task1() && task2() || task3();

本質上還是利用了 && 和 || 的短路特性。

其實這里使用條件運算符也是可以的:

task1() ? task2() : task3();

下面展示一個我最近使用 react hooks 開發的項目的的一個代碼片段:

const ProfileItem = (props) => { const { name, value, render } = props; return (  <div className="profile-item">   <span className="item-name">{name}</span>   <form action="">    {/* 根據是否有 render 這個 props 來返回不同的內容 */}    {render && render(props) || <SimpleProfileItemContent value={value}/>}   </form>  </div> )}

函數默認值

ES5 版本

使用短路或操作符來設置函數默認值的方式其實很常見。但是有一些坑,下面展示的代碼中當默認值參數為一個數字時,傳參為 0 還是會使用默認值,必須對 y 為 0 的時候單獨進行判斷。

const pow = (x, y) => { y = y || 2;  let result = 1; for (let i = 0, max = y; i < max; i++) {  result *= x; } return result;}console.log(pow(2)); // => 4console.log(pow(2, 3)); // => 8// 當 y 傳值為 0 時, y 取值 2console.log(pow(2, 0)); // => 4

ES6 版本

ES6 在語法層面提供的默認值語法就靠譜的多了

const pow = (x, y=2) => { let result = 1; for (let i = 0, max = y; i < max; i++) {  result *= x; } return result;}console.log(pow(2)); // => 4console.log(pow(2, 3)) // => 8console.log(pow(2, 0)); // => 1

類數組轉數組

類數組指的是像 arguments ,jquery 對象一樣可以使用下標訪問還有 length 屬性的和數組很像但并不是數組的一類對象。

類數組沒有 slice, map 等集合函數,這也是為什么我們有時候需要將類數組轉換成數組的原因。

function func() { for (let i = 0, max = arguments.length; i < max; i++) {  console.log(arguments[i]); } console.log(Array.isArray(arguments)); // => false // 類數組沒有 slice, forEach, map 等集合函數 console.log(arguments.slice === undefined); // => true}func('Google', 'facebook', 'Microsoft'); // => // Google// facebook// Microsoft

ES5 中的轉換方法

將 Array 原型中的 slice 方法綁定到 arguments 對象上調用,并且不傳參數目的為了讓其返回所有的元素。

function func() { const array = Array.prototype.slice.call(arguments); console.log(array.slice(0, 1));}func('Google', 'facebook', 'Microsoft'); // => [ 'Google' ]

ES6 中的轉換方法

ES6 將類數組轉換成數組的方法多一些。

使用擴展運算符

function func() { console.log([...arguments])}func('Google', 'facebook', 'Microsoft'); // [ 'Google', 'facebook', 'Microsoft' ]

使用 Array.from

function func() { console.log(Array.from(arguments))}func('Google', 'facebook', 'Microsoft'); // [ 'Google', 'facebook', 'Microsoft' ]

構造一個連續整數的數組

這里就直接給出我覺得最好的方法了

// 輸出 2 開始連續的8個整數const array = Array.from({ length: 8}).map((ele, index) => index + 2);console.log(array); // => [ 2, 3, 4, 5, 6, 7, 8, 9 ]?// 評論區指出有更簡潔的版本, Array.from 自帶的映射函數const array = Array.from({ length: 8}, (ele, index) => index + 2);console.log(array); // => [ 2, 3, 4, 5, 6, 7, 8, 9 ]?

函數參數使用解構賦值

函數參數比較多的時候我們往往會讓參數直接接受一個配置對象。但是使用對象參數我們無法設置默認值,在函數體中使用對象參數時還需要使用通過對象參數來訪問,當訪問次數比較多或者嵌套比較深就會覺得不方便。在函數參數中使用解構賦值就解決了上面的問題。

// 必須給對象參數設置默認值, 不然傳參數時因為沒有解構對象會報錯const getUsers = ({ offset=0, limit=1, orderBy="salary"}={}) => { // 根據條件查詢數據庫返回用戶數據 console.log({ offset, limit, orderBy });}getUsers({ offset: 10, limit: 20,orderBy: 'age' }); // => { offset: 10, limit: 20, orderBy: 'age' }getUsers();// => { offset: 0, limit: 1, orderBy: 'salary' }

使用 !! 將其它類型轉換成 bool 型

console.log(!!{}); // trueconsole.log(!!0); // falseconsole.log(!![]); // trueconsole.log(!!undefined); // falseconst httpGet = (url, retry) => { if (!!retry) {  // 超時重發 }}

JSON.stringify

深度克隆

使用先序列化再反序列化這種方式來深度克隆對象在一般情況下很方便,缺點就是無法克隆函數以及繼承的屬性。
如果還要克隆函數屬性,推薦使用 lodash 的 cloneDeep。

const me = {  name: 'lyreal666',  age: 23,  speak() {    console.log(`Hello, I'm ly!`);  }}const clonedMe = JSON.parse(JSON.stringify(me));console.log(clonedMe); // => { name: 'lyreal666', age: 23 }console.log(clonedMe.speak === undefined); // => true

使用第二個和第三參數

JSON.stringify 的第二個參數是用來對屬性值進行處理的,第三個參數則是用來指定輸出的 json 字符串的縮進長度,可以傳數字也可以傳字符串。

const me = {  name: 'lyreal666',  age: 23,  speak() {    console.log(`Hello, I'm ly!`);  }}const jsonStr = JSON.stringify(me, (key, value) => key === 'name' ? '老余' : value, 2);console.log(jsonStr);/* =>{ "name": "老余", "age": 23}*/

優雅的遍歷對像

使用解構賦值和 Object.entries。

const me = {  name: 'lyreal666',  age: 23,  speak() {    console.log(`Hello, I'm ly!`);  }}for (const [key, value] of Object.entries(me)) {  console.log(`${key}: ${value}`);}/* =>name: lyreal666age: 23speak: speak() {    console.log(`Hello, I'm ly!`);  }*/

清空數組的最快方法

評論區有人說這種直接修改 length 的做法是有問題的, 我之前也看過關于清空數組的方法的討論, 但是我覺得一般情況下這樣用是沒什么問題的, 既簡單, 又不用重新分配內存給新數組。

const array = [1, 2, 3, 4];array.length = 0;console.log(array); // => []// 網友指出可以更好的方式是直接賦值空數組let array = [1, 2, 3, 4];array = [];

判斷一個整數是否是 -1

// ~ 操作符的運算規律可以簡單記作將加一的結果取反console.log(~1); // => -2console.log(~0); // => -1console.log(~(-3)); // => 2console.log(~(-1)); // => 0const number = -2;// 判斷一個數是否為 -1if (!~number) {  // 當 number 是 -1 的操作...}

立即執行函數

立即執行函數可以讓我們的代碼中的變量不污染外部變量,常見的使用方式是像下面這樣的。

// 使用括號將函數括起來調用(function(window, $) {  // 內部代碼}) (window, jQuery)

更優雅的方式是下面這種,事實上很多其它的算術運算符比如 +, -, *, ~ 等也是可以的。

! function(window, $) {  // 內部代碼} (window, jQuery)// 還可以使用 +, -, * 等+ function(window, $) {  // 內部代碼} (window, jQuery)// 更神奇的是還可以用 new, typeof 等操作符new function(window, $) {  // 內部代碼} (window, jQuery);

使用 set 來對數組去重復

console.log([...new Set([1, 3, 1, 2, 2, 1])]); // => [ 1, 3, 2 ]

使用 reduce 連乘或連加

const array = [ 1, 2, 3, 4];// 連加console.log(array.reduce((p, c) => p + c)); // => 10// 連乘console.log(array.reduce((p, c) => p * c)); // => 24

取整

Math 中的一堆取整函數這里就不說了,主要是提一些比較巧妙地取整方式。

console.log(~~3.14); // => 3console.log(~~(-2.5)); // => -2console.log(6.18 | 0); // => 6console.log(-3.6 | 0); // => -3console.log(9.9 >> 0); // => 9console.log(-2.1 >> 0); // => -2// superagent 是一個很實用的發送 http 請求的 node 模塊,它對返回碼的處理就用到了 |var type = status / 100 | 0;// status / classres.status = status;res.statusType = type;// basicsres.info = 1 == type;res.ok = 2 == type;res.clientError = 4 == type;res.serverError = 5 == type;res.error = 4 == type || 5 == type;

使用 + 將其它類型轉換成 number 類型

console.log(+'3.14'); // => 3.14console.log(typeof +'3.14') // => numberconst sleep = (milliseconds) => {    return new Promise((resolve, reject) => {      setTimeout(() => resolve(), milliseconds);    });}// 當然這里可以考慮使用 console.time 來測試! async function main() {  const start = +new Date();  await sleep(3000);  const end = +new Date();  console.log(`執行了${end - start}`); // 執行了 3002}();

使用科學計數法表示大數字

const str1 = 'hello';const str2 = ' world'console.time('測試 + 拼接字符串');for (let i = 0; i < 200000000; i++) {  const joinedStr = str1 + str2;}console.timeEnd('測試 + 拼接字符串');console.time('測試模板字符串拼接字符串');// 使用科學計數法比打 8 個 0 方便不少for (let i = 0; i < 2E8; i++) {  const joinedStr =`${str1}${str2}`;}console.timeEnd('測試模板字符串拼接字符串')/* =>測試 + 拼接字符串: 3238.037ms測試模板字符串拼接字符串: 3680.225ms*/

交換變量值

直接利用解構賦值

let a = 666;let b = 999;[a, b] = [b, a];console.log({ a, b }); // => { a: 999, b: 666 }

獲取隨機字符串

截取下標 2 開始后的字符串是因為不需要 Math.random() 返回的小數構成的字符串的 0. 這兩個字符。使用 36 進制可以制造字符種類更多些的隨機字符串

console.log(Math.random().toString(16).substring(2)); // 13位 => 45d9d0bb10b31console.log(Math.random().toString(36).substring(2)); // 11位 => zwcx1yewjvj

扁平化數組

ES 2019 新增了 Array.prototype.flat,目前 chrome 最新正式版 73.0.3683.103 已經支持了, node 最新的 LTS 10.15.3 還不支持, node 最新開發版 11.13.0 是支持的。這里貼一個在掘金一個兄弟面經里面看到的比較 hack 的方法,這里要注意根據情況做類型轉換。

const array = [1, [2, [3, 4], 5], 6, 7];console.log(array.toString().split(',').map(ele => Number.parseInt(ele))); // => [ 1, 2, 3, 4, 5, 6, 7 ]

最近面試騰訊,阿里前端實習崗真的是一言難盡,后面打算整篇文章聊聊我最近的面試經歷。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情视频在线播放| 欧美理论片在线观看| 自拍偷拍亚洲精品| 久久亚洲综合国产精品99麻豆精品福利| 亚洲成人av在线播放| 日韩成人av在线| 国产亚洲一区二区在线| 中文字幕欧美精品日韩中文字幕| 日韩激情视频在线播放| 精品成人国产在线观看男人呻吟| 欧美国产日韩一区二区在线观看| 亚洲网站视频福利| 97视频在线观看成人| 日韩av电影在线网| 亚洲欧美另类国产| 青草青草久热精品视频在线网站| 欧美激情18p| 亚洲精品suv精品一区二区| 色综合视频网站| 亚洲美腿欧美激情另类| 久久久噜久噜久久综合| 亚洲人成网7777777国产| 26uuu另类亚洲欧美日本一| 亚洲国产精彩中文乱码av| 久久久国产精彩视频美女艺术照福利| 欧美体内谢she精2性欧美| 国产91精品黑色丝袜高跟鞋| 久久人人爽亚洲精品天堂| 国产精品视频自拍| 亚洲午夜精品久久久久久久久久久久| 精品国产一区二区三区在线观看| 亚洲精品一区二区三区婷婷月| 中文字幕综合一区| 日韩中文字幕视频在线| 成人黄色影片在线| 久久视频在线播放| 亚洲图片欧洲图片av| 欧美性理论片在线观看片免费| 伊人亚洲福利一区二区三区| 亚洲加勒比久久88色综合| 69av视频在线播放| 黄色成人在线免费| 精品亚洲夜色av98在线观看| 日本精品一区二区三区在线播放视频| 欧美激情在线观看| 国产精品一区二区性色av| 欧美三级欧美成人高清www| 欧美精品久久久久久久久| 欧美人成在线视频| 在线成人免费网站| 日韩一区二区三区xxxx| 午夜精品久久久久久久久久久久| 国产精品视频26uuu| 久久久久久亚洲精品中文字幕| 最近2019好看的中文字幕免费| 日韩精品极品视频免费观看| 国产一区二区三区日韩欧美| 91在线观看免费| 亚洲最新在线视频| 亚洲天堂视频在线观看| 日韩一区二区av| 国产免费一区二区三区在线能观看| 国产精品三级网站| 亚洲最大激情中文字幕| 国产欧美精品一区二区| 亚洲精品白浆高清久久久久久| 国产aⅴ夜夜欢一区二区三区| 日韩成人激情视频| 久久夜色精品亚洲噜噜国产mv| 国产精品天天狠天天看| 国产亚洲精品久久久久动| 精品久久久精品| 欧美一级大片在线免费观看| 国产精品草莓在线免费观看| 国产在线一区二区三区| 久久91精品国产91久久久| 成人久久一区二区三区| 欧美与黑人午夜性猛交久久久| 日韩成人在线视频| 欧美色图在线视频| 欧美俄罗斯性视频| 欧美—级a级欧美特级ar全黄| 久久久久久亚洲精品不卡| 亚洲午夜久久久影院| 久久久久国产精品免费网站| 欧美日韩午夜激情| 日本不卡免费高清视频| 久久99青青精品免费观看| 亚洲精品av在线播放| 欧美精品video| 日韩精品在线免费观看视频| 国产一区二区三区直播精品电影| 欧美日韩一区二区三区在线免费观看| 国产情人节一区| 日本午夜人人精品| 情事1991在线| 国产精品www| 久久精品美女视频网站| 欧美丰满少妇xxxxx| 欧美激情视频一区二区| 久久夜精品va视频免费观看| 日韩成人中文字幕在线观看| 欧美性视频精品| 色诱女教师一区二区三区| 亚洲成人av片在线观看| 色偷偷亚洲男人天堂| 国产美女精品视频免费观看| 精品无人区太爽高潮在线播放| 日韩一区二区三区在线播放| 日韩电影大全免费观看2023年上| 91禁外国网站| 国产成人在线一区二区| 亚洲成人av片在线观看| 国产精品成人免费视频| 久久av红桃一区二区小说| 日韩国产精品视频| 日韩大片免费观看视频播放| 69**夜色精品国产69乱| 亚洲free性xxxx护士hd| 91在线中文字幕| 8090理伦午夜在线电影| 国产欧美精品va在线观看| 国产欧美日韩高清| 伦伦影院午夜日韩欧美限制| 日韩免费av一区二区| 久久精品国产欧美激情| 北条麻妃一区二区三区中文字幕| 国产视频欧美视频| 成人福利视频在线观看| 日韩一级黄色av| 国产精品久久久久久久久影视| 一区二区三区美女xx视频| 亚洲精品国产综合区久久久久久久| 日本精品性网站在线观看| 亚洲全黄一级网站| 成人国产在线激情| 欧美野外猛男的大粗鳮| 久久久久九九九九| 国内精品久久久久久久| 亚洲视屏在线播放| 国产精品久久久久久婷婷天堂| 亚洲成人a**站| 欧美区在线播放| 国产亚洲日本欧美韩国| 欧美专区第一页| 日韩免费在线播放| 国产成人精品av| 午夜精品蜜臀一区二区三区免费| 亚洲码在线观看| 国产一区二区免费| 中文字幕在线看视频国产欧美| 伦伦影院午夜日韩欧美限制| 亚洲精品视频在线观看视频| 亚洲欧美一区二区三区在线| 亚洲国产精品高清久久久| 日韩精品一二三四区| 日本亚洲欧美三级| 欧美高清视频在线播放| 亚洲在线观看视频| 亚洲摸下面视频| 日韩美女视频免费在线观看| 亚洲国产成人精品女人久久久| 欧美性猛交xxxxx免费看| 国产精品爽爽爽爽爽爽在线观看|