精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

九個超級有用的 Javascript 技巧

開發 前端
有時候前端需要對后端傳來的數據進行轉換以適應前端的業務邏輯,或者轉換組件的數據格式然后傳給后端處理,而 reduce 就是 一個非常強大的工具。

1. 動態加載 JS 文件

在一些特殊的場景下,尤其是在一些庫和框架的開發中,我們有時會動態加載并執行 JS 文件。

下面是使用 Promise 的簡單封裝。

function loadJS(files, done) {
   // Get the head tag
   const head = document. getElementsByTagName('head')[0];
   Promise.all(files.map(file => {
     return new Promise(resolve => {
       // create script tag and add to head
       const s = document.createElement('script');
       s.type = "text/javascript";
       s.async = true;
       s.src = file;
       // Listen to the load event, resolve if the loading is complete
       s. addEventListener('load', (e) => resolve(), false);
       head.appendChild(s);
     });
   })).then(done); // everything is done, execute the user's callback event
}
loadJS(["test1.js", "test2.js"], () => {
   // user's callback logic
});There are two core points in the code above. One is to use Promise to process asynchronous logic, but to use script tags to load and execute js.

2. 實現模板引擎

以下示例使用很少的代碼來實現動態模板渲染引擎。它不僅支持普通動態變量的替換,還支持動態 JS 語法邏輯包括 for 循環、if 判斷等。

// This is a dynamic template that contains js code
var template =
'My avorite sports:' +
'<%if(this.showSports) {%>' +
     '<% for(var index in this.sports) { %>' +
     '<a><%this.sports[index]%></a>' +
     '<%}%>' +
'<%} else {%>' +
     '<p>none</p>' +
'<%}%>';
// This is the function string we're going to concatenate
const code = `with(obj) {
   var r=[];
   r.push("My avorite sports:");
   if(this. showSports) {
     for(var index in this. sports) {
       r. push("<a>");
       r.push(this.sports[index]);
       r. push("</a>");
     }
   } else {
     r.push("<span>none</span>");
   }
   return r.join("");
}`
// dynamically rendered data
const options = {
   sports: ["swimming", "basketball", "football"],
   showSports: true
}
// Build a feasible function and pass in parameters to change the direction of this when the function is executed
result = new Function("obj", code).apply(options, [options]);
console. log(result);

3. 使用 reduce 轉換數據結構

有時候前端需要對后端傳來的數據進行轉換以適應前端的業務邏輯,或者轉換組件的數據格式然后傳給后端處理,而 reduce 就是 一個非常強大的工具。

const arr = [
    { classId: "1", name: "Jack", age: 16 },
    { classId: "1", name: "Jon", age: 15 },
    { classId: "2", name: "Jenny", age: 16 },
    { classId: "3", name: "Jim", age: 15 },
    { classId: "2", name: "Zoe", age: 16 }
];
groupArrayByKey(arr, "classId");
function groupArrayByKey(arr = [], key) {
    return arr.reduce((t, v) => (!t[v[key]] && (t[v[key]] = []), t[v[key]].push(v), t), {})
}

很多復雜的邏輯如果通過 reduce 處理的話,就非常簡單了。

4. 添加默認值

有時,方法需要用戶傳入參數。通常,我們有兩種方法來處理。如果用戶不傳入,我們通常會給出一個默認值,或者用戶必須傳入一個參數,不傳則拋出錯誤。

function double() {
     return value *2
}
// If not passed, give a default value of 0
function double(value = 0) {
     return value * 2
}
// The user must pass a parameter, and an error will be thrown if no parameter is passed
const required = () => {
     throw new Error("This function requires one parameter.")
}
function double(value = required()) {
     return value * 2
}
double(3) // 6
double() // throw Error

Listen 方法用于創建 NodeJS 原生 http 服務并監聽端口,在服務的回調函數中創建上下文,然后調用用戶注冊的回調函數并傳遞生成的上下文。我們先看一下之前 createContext 和 handleRequest 的實現。

5. 該函數只執行一次

在某些情況下,我們有一些特殊的場景,某個函數只允許執行一次,或者某個綁定方法只允許執行一次。

export function once (fn) {
   // Use the closure to determine whether the function has been executed
   let called = false
   return function () {
     if (! called) {
       called = true
       fn. apply(this, arguments)
     }
   }
}

6. 實現 Curry

JavaScript 中的柯里化是將采用多個參數的函數轉換為一系列僅采用一個參數的函數的過程。這樣可以更靈活地使用函數,減少代碼的重復,提高代碼的可讀性。

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      };
    }
  };
}
function add(x, y) {
  return x + y;
}
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)); // output 3
console.log(curriedAdd(1, 2)); // output 3

