国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - 聊聊從Vue.js源碼中我學到了精妙方法

聊聊從Vue.js源碼中我學到了精妙方法

2021-04-15 23:44maomin9761 JavaScript

這篇文章為大家分享聊聊從Vue.js源碼中我學到了精妙方法,有需要的朋友可以參考下

聊聊從Vue.js源碼中我學到了精妙方法

話不多說,趕快試試尤大大教給我們的這幾個精妙方法吧!在工作中肯定會用得到。

立即執行函數

頁面加載完成后只執行一次的設置函數。

  1. (function (a, b) { 
  2.   console.log(a, b); // 1,2 
  3. })(1, 2); 

通常,全局變量被作為一個參數傳遞給立即執行參數,這樣它在函數內部不使用window也可以被訪問到。

  1. (function (global) { 
  2.   console.log(global); // Window對象 
  3. })(this); 

多層嵌套三目運算符

三目運算符嵌套的寫法,使得代碼可讀性差,簡單業務場景下可以試著使用。

  1. var a = 1; 
  2. var b = 0; 
  3. a == 1 ? (b == 2 ? (b = 3) : (b = 1)) : ""
  4. console.log(b); // 1 

凍結對象

不可對指定對象增刪改。

  1. var emptyObject = Object.freeze({ 
  2.   key"1"
  3. }); 
  4. emptyObject.name = "maomin"
  5. delete emptyObject.key
  6. emptyObject.key = "2"
  7. console.log(emptyObject); 

密封對象

只能對指定對象進行更改,不可進行增加刪除操作。

  1. var sealObject = Object.seal({ 
  2.   key: 3, 
  3. }); 
  4. sealObject.name = "maomin"
  5. delete sealObject.key
  6. sealObject.key = 4; 
  7. console.log(sealObject); // 4 

