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

九個超級有用的 Javascript 技巧

開發 前端
在實際的開發工作過程中,我積累了一些常用的、超級有用的Javascript技巧和代碼片段,包括其他大神編譯的JS使用技巧。

前言

在實際的開發工作過程中,我積累了一些常用的、超級有用的Javascript技巧和代碼片段,包括其他大神編譯的JS使用技巧。

今天這篇文章,我認真篩選了9個我認為比較實用的技巧跟大家一起來分享,也歡迎你在留言區給我們留言,把你認為一些重要而有用的技巧與大家分享一下。

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

總結

以上就是我今天為大家精選的全部內容,也是我認為比較有用的9個JavaScript技巧,希望對大家有所幫助。

責任編輯:華軒 來源: web前端開發
相關推薦

2023-07-18 07:56:31

工具reduce業務

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 應用程序

2023-05-30 15:11:16

JavaScrip開發功能

2022-12-19 15:23:51

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閉包

2023-05-18 15:32:02

HTML開發技巧

2013-07-12 09:45:16

PHP功能

2020-07-02 08:27:47

Javascript

2023-12-19 13:31:00

CSS前端技巧
點贊
收藏

51CTO技術棧公眾號

亚洲免费视频一区二区| 精品免费在线观看| 96久久精品| 日本一区二区欧美| 国产99久久| 7878成人国产在线观看| 免费高清一区二区三区| 国产视频二区在线观看| 国产精品一区二区久久不卡| 欧美亚洲日本网站| 精品伦精品一区二区三区视频密桃| 精品国产一区二区三区性色av| 香蕉久久一区二区不卡无毒影院| 日韩国产伦理| 高清一区二区三区四区| 美女一区二区久久| 欧美猛少妇色xxxxx| 国产成人av一区二区三区不卡| 伊人亚洲精品| 91高清在线观看| 亚洲色欲久久久综合网东京热| 国产午夜精品一区理论片| 国产成人av电影免费在线观看| 国产精品九九九| 久久精品国产亚洲av香蕉 | 欧美高清性xxxxhdvideosex| 国产精品人妻一区二区三区| 红桃视频亚洲| 久久久精品久久久久| 日本aaa视频| 凹凸成人在线| 日韩一区二区免费视频| 成人性生交免费看| 韩国成人漫画| 午夜欧美视频在线观看| av动漫在线免费观看| av天在线观看| 国产欧美日韩三区| 欧美久久久久久久| 天堂中文在线官网| 成人免费毛片高清视频| 91av免费看| 国产人妻精品一区二区三| 喷水一区二区三区| 国产成人精品视| 精品人妻一区二区色欲产成人| 亚洲国产影院| 96精品视频在线| 日韩精品成人一区| 在线精品在线| 性色av香蕉一区二区| 久久精品视频国产| 欧美日韩中文| 国产综合在线看| 麻豆一区二区三区精品视频| 欧美日韩四区| 欧美福利小视频| 青娱乐免费在线视频| 亚洲小说区图片区| 久久人人爽人人爽人人片av高请| 九九精品在线观看视频| 国模大胆一区二区三区| 欧美激情第99页| www.av视频在线观看| 亚洲理伦在线| 国产成人精品国内自产拍免费看| 日韩综合在线观看| 蜜臀av一区二区| 成人做爽爽免费视频| 99国产精品一区二区三区| 国产剧情一区二区三区| 国产精品自拍首页| 男人的天堂在线| 国产精品免费aⅴ片在线观看| 在线精品日韩| 成人影院在线播放| 欧美性生交xxxxx久久久| 日本成人在线免费视频| а√天堂资源国产精品| 日韩欧美中文一区二区| 免费a在线观看播放| 国产日产一区| 久久亚洲精品一区二区| 日韩xxxxxxxxx| 免费观看在线综合| 亚洲一区二区三区乱码aⅴ| 丁香六月色婷婷| 国产丝袜美腿一区二区三区| 经典三级在线视频| 九色porny自拍视频在线播放| 91电影在线观看| 久久出品必属精品| 日韩影视在线观看| 久久久精品国产网站| 日本一区二区三区四区五区| 日韩综合小视频| av一区二区三区免费| 人成免费电影一二三区在线观看| 国产精品进线69影院| 97视频在线免费| 福利一区二区| 欧美成人精品3d动漫h| 日韩乱码人妻无码中文字幕久久| 亚洲乱码在线| 91av视频在线观看| 国产美女主播在线观看| 久久精品在这里| 男女猛烈激情xx00免费视频| 色狠狠一区二区三区| 亚洲精品一区中文| 免费又黄又爽又色的视频| 日本伊人色综合网| 精品视频一区二区| 国产黄色在线免费观看| 欧美图区在线视频| 四季av综合网站| 自由日本语亚洲人高潮| 国产精品嫩草影院一区二区| 欧美一级性视频| 亚洲精品视频一区| 天天干天天综合| 国产成人短视频在线观看| 欧美极品在线播放| 国产人妻精品一区二区三区| 中文字幕免费观看一区| 色综合久久久久无码专区| 亚洲精品在线国产| 久久在线免费观看视频| 日本成人一级片| 久久亚洲二区三区| 欧美视频在线免费播放| www.成人网| 欧美日本亚洲视频| 国产美女明星三级做爰| 国产精品久久久久久久岛一牛影视 | 成人在线观看免费高清| 噜噜噜91成人网| 国模精品娜娜一二三区| 国产网红在线观看| 日韩美女一区二区三区四区| 午夜爱爱毛片xxxx视频免费看| 青草av.久久免费一区| 日韩三级电影网站| 香蕉成人影院| 色先锋资源久久综合5566| 成人黄色片在线观看| 日本一区二区三级电影在线观看| 超碰97人人射妻| 精品一区不卡| 国产精品成人一区二区三区| 97视频免费在线看| 日本黄色小说视频| 韩国成人精品a∨在线观看| 亚洲一区不卡在线| 久久91超碰青草在哪里看| 一区二区中文字幕| 最近中文字幕免费观看| 国产精品不卡在线观看| 亚洲激情在线看| 天天插综合网| 亚洲综合在线播放| 三级网站视频在在线播放| 日韩一区二区电影| 国产网站在线看| 91麻豆swag| 91看片就是不一样| 日本欧美国产| 国产日韩欧美日韩| 91黄色在线| 亚洲国产小视频在线观看| 亚洲一区欧美在线| 国产无遮挡一区二区三区毛片日本| 亚洲 中文字幕 日韩 无码| 欧美伦理影院| 成人在线精品视频| 国精一区二区三区| 国产一区二区动漫| 国产伦子伦对白视频| 亚洲高清免费视频| www色com| 国产精品一区二区黑丝| 久久成人免费观看| 久久影视一区| 国产三区二区一区久久| 欧美成人精品三级网站| 久久大大胆人体| 五月婷婷激情在线| 欧美精品 日韩| 日韩av片在线播放| 中文字幕亚洲在| 屁屁影院国产第一页| 蜜臀av性久久久久蜜臀aⅴ| 亚洲乱码日产精品bd在线观看| 五月天亚洲一区| 91探花福利精品国产自产在线| 蜜桃麻豆av在线| 久久久999国产| 久久精品蜜桃| 日韩一区二区精品葵司在线| 免费看一级视频| 伊人色综合久久天天| 国产sm调教视频| 成人性色生活片免费看爆迷你毛片| 成人羞羞国产免费网站| 中国成人一区| 日韩免费电影一区二区| 哺乳挤奶一区二区三区免费看| 国产精品久久久| av最新在线| 精品中文字幕视频| 欧洲不卡视频| 亚洲无线码在线一区观看| 日韩中文字幕影院| 欧美高清视频在线高清观看mv色露露十八 | 中文在线最新版地址| 久久亚洲精品毛片| melody高清在线观看| 日韩av最新在线观看| 亚洲第一黄色片| 91精品国产色综合久久ai换脸 | 日韩一区二区三区视频| 亚洲av综合一区| 日韩欧美aaa| 91国产丝袜播放在线| 亚洲综合清纯丝袜自拍| 久久嫩草捆绑紧缚| 欧美国产日本韩| 乐播av一区二区三区| 99精品一区二区三区| 性高潮免费视频| 国产精品系列在线观看| 污污网站在线观看视频| 蜜臀av在线播放一区二区三区| 国内外免费激情视频| 另类av一区二区| 久久久久久久久久福利| 亚洲影音先锋| 成人在线免费观看av| 99精品免费视频| 国产一二三在线视频| 亚洲高清二区| 黄页网站大全在线观看| 韩国欧美一区| 久青草视频在线播放| 欧美国产先锋| 日本中文字幕在线视频观看| 欧美日韩国产成人精品| 激情五月六月婷婷| 欧美+日本+国产+在线a∨观看| 久久最新免费视频| 亚洲字幕久久| avav在线播放| 亚洲第一黄网| 日韩中文字幕三区| 天堂一区二区在线| 日韩一级免费在线观看| 视频一区视频二区在线观看| 又色又爽又高潮免费视频国产| 日韩av在线发布| 国产精品拍拍拍| 激情五月婷婷综合网| 中文字幕第66页| 成人午夜精品在线| 喷水视频在线观看| 久久这里只精品最新地址| 美女久久久久久久久久| 国产精品乱码一区二三区小蝌蚪| 你懂得在线观看| 一区二区三区不卡在线观看 | 欧美亚洲综合在线| 91精品国产乱码久久久久| 色偷偷一区二区三区| 看片网址国产福利av中文字幕| 色一区在线观看| 91影院在线播放| 欧美精品一区二区三区蜜臀| 色婷婷综合视频| 中文字幕欧美精品日韩中文字幕| 国产黄色在线网站| 亚洲3p在线观看| 欧美黄色网络| 国内精品久久久久久久果冻传媒| 亚洲免费专区| 久久精品国产精品亚洲精品色| 欧美涩涩视频| 亚洲精品无码久久久久久| 麻豆国产精品官网| 亚洲麻豆一区二区三区| 国产香蕉久久精品综合网| 成人免费精品动漫网站| 午夜精品久久久久久久99水蜜桃 | 亚洲成成品网站| www黄在线观看| 国内精品久久久久伊人av| 精品亚洲美女网站| 都市激情久久久久久久久久久| 欧美欧美黄在线二区| 美女av免费观看| 日韩专区在线视频| 日本一区二区在线观看视频| 国产精品麻豆欧美日韩ww| 日本少妇在线观看| 欧美久久久久中文字幕| 水莓100国产免费av在线播放| 日韩在线观看av| 精品3atv在线视频| 国产精品v欧美精品∨日韩| 日韩在线观看电影完整版高清免费悬疑悬疑| 国产精品三级一区二区| 美女精品自拍一二三四| 国产精品无码永久免费不卡| 1区2区3区国产精品| 欧产日产国产69| 亚洲第一综合天堂另类专| 欧洲不卡av| 国产精品美女呻吟| 色先锋久久影院av| 日本熟妇人妻xxxx| 国产一区二区三区香蕉| 亚洲最大成人综合网| 欧美日韩国产色视频| 亚洲成人精品女人久久久| 日韩中文字幕在线视频| 成人自拍视频网| 日本一区二区免费看| 美女爽到呻吟久久久久| 久久久久亚洲AV成人无码国产| 亚洲一区二区三区美女| 国产精品无码免费播放| 国产一区二区三区直播精品电影| 国产精品电影| 国产欧美日韩综合精品二区| 欧美视频福利| 伊人精品视频在线观看| 国产精品乱码人人做人人爱| 欧美成人精品网站| 亚洲欧美在线免费观看| 中文字幕在线官网| 精品国产区在线| 99精品福利视频| 最近中文字幕无免费| 亚洲va在线va天堂| 日韩一区免费视频| 97在线看免费观看视频在线观看| 成人三级毛片| 欧美视频在线免费播放| 99久久精品国产一区二区三区| 国产精品第九页| 日韩av在线直播| 中文字幕 在线观看| 欧美高清视频一区二区三区在线观看 | 中文字幕日韩欧美在线 | 国产精品日韩一区二区三区| 欧美日韩免费| 波多野结衣视频播放| 天天射综合影视| 欧美挠脚心网站| 国产精品高清网站| 日韩一区二区中文| 日韩 国产 一区| 亚洲综合免费观看高清完整版在线| 国产91绿帽单男绿奴| 欧美一区二区三区四区在线| 国产探花一区| 亚洲激情在线看| 亚洲自拍偷拍网站| 五月婷婷六月丁香| 国产成人精品电影久久久| 99久久综合| 熟妇高潮一区二区| 91久久国产综合久久| 日本www在线观看| 91九色蝌蚪成人| 在线一区免费观看| 手机看片国产日韩| 日韩欧美在线1卡| 超碰在线cao| 日韩精品伦理第一区| 韩国精品一区二区| 日干夜干天天干| 揄拍成人国产精品视频| 国产免费av国片精品草莓男男| 日韩一区二区高清视频| 99国产欧美另类久久久精品| 亚洲 小说区 图片区| 九九精品在线播放| 亚洲肉体裸体xxxx137| 在线能看的av网站| 精品久久中文字幕| 色影院视频在线| 国产一区二区三区高清| 奇米色777欧美一区二区| 久久午夜鲁丝片午夜精品| 亚洲欧美三级在线| 日本一区影院| 日韩毛片在线免费看| 亚洲精品久久久蜜桃| 美女毛片在线看| 97人人模人人爽人人少妇| 久久在线精品|