通過柯里化,我們可以將一些常用的功能模塊化,比如驗證、緩存等。這提高了代碼的可維護性和可讀性,并減少了出錯的機會。

7. 實現單例模式

JavaScript 的單例模式是一種常用的設計模式。它可以確保一個類只有一個實例,并提供對該實例的全局訪問點。它在 JS 中有廣泛的應用場景,比如購物車、緩存對象、全局狀態管理等等。

let cache;
class A {
  // ...
}
function getInstance() {
  if (cache) return cache;
  return cache = new A();
}
const x = getInstance();
const y = getInstance();
console.log(x === y); // true

8. 實現 CommonJs 規范

CommonJS 規范的核心思想是將每個文件視為一個模塊,每個模塊都有自己的作用域,其中的變量、函數和對象都是私有的,外部無法訪問。要訪問模塊中的數據,您必須導出并要求。

// id: full file name
const path = require('path');
const fs = require('fs');
function Module(id){
     // Used to uniquely identify the module
     this.id = id;
     // Properties and methods used to export modules
     this.exports = {};
}
function myRequire(filePath) {
     // Directly call the static method of Module to load the file
     return Module._load(filePath);
}
Module._cache = {};
Module._load = function(filePath) {
     // First address the absolute path of the file through the filePath passed in by the user
     // Because in CommnJS, the unique identifier of the module is the absolute path of the file
     const realPath = Module._resoleveFilename(filePath);
     // Cache priority, if it exists in the cache, it will directly return the exports property of the module
     let cacheModule = Module._cache[realPath];
     if(cacheModule) return cacheModule. exports;
     // If it is loaded for the first time, a new module is required, and the parameter is the absolute path of the file
     let module = new Module(realPath);
     // Call the load method of the module to compile the module
     module.load(realPath);
     return module. exports;
}
// The node file is not discussed yet
Module._extensions = {
    // Process the js file
   ".js": handleJS,
   // process the json file
   ".json": handleJSON
}
function handleJSON(module) {
  // If it is a json file, read it directly with fs.readFileSync,
  // Then use JSON.parse to convert and return directly
   const json = fs.readFileSync(module.id, 'utf-8')
   module.exports = JSON.parse(json)
}
function handleJS(module) {
   const js = fs. readFileSync(module. id, 'utf-8')
   let fn = new Function('exports', 'myRequire', 'module', '__filename', '__dirname', js)
   let exports = module. exports;
   // The assembled function can be executed directly
   fn.call(exports, exports, myRequire, module, module.id, path.dirname(module.id))
}
Module._resolveFilename = function (filePath) {
   // Splice the absolute path, and then search it, if it exists, it will return
   let absPath = path. resolve(__dirname, filePath);
   let exists = fs.existsSync(absPath);
   if (exists) return absPath;
   // If it does not exist, try splicing .js, .json, .node in sequence
   let keys = Object.keys(Module._extensions);
   for (let i = 0; i < keys. length; i++) {
     let currentPath = absPath + keys[i];
     if (fs.existsSync(currentPath)) return currentPath;
   }
};
Module.prototype.load = function(realPath) {
   // Get the file extension and hand it over to the corresponding method for processing
   let extname = path.extname(realPath)
   Module._extensions[extname](this)
}

以上是 CommonJs 規范的簡單實現。核心解決了作用域的隔離,提供了 Myrequire 方法來加載方法和屬性。

9. 遞歸獲取對象屬性

如果讓我選擇使用最廣泛的設計模式,我會選擇觀察者模式。如果要選我遇到過最多的算法思維,那一定是遞歸。遞歸將原問題劃分為具有相同結構的結構。子問題,然后依次解決這些子問題,并結合子問題的結果,最終得到原問題的答案。

const user = {
   info: {
     name: "Jacky",
     address: { home: "MLB", company: "AI" },
   },
};
// obj is the object to get the property, path is the path, and fallback is the default value
function get(obj, path, fallback) {
   const parts = path. split(".");
   const key = parts. shift();
   if (typeof obj[key] !== "undefined") {
     return parts. length > 0 ?
       get(obj[key], parts. join("."), fallback) :
       obj[key];
   }
   // return fallback if key not found
   return fallback;
}
console.log(get(user, "info.name")); // Jacky
console.log(get(user, "info.address.home")); // MLB
console.log(get(user, "info.address.company")); // AI
console.log(get(user, "info.address.abc", "fallback")); // fallback
責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2023-06-28 00:02:40

2022-12-25 16:03:31

