色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 22個Vue源碼中的工具函數

22個Vue源碼中的工具函數

來源:千鋒教育
發布人:qyf
時間: 2023-01-17 16:50:00 1673945400

22個 Vue 源碼中的工具函數

  前言

  在 vue 源碼中,封裝了很多工具函數,學習這些函數,一方面學習大佬們的實現方式,另一方面是溫習基礎知識,希望大家在日常工作中,簡單的函數也可以自己封裝,提高編碼能力。

  本次涉及的工具函數 1-16 在 Vue3 的源碼中,路徑是 core/packages/shared/src/index.ts。

  17-22 在 Vue2 的源碼中,路徑是 vue/src/shared/util.ts。

  1、 EMPTY_OBJ 空對象

  const EMPTY_OBJ = __DEV__

  ? Object.freeze({})

  : {}

  注意:

  Object.freeze 只能淺凍結,如果屬性是對象,對屬性的屬性的修改就無法凍結了

  const obj = { name: '張三', info: { a: 1, b: 2

  }

  };Object.freeze(obj);obj.name = '李四';console.log(obj); // { name: '張三', info: { a: 1, b: 2 } }obj.info.a = 66;console.log(obj); // { name: '張三', info: { a: 66, b: 2 } }

  源碼中的使用:

圖片 1

  可以看出基本都是作為初始化或者兜底使用,由此產生疑問:

  · 使用的地方有的是 options,有的是 props,不同地方用同一個對象,不會有問題么?

  首先,很多初始化操作,后續都會重新賦值,EMPTY_OBJ 只是作為占位使用。其次,因為 Object.freeze 的原因,無法修改 EMPTY_OBJ,所以任何引用這個對象的地方,都不會受到影響。

  · 為什么判斷是 __DEV__(process.env.NODE_ENV !== 'production') 的時候才使用 Object.freeze?

  Object.freeze 更多的是 Vue 源碼開發者在調試時使用,可以通過報錯,防止對空對象操作,更快發現源碼問題。也因此,開發環境最終會避免了對 EMPTY_OBJ 的賦值操作,所以在生產環境使用 Object.freeze 意義不大。

  2、EMPTY_ARR 空數組

  const EMPTY_ARR = __DEV__ ? Object.freeze([]) : []

  3、 NOOP 空函數

  const NOOP = () => {}

  依舊作為兜底和占位使用:

圖片 2

  4、 NO 永遠返回 false 的函數

  const NO = () => false

  源碼中的使用:

圖片 3

圖片 4

  5、isOn 判斷字符串是不是 on 開頭,并且 on 后首字母不是小寫字母

  const onRE = /^on[^a-z]/;const isOn = (key) => onRE.test(key);// 示例isOn('onChange'); // trueisOn('onchange'); // falseisOn('on3change'); // true

  6、類型判斷

  const isArray = Array.isArray

  const isFunction = (val) => typeof val === 'function'const isString = (val) => typeof val === 'string'const isSymbol = (val) => typeof val === 'symbol'const isObject = (val) => val !== null && typeof val === 'object'const toTypeString = (value) => Object.prototype.toString.call(value)

  const isMap = (val) => toTypeString(val) === '[object Map]'const isSet = (val) => toTypeString(val) === '[object Set]'const isDate = (val) => toTypeString(val) === '[object Date]'const isPlainObject = (val) => Object.prototype.toString.call(val) === '[object Object]'// isPlainObject 判斷是不是普通對象(排除正則、數組、日期、new Boolean、new Number、new String 這些特殊的對象)

  isObject([]) // trueisPlainObject([]) // falseconst isPromise = (val) => { return isObject(val) && isFunction(val.then) && isFunction(val.catch)

  }

  7、 toRawType 提取數據原始類型

  const toRawType = (value) => { return Object.prototype.toString.call(value).slice(8, -1)

  }// 示例toRawType(''); 'String'toRawType([]); 'Array'

  源碼中的使用:

圖片 5

  8、isIntegerKey 判斷是不是數字型的字符串

  const isIntegerKey = (key) => isString(key) &&

  key !== 'NaN' &&

  key[0] !== '-' && '' + parseInt(key, 10) === key;

  // 例子:

  isIntegerKey('a'); // falseisIntegerKey('0'); // trueisIntegerKey('011'); // falseisIntegerKey('11'); // trueisIntegerKey('-11'); // falseisIntegerKey(11); // falseisIntegerKey('NaN'); // false

  9、makeMap 將字符串分隔成 map,區分大小寫,返回一個函數來判斷 map 中是否含有某個 key

  function makeMap(str, expectsLowerCase) { const map = Object.create(null); const list = str.split(','); for (let i = 0; i < list.length; i++) {

  map[list[i]] = true;

  } return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];

  }

  10、isReservedProp 是否是保留屬性

  const isReservedProp = /*#__PURE__*/ makeMap(// the leading comma is intentional so empty string "" is also included',key,ref,ref_for,ref_key,' + 'onVnodeBeforeMount,onVnodeMounted,' + 'onVnodeBeforeUpdate,onVnodeUpdated,' + 'onVnodeBeforeUnmount,onVnodeUnmounted');

  // ['', 'key', 'ref', 'ref_for', 'ref_key', 'onVnodeBeforeMount', 'onVnodeMounted', 'onVnodeBeforeUpdate', 'onVnodeUpdated', 'onVnodeBeforeUnmount', 'onVnodeUnmounted']

  // 示例

  isReservedProp('key'); // trueisReservedProp('onVnodeBeforeMount'); // trueisReservedProp(''); // trueisReservedProp(' '); // false

  如果有 /#PURE/ 這個標志,說明他是純函數,如果沒有調用它,打包工具會直接通 tree-shaking 把它刪除,減少代碼體積。

  11、 isBuiltInDirective 是否是內置指令

  const isBuiltInDirective = /*#__PURE__*/ makeMap( 'bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo'

  )

  12、 cacheStringFunction 將函數變為可緩存結果的函數

  const cacheStringFunction = (fn) => { const cache = Object.create(null); return ((str) => { const hit = cache[str]; return hit || (cache[str] = fn(str));

  });

  };

  13、 camelize & hyphenate 連字符與駝峰互轉

  const camelizeRE = /-(\w)/g;const camelize = cacheStringFunction((str) => { return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));

  });// 清爽版const camelize = str => str.replace(camelizeRE, (_, c) => { return c ? c.toUpperCase() : '';

  });// 舉例:on-click-a => onClickAcamelize('on-click-a');const hyphenateRE = /\B([A-Z])/g;const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());// 清爽版const hyphenate = str => str.replace(hyphenateRE, '-$1').toLowerCase();// 仿照 camelize 寫法const hyphenate = str => str.replace(hyphenateRE, (_, c) => { return c ? `-${c.toLowerCase()}` : '';

  });// 舉例:onClickA => on-click-ahyphenate('onClickA');

  14、 hasChanged 判斷是不是有變化

  const hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);// 示例

  hasChanged(1, 1); // falsehasChanged(1, 2); // truehasChanged(+0, -0); // falsehasChanged(NaN, NaN); // false// 場景:watch 監測值是不是變化了// 擴展 Object.is & ===Object.is(+0, -0); // false Object.is(NaN, NaN); // true+0 === -0 // trueNaN === NaN // false

  15、invokeArrayFns 執行數組里的函數

  const invokeArrayFns = (fns, arg) => { for (let i = 0; i < fns.length; i++) {

  fns[i](arg);

  }

  };// 示例const arr = [ function(val){ console.log(val + '張三');

  }, function(val){ console.log(val + '李四');

  }, function(val){ console.log(val + '王五');

  },

  ]

  invokeArrayFns(arr, '我是:');

  源碼中的使用:

圖片 6

  16、 toNumber 轉數字

  const toNumber = (val) => {

  const n = parseFloat(val); return isNaN(n) ? val : n;

  };

  toNumber('111'); // 111toNumber('a111'); // 'a111'toNumber('11a11'); // '11'toNumber(NaN); // NaN// isNaN vs Number.isNaN// isNaN 判斷是不是數字 is Not a Number// Number.isNaN 判斷是不是 NaNisNaN(NaN); // trueisNaN('a'); // trueNumber.isNaN(NaN); // trueNumber.isNaN('a'); // false// Number.isNaN 的 polyfillif (!Number.isNaN) { Number.isNaN = function (n) { // 方法一 return (window.isNaN(n) && typeof n === 'number'); // 方法二 利用只有 NaN 不跟自己相等的特性 return n !== n;

  };

  }

  17、isPrimitive 是否為原始數據

  function isPrimitive(value) { return ( typeof value === 'string' || typeof value === 'number' || typeof value === 'symbol' || typeof value === 'boolean'

  )

  }

  18、 isValidArrayIndex 是否為有效的數組下標,整數并且不是無窮大

  function isValidArrayIndex(val) { const n = parseFloat(String(val)) return n >= 0 && Math.floor(n) === n && isFinite(val)

  }// isFinite 如果參數是 NaN,正無窮大或者負無窮大,會返回 false,其他返回 true

  19、bind 能兼容的bind函數

  function polyfillBind(fn, ctx) { function boundFn(a) { const l = arguments.length return l

  ? l > 1

  ? fn.apply(ctx, arguments)

  : fn.call(ctx, a)

  : fn.call(ctx)

  }

  boundFn._length = fn.length return boundFn

  }function nativeBind(fn, ctx) { return fn.bind(ctx)

  }const bind = Function.prototype.bind ? nativeBind : polyfillBind

  20、 toArray 類數組轉化為數組

  function toArray(list, start) { start = start || 0

  let i = list.length - start

  const ret = new Array(i) while (i--) {

  ret[i] = list[i + start]

  } return ret

  }

  21、 once 只執行一次

  function once(fn) { let called = false

  return function () { if (!called) {

  called = true

  fn.apply(this, arguments)

  }

  }

  }

  22、 isNative 是否為原生系統函數

  function isNative(Ctor) { return typeof Ctor === 'function' && /native code/.test(Ctor.toString())

  }

  - End -

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
久久福利资源站| 免费高清视频精品| 国产精品免费久久久久| 久久99国内精品| 欧美一区二区三区的| 亚洲国产乱码最新视频| 欧美日韩国产系列| 日韩av不卡一区二区| 日韩亚洲欧美在线| 国产一区二区三区在线观看免费| 久久婷婷一区二区三区| 夫妻av一区二区| 亚洲欧美另类久久久精品2019 | 精品国产91九色蝌蚪| 精品一区二区在线视频| 国产情人综合久久777777| 不卡的av网站| 丝袜美腿亚洲综合| 欧美精品一区二| 色哟哟一区二区三区| 久久国产综合精品| 日韩一区在线播放| 6080yy午夜一二三区久久| 国产99久久久久久免费看农村| 亚洲色欲色欲www| 欧美成人一区二区三区在线观看| 成人免费看视频| 日韩不卡一区二区| 国产精品女主播av| 欧美三级资源在线| 夫妻av一区二区| 激情文学综合丁香| 午夜精品久久久久久久99樱桃| 国产精品美女久久久久久久久久久| 678五月天丁香亚洲综合网| 懂色中文一区二区在线播放| 日韩中文字幕1| 中文字幕中文字幕中文字幕亚洲无线| 日韩一区二区精品葵司在线| 91污在线观看| 不卡影院免费观看| 国产一区二区电影| 九一九一国产精品| 久久99精品久久久久久| 日韩激情中文字幕| 午夜在线成人av| 亚洲最色的网站| 亚洲综合清纯丝袜自拍| 亚洲天堂免费看| 中文字幕免费不卡| 国产精品丝袜一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩毛片精品高清免费| 国产视频一区二区在线观看| 亚洲精品在线三区| 久久亚洲精华国产精华液| 久久这里只精品最新地址| 精品久久久久久久人人人人传媒| 欧美网站一区二区| 欧美精品丝袜中出| 日韩天堂在线观看| 久久综合999| 亚洲免费在线视频一区 二区| 亚洲乱码国产乱码精品精小说| 亚洲欧美日韩一区二区三区在线观看 | 久久久久久久性| 国产日产欧美一区| 亚洲色图都市小说| 婷婷综合另类小说色区| 久久99久久精品| 成人精品亚洲人成在线| 91久久精品一区二区| 欧美精品在线视频| 国产精品丝袜在线| 日韩 欧美一区二区三区| 国产精品亚洲а∨天堂免在线| 99精品欧美一区| 日韩欧美不卡在线观看视频| 日本一区二区三区四区在线视频| 日韩美女久久久| 极品少妇一区二区| 在线观看日韩av先锋影音电影院| 日韩视频在线一区二区| 亚洲日本青草视频在线怡红院| 蜜桃精品视频在线观看| 97se狠狠狠综合亚洲狠狠| 欧美精选午夜久久久乱码6080| 日本一区二区三区高清不卡| 免费视频最近日韩| 欧美性生活久久| 亚洲天堂福利av| 蜜桃av一区二区在线观看| 日本乱人伦aⅴ精品| www一区二区| 亚洲午夜日本在线观看| 国产aⅴ综合色| 精品第一国产综合精品aⅴ| 亚洲最大成人综合| 国产99久久久国产精品潘金网站| 日韩一卡二卡三卡四卡| 亚洲国产精品麻豆| 91麻豆6部合集magnet| 欧美激情一区在线| 国产精选一区二区三区| 2020国产精品| 国产精品综合av一区二区国产馆| 欧美日韩国产小视频| 亚洲一区二区3| 欧美色国产精品| 亚洲综合色噜噜狠狠| 欧洲精品一区二区三区在线观看| 亚洲欧美中日韩| 91猫先生在线| 亚洲最大的成人av| 欧美日韩国产乱码电影| 日韩电影免费一区| 91精品国产91热久久久做人人 | 欧美午夜精品久久久久久孕妇 | 另类中文字幕网| 欧美一级片在线| 狠狠色丁香久久婷婷综| 久久久精品综合| www.日韩精品| 一区二区高清在线| 91精品国产福利| 国产精品亚洲一区二区三区妖精 | 色成年激情久久综合| 亚洲精品乱码久久久久久久久| 欧美亚洲日本国产| 蜜桃久久av一区| 中文字幕在线观看一区二区| 欧美日韩国产中文| 国产资源在线一区| 一区二区三区四区五区视频在线观看| 欧美日韩高清在线| 成人av电影免费在线播放| 香蕉久久夜色精品国产使用方法| 久久综合九色综合久久久精品综合| 91视频观看免费| 激情久久五月天| 亚洲综合激情另类小说区| 337p日本欧洲亚洲大胆精品| 91免费看片在线观看| 国内精品不卡在线| 一区二区三区免费观看| 欧美哺乳videos| 欧美日韩综合色| 97久久超碰精品国产| 久久99深爱久久99精品| 亚洲午夜久久久久久久久电影网 | 国产一区二区三区免费| 亚洲精品欧美在线| 久久久亚洲午夜电影| 欧美日韩免费一区二区三区| 大胆欧美人体老妇| 久久99国产精品尤物| 亚洲成人你懂的| 亚洲一区二区三区中文字幕| 国产精品美女久久久久久久| 精品久久久久久久久久久院品网 | 91麻豆免费视频| www.日韩精品| 成人美女视频在线观看| 激情综合亚洲精品| 免费在线看成人av| 亚洲.国产.中文慕字在线| 夜夜爽夜夜爽精品视频| 亚洲四区在线观看| 亚洲精品你懂的| 一区二区三区免费网站| 亚洲在线中文字幕| 亚瑟在线精品视频| 午夜影院久久久| 婷婷六月综合网| 蜜臀av一区二区在线免费观看| 日韩va欧美va亚洲va久久| 亚洲不卡av一区二区三区| 免费看日韩a级影片| 激情丁香综合五月| 国产成人免费在线观看不卡| 国产成人精品综合在线观看| av中文字幕一区| 欧美日韩一区二区三区在线 | 高清beeg欧美| 欧美影院一区二区三区| 欧美一区二区在线视频| 久久久久久免费| 亚洲老司机在线| 欧美aa在线视频| 国产精品白丝jk黑袜喷水| 91老司机福利 在线| 欧美精品日韩一本| 国产日产欧美一区二区三区| 亚洲美女一区二区三区| 秋霞电影一区二区| 99精品欧美一区二区三区小说 | 欧美日韩中文一区| 国产午夜亚洲精品羞羞网站| 专区另类欧美日韩| 精品一区中文字幕|