檢查是否是原始值

  1. function isPrimitive(value) { 
  2.   return ( 
  3.     typeof value === "string" || 
  4.     typeof value === "number" || 
  5.     // $flow-disable-line 
  6.     typeof value === "symbol" || 
  7.     typeof value === "boolean" 
  8.   ); 

快速檢測是否是對象

當我們知道原始值時,它主要用于將對象與原始值區分開來。

  1. function isObject(obj) { 
  2.   return obj !== null && typeof obj === "object"
  3. console.log(isObject(true)); //false 

檢測目標類型

  1. var _toString = Object.prototype.toString; 
  2.  
  3. function toRawType(value) { 
  4.   return _toString.call(value).slice(8, -1); 
  5. console.log(toRawType([])); // Array 

檢查目標是否是有效的數組索引

  1. function isValidArrayIndex(val) { 
  2.   var n = parseFloat(String(val)); 
  3.   return n >= 0 && Math.floor(n) === n && isFinite(val); 

檢測是否是Promise對象

  1. function isDef(v) { 
  2.   return v !== undefined && v !== null
  3. function isPromise(val) { 
  4.   return ( 
  5.     isDef(val) && 
  6.     typeof val.then === "function" && 
  7.     typeof val.catch === "function" 
  8.   ); 
  9. var promiseObj = new Promise(function (resolve, reject) { 
  10.   // 一段耗時的異步操作 
  11.   resolve("成功"); // 數據處理完成 
  12.   // reject('失敗') // 數據處理出錯 
  13. }).then
  14.   (res) => { 
  15.     console.log(res); 
  16.   }, // 成功 
  17.   (err) => { 
  18.     console.log(err); 
  19.   } // 失敗 
  20. ); 
  21. console.log(isPromise(promiseObj)); // true 

目標轉換為字符串

  1. var _toString = Object.prototype.toString; 
  2. function isPlainObject(obj) { 
  3.   return _toString.call(obj) === "[object Object]"
  4. function toString(val) { 
  5.   return val == null 
  6.     ? "" 
  7.     : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) 
  8.     ? JSON.stringify(val, null, 2) 
  9.     : String(val); 
  10. console.log(toString({ name: 1 })); // {"name": 1} 

轉化為數字

將輸入值轉換為數字以便持久化。如果轉換失敗,則返回原始字符串。

  1. function toNumber(val) { 
  2.   var n = parseFloat(val); 
  3.   return isNaN(n) ? val : n; 

檢測key是否在創建的Map對象內

  1. function makeMap(str, expectsLowerCase) { 
  2.   var map = Object.create(null); 
  3.   var list = str.split(","); 
  4.   for (var i = 0; i < list.length; i++) { 
  5.     map[list[i]] = true
  6.   } 
  7.   return expectsLowerCase 
  8.     ? function (val) { 
  9.         return map[val.toLowerCase()]; 
  10.       } 
  11.     : function (val) { 
  12.         return map[val]; 
  13.       }; 
  14. var isBuiltInTag = makeMap("slot,component"true); 
  15. console.log(isBuiltInTag("component")); // true 

刪除簡單數組中某一項

  1. function remove(arr, item) { 
  2.   if (arr.length) { 
  3.     var index = arr.indexOf(item); 
  4.     if (index > -1) { 
  5.       return arr.splice(index, 1); 
  6.     } 
  7.   } 
  8. console.log(remove([1, 2], 1)); // [1] 

檢測對象中是否有指定key

  1. var hasOwnProperty = Object.prototype.hasOwnProperty; 
  2. function hasOwn(obj, key) { 
  3.   return hasOwnProperty.call(obj, key); 
  4. console.log(hasOwn({ name: 1 }, "name")); //true 

將類數組對象轉化為真實數組

  1. function toArray(list, start) { 
  2.   start = start || 0; 
  3.   var i = list.length - start; 
  4.   var ret = new Array(i); 
  5.   while (i--) { 
  6.     ret[i] = list[i + start]; 
  7.   } 
  8.   return ret; 
  9. console.log(toArray({ 0: 42, 1: 52, 2: 63, length: 3 })); // [42, 52, 63] 

將屬性混合到目標對象中

  1. function extend(to, _from) { 
  2.   for (var key in _from) { 
  3.     to[key] = _from[key]; 
  4.   } 
  5.   return to
  6. console.log(extend({ name: 1 }, { name1: 2 })); // {name:1,name1:2} 

將對象數組合并為單個對象

  1. function extend(to, _from) { 
  2.   for (var key in _from) { 
  3.     to[key] = _from[key]; 
  4.   } 
  5.   return to
  6. function toObject(arr) { 
  7.   var res = {}; 
  8.   for (var i = 0; i < arr.length; i++) { 
  9.     if (arr[i]) { 
  10.       extend(res, arr[i]); 
  11.     } 
  12.   } 
  13.   return res; 
  14. console.log(toObject([{ name: 1 }, { name: 1 }, { name: 2 }, { name1: 3 }])); // {name: 2, name1: 3} 

檢測指定項在數組(簡單數組、數組對象)中的索引

  1. function isObject(obj) { 
  2.   return obj !== null && typeof obj === "object"
  3. function looseEqual(a, b) { 
  4.   if (a === b) { 
  5.     return true
  6.   } 
  7.   var isObjectA = isObject(a); 
  8.   var isObjectB = isObject(b); 
  9.   if (isObjectA && isObjectB) { 
  10.     try { 
  11.       var isArrayA = Array.isArray(a); 
  12.       var isArrayB = Array.isArray(b); 
  13.       if (isArrayA && isArrayB) { 
  14.         return ( 
  15.           a.length === b.length && 
  16.           a.every(function (e, i) { 
  17.             return looseEqual(e, b[i]); 
  18.           }) 
  19.         ); 
  20.       } else if (a instanceof Date && b instanceof Date) { 
  21.         return a.getTime() === b.getTime(); 
  22.       } else if (!isArrayA && !isArrayB) { 
  23.         var keysA = Object.keys(a); 
  24.         var keysB = Object.keys(b); 
  25.         return ( 
  26.           keysA.length === keysB.length && 
  27.           keysA.every(function (key) { 
  28.             return looseEqual(a[key], b[key]); 
  29.           }) 
  30.         ); 
  31.       } else { 
  32.         /* istanbul ignore next */ 
  33.         return false
  34.       } 
  35.     } catch (e) { 
  36.       /* istanbul ignore next */ 
  37.       return false
  38.     } 
  39.   } else if (!isObjectA && !isObjectB) { 
  40.     return String(a) === String(b); 
  41.   } else { 
  42.     return false
  43.   } 
  44.  
  45. function looseIndexOf(arr, val) { 
  46.   for (var i = 0; i < arr.length; i++) { 
  47.     if (looseEqual(arr[i], val)) { 
  48.       return i; 
  49.     } 
  50.   } 
  51.   return -1; 
  52. console.log(looseIndexOf([{ name: 1 }, { name: 2 }], 4)); // -1 
  53. console.log(looseIndexOf([{ name: 1 }, { name: 2 }], { name: 1 })); // 0 

確保函數只調用一次

  1. function once(fn) { 
  2.   var called = false
  3.   return function () { 
  4.     if (!called) { 
  5.       called = true
  6.       fn.apply(this, arguments); 
  7.     } 
  8.   }; 
  9. var callOnce = once(function () { 
  10.   console.log("javascript"); 
  11. }); 
  12. callOnce(); // javascript 
  13. callOnce(); 

定義對象屬性

如果你想禁止一個對象添加新屬性并且保留已有屬性,就可以使用Object.preventExtensions(obj)。

  1. function def(obj, key, val, enumerable) { 
  2.   Object.defineProperty(obj, key, { 
  3.     value: val, // 對象定義屬性 
  4.     enumerable: !!enumerable, // 描述屬性是否會出現在for in 或者 Object.keys()的遍歷中 
  5.     writable: true, // 是否可寫 
  6.     configurable: true, // 是否重新定義或者刪除 
  7.   }); 
  8. var obj = { 
  9.   name: 1, 
  10. }; 
  11. def(obj, "name1", 2, true); 
  12. obj.name1 = 3; 
  13. console.log(obj); // {name: 1, name1: 3} 

瀏覽器環境嗅探

  1. var inBrowser = typeof window !== "undefined"
  2. var inWeex = typeof WXEnvironment !== "undefined" && !!WXEnvironment.platform; 
  3. var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); 
  4. var UA = inBrowser && window.navigator.userAgent.toLowerCase(); 
  5.  
  6. var isIE = UA && /msie|trident/.test(UA); 
  7. var isIE9 = UA && UA.indexOf("msie 9.0") > 0; 
  8. var isEdge = UA && UA.indexOf("edge/") > 0; 
  9. var isAndroid = (UA && UA.indexOf("android") > 0) || weexPlatform === "android"
  10. var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === "ios"
  11. var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; 
  12. var isPhantomJS = UA && /phantomjs/.test(UA); 
  13. var isFF = UA && UA.match(/firefox\/(\d+)/); 

JS構造函數內的方法與構造函數prototype屬性上方法的對比

定義在構造函數內部的方法,會在它的每一個實例上都克隆這個方法;定義在構造函數的 prototype 屬性上的方法會讓它的所有示例都共享這個方法,但是不會在每個實例的內部重新定義這個方法。如果我們的應用需要創建很多新的對象,并且這些對象還有許多的方法,為了節省內存,我們建議把這些方法都定義在構造函數的 prototype 屬性上。當然,在某些情況下,我們需要將某些方法定義在構造函數中,這種情況一般是因為我們需要訪問構造函數內部的私有變量。

  1. function A() { 
  2.   this.say = function () { 
  3.     console.log(1); 
  4.   }; 
  5. var a = new A(); 
  6. a.say(); 
  7. function B() {} 
  8. B.prototype.say = function () { 
  9.   console.log(2); 
  10. }; 
  11. var b = new B(); 
  12. b.say(); 
  13. var c = new B(); 
  14. c.say(); 

獲取標簽內容(包含標簽)

  1. function getOuterHTML(el) { 
  2.   if (el.outerHTML) { 
  3.     return el.outerHTML; 
  4.   } else { 
  5.     var container = document.createElement("div"); 
  6.     container.appendChild(el.cloneNode(true)); 
  7.     return container.innerHTML; 
  8.   } 

字符串hash值

  1. function hash(str) { 
  2.   var hash = 5381; 
  3.   var i = str.length; 
  4.   while (i) { 
  5.     hash = (hash * 33) ^ str.charCodeAt(--i); 
  6.   } 
  7.   return hash >>> 0; 
  8. console.log(hash("222sd"));// 164533792 

原文地址:https://mp.weixin.qq.com/s/hfGR1XNsTKgWfCZ___Y46g

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩亚洲一区二区 | 欧美一级二级视频 | 亚洲欧美日韩国产综合精品二区 | 免费观看在线毛片 | 欧美一区二区三区在线看 | 中文久久 | 天天看天天爽 | 亚洲视频免费 | 亚洲一区二区国产 | 免费看日本黄色片 | 国产在线播放91 | 狠狠色综合网站久久久久久久 | 久久久久久久国产精品 | 国产在线高清 | 日产欧产va高清 | 91在线精品视频观看 | 黄色短视频在线观看 | av一二三区| 午夜视频在线免费看 | 精品亚洲一区二区 | 欧美成人a | 久久综合激情 | 中文字幕日韩一区 | 福利视频三区 | 福利久久| 国产精品久久久久久久久久久久久 | 国产成人精品免费视频大全最热 | 日本二区不卡 | 伊人黄| 日本一区二区三区在线视频 | 久久国产欧美日韩精品 | 久久99er6热线精品首页蜜臀 | av大片| 中文字幕在线免费视频 | 国产91久久久久蜜臀青青天草二 | 国产精品一二区 | 国产免费久久 | 久久综合av | 精品伦精品一区二区三区视频 | 欧美精品一区二区三区在线 | 狠狠久 |