JavaScript技巧

2022-12-22 14:44:06

JavaScript技巧

2022-11-07 16:25:07

JavaScript技巧

2023-08-11 17:39:43

JavaScriptWeb 應用程序

2022-12-19 15:23:51

JavaScrip開發語言

2023-05-30 15:11:16

JavaScrip開發功能

2023-08-18 15:12:00

JavaScript開發

2020-06-21 13:57:21

JavaScript開發代碼

2022-05-30 09:44:11

TypeScriptJavaScript技巧

2023-09-07 16:28:46

JavaScrip

2011-07-15 10:02:01

JavaScript

2024-08-20 15:23:27

JavaScript開發

2023-05-28 23:23:44

2023-10-26 07:47:35

JavaScript代碼變量

2023-09-06 16:55:33

JavaScript閉包

2013-07-12 09:45:16

PHP功能

2023-05-18 15:32:02

HTML開發技巧

2020-07-02 08:27:47

Javascript

2020-06-15 10:29:10

JavaScript開發 技巧
點贊
收藏

51CTO技術棧公眾號

高清一区二区三区四区五区| 日韩精品专区在线影院观看| 天堂资源在线亚洲资源| 国产尤物视频在线观看| 亚洲精品2区| 日韩成人av在线播放| 中文字幕在线综合| xxx性欧美| 国产精品丝袜久久久久久app| 999国产视频| 无码人妻精品一区二区三区蜜桃91 | 国产激情久久久| √天堂中文官网8在线| 久久精品色播| 欧美久久久久免费| 精品久久久久久久久久中文字幕| 成年人在线免费观看| 成人免费毛片片v| 国产精品视频26uuu| 国产精品变态另类虐交| 欧美va久久久噜噜噜久久| 亚洲国产一区自拍| 亚洲一级片av| 久久久人成影片一区二区三区在哪下载 | 日韩欧美一区在线| 91蝌蚪视频在线观看| h片在线观看下载| 亚洲免费观看在线视频| 色播亚洲婷婷| 三级在线电影| 波多野结衣视频一区| 亚洲影视九九影院在线观看| 国产日韩在线免费观看| 亚洲一区二区三区四区五区午夜| 欧美另类第一页| 久久久久久久久久97| 久久不卡国产精品一区二区| 日韩av一区二区在线| 乱码一区二区三区| 日韩精品视频在线看| 777色狠狠一区二区三区| 成人免费毛片播放| 黑人巨大精品| 欧美午夜性色大片在线观看| 久久成人福利视频| 欧美1234区| 亚洲精品国产a久久久久久| 杨幂一区欧美专区| 91精品专区| 亚洲国产精品精华液ab| 日本视频一区在线观看| 国产精品影院在线| 国产亚洲欧美日韩日本| 日韩欧美在线观看强乱免费| 国产中文字幕在线播放| 久久久国产一区二区三区四区小说 | 国产高中女学生第一次| 老司机一区二区| 国产一区二区丝袜| 97精品久久人人爽人人爽| 久久精品国产视频| 日韩久久久久久久| 免费在线黄色电影| 国产亚洲福利社区一区| 色噜噜狠狠色综合网| 国产区在线视频| 国产精品久久夜| 国产91av视频在线观看| 超碰在线网址| 亚洲va韩国va欧美va| www在线观看免费| a欧美人片人妖| 欧美色图一区二区三区| 91视频这里只有精品| 韩国三级大全久久网站| 亚洲精品在线免费观看视频| 欧美一区二区免费在线观看| 亚洲另类春色校园小说| 最新的欧美黄色| 午夜免费激情视频| 亚洲每日更新| 国产精品免费视频xxxx| 国产丰满果冻videossex| 丁香桃色午夜亚洲一区二区三区| 精品国产乱码久久久久久蜜柚| 三级在线观看网站| 国产精品沙发午睡系列990531| 7777在线视频| 中文字幕 在线观看| 欧美日韩精品福利| japanese在线观看| 国产一区二区在线| 欧美黑人视频一区| 欧美激情一区二区三区免费观看| 国产精品综合一区二区| 麻豆av一区二区三区久久| 在线观看免费高清完整| 亚洲成av人片一区二区梦乃| 亚洲欧美激情网| 日韩一区二区三区精品视频第3页| 日韩电影中文字幕| 中文字幕五月天| 国产农村妇女毛片精品久久莱园子| 成人在线观看视频网站| 天堂视频中文在线| 樱花影视一区二区| 亚洲天堂av线| 日韩动漫一区| 欧美精品日韩三级| 久久久久久久久久一级| 成人高清在线视频| 在线观看亚洲视频啊啊啊啊| 亚洲女同志freevdieo| 欧美一卡二卡在线观看| 天堂久久精品忘忧草| 一个色综合网| 国产精品电影观看| 无码h黄肉3d动漫在线观看| 亚洲色图一区二区| 日韩大片一区二区| 免费久久精品| 久久全球大尺度高清视频| 国产精选久久久| 中文字幕av免费专区久久| 日韩少妇内射免费播放18禁裸乳| 香蕉大人久久国产成人av| 久久精品国产2020观看福利| 波多野结衣午夜| 久久九九全国免费| 男人揉女人奶房视频60分| youjizz亚洲| 欧美精品在线视频观看| 一级淫片免费看| 中文字幕不卡在线播放| 国产xxxxx视频| 国产精品美女久久久久久不卡| 97在线视频免费看| 欧美熟妇交换久久久久久分类| 亚洲丝袜制服诱惑| а 天堂 在线| 午夜精品一区二区三区国产 | 亚洲人成电影在线播放| 久久久午夜影院| fc2成人免费人成在线观看播放| 日韩视频 中文字幕| 欧美激情精品| 九九视频这里只有精品| 亚洲成熟女性毛茸茸| 亚洲精品日日夜夜| 色婷婷狠狠18禁久久| 你懂的视频一区二区| 99久久99久久| av在线网页| 亚洲国产成人精品电影| 中日韩精品视频在线观看| www.日韩av| 成人综合视频在线| 国产毛片一区二区三区| 国产欧美日韩精品专区| 麻豆影视国产在线观看| 欧美一区二区福利视频| 国产午夜福利精品| 久久久天堂av| 亚洲最大成人在线观看| 亚洲91中文字幕无线码三区| 51成人做爰www免费看网站| 激情网站在线| 精品视频—区二区三区免费| 久久亚洲精品石原莉奈| 国产精品乱码妇女bbbb| 久久久久久综合网| 一区在线播放| 欧美连裤袜在线视频| 国产精品久久久久77777丨| 久久视频在线视频| 人妻少妇精品无码专区久久| 欧美日韩免费在线| 国产精品69久久久久孕妇欧美| 国精产品一区一区三区mba桃花 | 青青草国产成人av片免费| 福利网在线观看| 久久1电影院| 国产精品午夜视频| 成全电影大全在线观看| 国产亚洲人成a一在线v站| 国产露脸无套对白在线播放| 亚洲国产美女搞黄色| 少妇视频在线播放| 成人一级片网址| 奇米影音第四色| 亚洲欧洲一区二区天堂久久| 亚洲蜜桃av| 卡通动漫精品一区二区三区| 国产精品入口福利| 丁香花电影在线观看完整版| 一区二区三区视频在线| 成人午夜免费在线观看| 欧美在线不卡视频| 久草福利资源在线观看| 欧美韩国一区二区| 亚洲少妇中文字幕| 麻豆精品蜜桃视频网站| 国产一区二区网| 欧美激情1区| 亚洲成色www久久网站| 精品亚洲免a| 91成人免费在线观看| 人人鲁人人莫人人爱精品| 久久人人爽人人| 超鹏97在线| 中文字幕亚洲欧美日韩高清| 香蕉视频911| 精品国产乱码91久久久久久网站| 这里只有精品9| 日韩欧美在线免费| 国产五月天婷婷| 尤物视频一区二区| 开心激情五月网| 国产日韩欧美高清在线| 免费成人深夜夜行p站| 国产成人在线视频网站| 亚洲黄色av片| 免费成人性网站| 成熟老妇女视频| 国产日韩一区二区三区在线播放| 日韩不卡一二区| 91久久夜色精品国产按摩| 午夜精品区一区二区三| 奇米狠狠一区二区三区| 久久国产精品亚洲va麻豆| 成人三级av在线| 国产成人精品自拍| 在线播放一区二区精品视频| 91中文字幕在线| avtt久久| 91久久精品一区| 亚洲ww精品| 成人两性免费视频| 不卡的国产精品| 91夜夜未满十八勿入爽爽影院| 中文成人在线| 成人精品久久久| 自拍偷拍亚洲| 91在线观看免费高清| 国产精品色婷婷在线观看| 成人天堂噜噜噜| 国产精品白丝久久av网站| 91香蕉嫩草影院入口| 欧美黄视频在线观看| www.成人av.com| 国产精品巨作av| 久久人人97超碰人人澡爱香蕉| 欧美男男freegayvideosroom| 久久99九九| 精品欧美激情在线观看| 一级日韩一区在线观看| 亚洲成人日韩| 精品国偷自产一区二区三区| av成人天堂| 国产视频一区二区三区在线播放 | 欧美日韩免费一区二区三区| 一区二区三区www污污污网站| 欧美精品丝袜中出| 精品人妻av一区二区三区| 欧美刺激脚交jootjob| 人妻无码中文字幕| 国产亚洲精品久久久久久777| aaa日本高清在线播放免费观看| 日韩在线欧美在线| 在线观看免费视频你懂的| 久久久免费观看| 韩日精品一区二区| 91九色单男在线观看| 成人精品毛片| 日韩精品一区二区三区外面| 我不卡神马影院| 国产av麻豆mag剧集| 日韩精品一卡二卡三卡四卡无卡| 国产亚洲视频一区| 成人99免费视频| 少妇精品无码一区二区免费视频 | 色播视频在线播放| 欧美午夜精品一区| 亚洲女人18毛片水真多| 亚洲男人天堂九九视频| 午夜精品一区| 国外色69视频在线观看| 国产精品久久久久久久久久齐齐 | 日本韩国欧美精品大片卡二| 欧美日韩视频免费看| 国产精品乱码一区二区三区| 不卡在线一区| 男女视频网站在线观看| 麻豆精品视频在线观看视频| 91玉足脚交白嫩脚丫| 国产精品久久久久久福利一牛影视| 久久久久人妻一区精品色欧美| 在线看日韩精品电影| 亚洲女人18毛片水真多| 最近2019免费中文字幕视频三 | 综合色一区二区| 成人黄色一区二区| 国产·精品毛片| 亚洲a∨无码无在线观看| 欧美日韩午夜激情| 精品国产无码一区二区| 一区二区福利视频| 川上优av中文字幕一区二区| 成人精品视频99在线观看免费| 天海翼亚洲一区二区三区| 水蜜桃在线免费观看| 日韩av电影天堂| 国产麻豆天美果冻无码视频| 一区二区三区欧美| 一区二区日韩视频| 国产亚洲视频在线观看| 麻豆mv在线观看| 国产传媒一区| 欧美在线日韩| 中文字幕亚洲影院| 国产精品丝袜91| 日韩在线视频不卡| 亚洲精品日韩欧美| 男人久久天堂| 韩国成人av| 亚洲黄色毛片| 性农村xxxxx小树林| 亚洲精品第1页| 国产手机视频在线| www.亚洲免费视频| 精品久久毛片| 杨幂一区欧美专区| 久久精品二区亚洲w码| 精品人妻中文无码av在线| 色婷婷一区二区| 欧美一区二区视频| 青草成人免费视频| 国产成人3p视频免费观看| 99福利在线观看| 久久综合久久99| 在线观看黄网站| 日韩精品福利网站| 中文在线最新版地址| 欧美高清一区二区| 日韩高清一区在线| 日韩女同一区二区三区| 欧美日韩在线综合| 麻豆免费在线视频| 99re国产视频| 亚洲国产日本| 性欧美13一14内谢| 在线观看视频一区二区| 91欧美在线视频| 国产一区视频在线播放| 久久精品国内一区二区三区水蜜桃 | 欧美精品一区二区高清在线观看 | 成人一区二区不卡免费| 国产精品日韩专区| 亚洲精品国产偷自在线观看| 日本少妇xxxx软件| 欧美日韩另类在线| av在线天堂播放| 亚洲xxxxx性| 韩国亚洲精品| 日韩人妻一区二区三区| 欧美视频在线一区二区三区| 久操视频在线播放| dy888夜精品国产专区| 性久久久久久| 情侣偷拍对白清晰饥渴难耐| 日韩一区二区三区四区| 91桃色在线| 五月天久久狠狠| 国产剧情在线观看一区二区| 日本三级小视频| 日日骚久久av| 高清一区二区三区| 男人天堂网视频| 亚洲欧美日韩精品久久久久| 黄色av中文字幕| 国产精品草莓在线免费观看| 一区二区影院| 李宗瑞91在线正在播放| 欧美精品三级日韩久久| 2021中文字幕在线| 亚洲午夜精品国产| 成人国产电影网| 国产精品国产精品国产专区| 久久久久久久久网站| 精品国产乱码久久久| 美女流白浆视频| 欧美性感一区二区三区| 免费在线看电影| 亚洲国产日韩欧美| 99久久精品免费精品国产| 一本久道久久综合无码中文| 韩国精品久久久999| 99精品全国免费观看视频软件| 国产xxxxxxxxx| 制服丝袜亚洲色图|