精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一卡久久| 成人日韩在线| 成人精品国产福利| 欧美在线视频免费播放| 精品少妇人妻一区二区黑料社区| 亚洲第一会所| 亚洲久本草在线中文字幕| 国产一区二区三区高清视频| 国产成人自拍偷拍| 亚洲网站啪啪| 中文字幕在线亚洲| 国产成人av片| 国产伊人久久| 黄色91在线观看| 一区二区三区偷拍| 性xxxx18| 国产ts人妖一区二区| 国产97免费视| 久一视频在线观看| 日韩精品免费| 亚洲国产高清福利视频| 亚洲人视频在线| 亚洲小少妇裸体bbw| 中文字幕一区二区三区四区| 久久99精品国产一区二区三区| 老熟妇一区二区三区啪啪| 精品白丝av| 久久这里只有精品视频首页| 中文字幕免费在线看线人动作大片| 一区三区自拍| 欧美美女黄视频| 成人羞羞国产免费网站| av有码在线观看| 亚洲欧洲日产国产综合网| 免费久久久一本精品久久区| 午夜精品久久久久久久第一页按摩| 日产国产欧美视频一区精品| 欧美亚洲国产另类| 国产在线一二区| 女主播福利一区| 日韩资源在线观看| a级黄色免费视频| 国产亚洲第一伦理第一区| 亚洲国产精久久久久久 | 国产精品久久久久久模特| 久久五月天综合| 免费成人美女女在线观看| av在线不卡免费观看| 亚洲欧美激情四射在线日| 久久久久久婷婷| 成人av综合网| 欧美电影免费观看完整版| 三级黄色片播放| 狂野欧美xxxx韩国少妇| 91精品国产综合久久精品| 国产成年人视频网站| 91丨精品丨国产| 337p亚洲精品色噜噜狠狠| aaa一级黄色片| 成人在线日韩| 精品三级在线观看| zjzjzjzjzj亚洲女人| aaa国产精品视频| 精品国产99国产精品| xxxxxx黄色| 婷婷激情久久| 国产一区二区三区日韩欧美| ass极品国模人体欣赏| 97视频热人人精品免费| 久久久精品国产网站| 天天综合天天做| 一区免费视频| 青青草一区二区| 国模私拍一区二区| 国产综合成人久久大片91| 91九色在线免费视频| 亚洲奶汁xxxx哺乳期| 99久久久久久| 五月天婷亚洲天综合网鲁鲁鲁| a√资源在线| 亚洲日本护士毛茸茸| www.国产在线视频| 澳门成人av网| 欧美电影一区二区三区| 男人女人拔萝卜视频| 日韩精品欧美大片| 中文字幕精品网| 国产黄色片在线免费观看| 亚洲精品影视| 国产精品女主播视频| 国产成人a人亚洲精品无码| 波多野结衣中文字幕一区二区三区 | 国产亚洲欧美色| 三区精品视频| 精灵使的剑舞无删减版在线观看| 亚洲午夜精品一区二区三区他趣| 自慰无码一区二区三区| 日韩欧国产精品一区综合无码| 日韩欧美精品在线视频| 亚洲人人夜夜澡人人爽| 999国产精品999久久久久久| 98精品国产自产在线观看| 少妇一级淫片日本| 成人免费看的视频| 午夜精品一区二区三区四区| 精品孕妇一区二区三区| 欧美日韩美女在线观看| 奇米777在线| 国产成人短视频在线观看| 欧美人与性动交a欧美精品| 无码任你躁久久久久久久| 国产成人av电影在线播放| 日本免费高清一区二区| 第四色日韩影片| 欧美精品三级在线观看| 精品人妻无码一区二区三区| 欧美国产三区| 国产日本欧美在线观看| 欧美女优在线观看| 亚洲狠狠爱一区二区三区| 亚洲一区二区福利视频| 欧洲美女日日| 91精品国产99久久久久久| 精品黑人一区二区三区在线观看| 欧美激情一区二区三区不卡| 国产91在线视频观看| 99久久香蕉| 欧美另类老女人| 92久久精品一区二区| 国产三级精品在线| 免费无码国产v片在线观看| 91精品短视频| 久久99国产综合精品女同| 一级全黄裸体免费视频| 国产人久久人人人人爽| 男人操女人免费软件| 久久黄色影视| 国产69精品久久久久9| 99热这里只有精| 亚洲欧洲日韩女同| 亚洲va综合va国产va中文| 第九色区aⅴ天堂久久香| 日本国产一区二区三区| 四虎永久在线精品免费网址| 亚洲一区二区三区四区不卡| 免费在线观看日韩av| 欧美在线影院| 91手机视频在线观看| 成年视频在线观看| 欧美一区二区在线不卡| 手机在线免费看毛片| 九一九一国产精品| 色呦呦网站入口| 国产区一区二| 欧美噜噜久久久xxx| 亚洲欧美激情另类| 午夜精品久久久久| 三级男人添奶爽爽爽视频| 亚洲在线观看| 日韩电影大全在线观看| 欧美xxxx性| 欧美精品少妇videofree| 性生活黄色大片| 午夜伦理一区二区| 熟妇高潮精品一区二区三区| 久久免费黄色| 亚洲精品一区二| 性欧美video另类hd尤物| 久久在线视频在线| 神马午夜一区二区| 色综合夜色一区| 四虎成人免费影院| 国产乱码精品一区二区三区av| 日本福利视频网站| 另类尿喷潮videofree| 欧洲成人午夜免费大片| 91福利在线视频| 日韩三级在线观看| 国产精品自拍99| 亚洲欧美中日韩| 玖玖爱在线精品视频| 日韩精品一区第一页| 在线观看欧美激情| 国产乱人伦丫前精品视频| 青草青草久热精品视频在线观看| 在线观看黄av| 精品播放一区二区| 欧美成人一区二区视频| 亚洲精品ww久久久久久p站| 成年人在线观看av| 国产在线观看免费一区| 国产成人在线免费看| 99精品视频在线观看播放| 国产精品国模大尺度私拍| 日韩av首页| 久久久久久久久久国产精品| 国产在线播放av| 日韩视频一区二区三区| 精品国产xxx| 一区二区三区久久久| 懂色av蜜桃av| proumb性欧美在线观看| 五月天婷婷影视| 裸体一区二区| 91黄色在线看| 久久激情电影| 久久综合九色99| 精品国产18久久久久久二百| 日本中文字幕成人| 国产精品国精产品一二| 色综合亚洲精品激情狠狠| 午夜一区在线观看| 日韩精品专区在线影院观看| 黄色一区二区视频| 精品久久久久久久大神国产| 国产盗摄一区二区三区在线| 久久综合九色综合97婷婷| 黄页网站在线看| 韩国三级电影一区二区| 免费一级特黄录像| 国产精品久久久久毛片大屁完整版| 日日噜噜夜夜狠狠久久丁香五月 | 亚洲欧美国产精品桃花| 欧美a大片欧美片| 亚洲最大福利网站| 久久91超碰青草在哪里看| 国产999精品久久久| 嗯啊主人调教在线播放视频| 色在人av网站天堂精品| 成人短视频在线| 久久激情五月丁香伊人| 91精品国产91久久久久游泳池 | 日韩精品视频网| 国产精品333| 99re国产精品| 黄页免费在线观看视频| 狠久久av成人天堂| 欧美a级免费视频| 一区二区三区中文| 亚洲欧洲国产日韩精品| 欧美精品系列| 亚洲人成网站在线播放2019| 欧美限制电影| 日韩中文字幕一区| 精品欧美久久| 亚洲精品国产精品久久| 久久免费av| 婷婷五月色综合| 91影院成人| 一本二本三本亚洲码| 亚洲综合中文| 2022中文字幕| 伊人精品成人久久综合软件| a级黄色小视频| 亚洲免费网站| av观看免费在线| 青青国产91久久久久久| 亚洲免费黄色网| 国产一区二区福利| 亚洲av无码成人精品区| 成人黄色av电影| theav精尽人亡av| 国产日韩欧美一区二区三区综合| 亚洲av毛片基地| 综合精品久久久| 国产精品99精品| 色综合色综合色综合| 在线观看免费黄色小视频| 欧美精品色一区二区三区| 亚洲av无码乱码国产精品| 亚洲精品美女久久久| 久久精品蜜桃| 久久福利视频导航| 97久久人人超碰caoprom| 日韩美女在线观看一区| 香蕉久久一区| 精品国产一区二区三| 欧美精品一区二区三区中文字幕| 在线免费观看成人网| 亚洲第一网站| 欧洲熟妇精品视频| 国产精品一区二区久久精品爱涩 | 国产伦一区二区| 亚洲精品乱码久久久久久金桔影视| 国产午夜精品一区理论片| 久久亚洲私人国产精品va| 国产夫妻在线播放| 国产精品夜间视频香蕉| 99这里只有精品视频| 三区精品视频观看| 在线观看亚洲| 亚洲欧美国产中文| www.日韩在线| 韩国一级黄色录像| 精品国产999| 国产精品无码一区二区桃花视频| 亚洲高清福利视频| 欧美jizz18性欧美| 青青在线视频一区二区三区| 精品视频一区二区三区| 欧美精品欧美精品系列c| 91精品电影| 日日噜噜噜噜久久久精品毛片| 成人丝袜18视频在线观看| 后入内射无码人妻一区| 岛国av一区二区三区| 国产高中女学生第一次| 亚洲图片在区色| 96av在线| 亚洲xxx视频| 成人午夜国产| 久久久久久久久久久福利| 国产成人福利片| 午夜国产福利视频| 色老头久久综合| 婷婷在线视频| 国产欧美视频一区二区三区| 成熟人妻av无码专区| 亚洲精品视频在线看| 国产第一页在线观看| 亚洲国产精品高清久久久| 久久久蜜臀国产一区二区| 黑人と日本人の交わりビデオ| 亚洲成人在线免费| 国产又大又粗又长| 国产一本一道久久香蕉| 国产精品扒开腿做爽爽爽a片唱戏| 国产精品视频麻豆| 成人毛片在线播放| 亚洲电影免费观看高清完整版在线观看 | avtt中文字幕| 国产精品久久久久久久岛一牛影视| 国产一级片免费| 日韩三级免费观看| 国内精品不卡| 成人性生交大片免费观看嘿嘿视频| 欧美日韩性在线观看| 亚洲熟妇av一区二区三区| 久久综合久久99| 中文字幕超碰在线| 亚洲护士老师的毛茸茸最新章节 | 欧美偷拍自拍| 久久午夜夜伦鲁鲁一区二区| 久久美女高清视频| 波多野结衣国产| 日韩电影中文字幕av| 欧美调教sm| 精品一区久久久久久| 在线亚洲成人| 中文字幕一区二区久久人妻网站 | 国产特级淫片高清视频| 成人av网在线| 日产精品久久久| 亚洲欧洲一区二区三区久久| 亚洲午夜久久久久久久国产| thepron国产精品| 久草精品视频在线观看| 亚洲国内高清视频| 欧美男男tv网站在线播放| 久久亚洲综合网| 视频一区视频二区在线观看| 人妻少妇无码精品视频区| 欧美亚洲图片小说| 日本三级在线播放完整版| 成人久久久久爱| 国产精品av久久久久久麻豆网| 国产a√精品区二区三区四区| 亚洲成人午夜电影| 日韩欧美国产二区| 日本vs亚洲vs韩国一区三区二区 | 午夜精品在线观看| 偷拍精品福利视频导航| 亚洲乱码国产一区三区| 国产精品欧美一级免费| 国产丝袜在线视频| 国内精品400部情侣激情| 妖精一区二区三区精品视频 | 亚洲视频欧美视频| 欧美黄页免费| 高清无码视频直接看| 91蝌蚪porny九色| 一区二区三区在线免费观看视频| 欧美麻豆久久久久久中文 | 国产精品18久久久久久久久久久久| 久草视频精品在线| 亚洲丝袜在线视频| 欧美视频三区| av免费在线播放网站| 亚洲色图另类专区| 亚洲欧美日韩综合在线| 国产日韩av在线播放| 亚洲人成久久| 羞羞在线观看视频| 亚洲国产成人久久| 国产精品日韩精品在线播放| 熟女少妇在线视频播放| 中文字幕在线观看一区| 五月婷婷狠狠干| 亚洲影院高清在线| 秋霞国产午夜精品免费视频|