Vue源碼makeMap函數(shù)深入分析
前言
創(chuàng)建一個(gè)map,返回一個(gè)檢查key是否在map中的函數(shù)
主要用途: 判斷標(biāo)簽是原生組件還是自定義組件,直接通過map這種key-value一一對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)快速判斷
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
參數(shù)解釋
str:(字符串類型)
所傳入需要?jiǎng)?chuàng)建map的字符串
expectsLowerCase:(布爾型)
是否需要全部轉(zhuǎn)為小寫——也就是說,str中出現(xiàn)非小寫字母 則不需要
若沒傳,則為undefined為falsy——假值(也就不會(huì)觸發(fā)小寫轉(zhuǎn)換方法)
源碼解釋
首先通過Object.create創(chuàng)建一個(gè)對(duì)象,將傳入的字符串str以,分隔,生成一個(gè)list數(shù)組
對(duì)list數(shù)組進(jìn)行循環(huán),通過[list[i]]創(chuàng)建一個(gè)key-value的map
key:為字符串類型value:全部為true——布爾類型
判斷函數(shù)參數(shù)expectsLowerCase是否true
- true——返回一個(gè)忽略大小寫,判斷key是否存在的函數(shù)
- false——返回一個(gè)判斷key是否存在的函數(shù)
源碼疑問
為什么這里使用Object.create創(chuàng)建一個(gè)對(duì)象,而不直接使用{ }創(chuàng)建呢?
我們來做一個(gè)實(shí)驗(yàn)就明白了
這里直接用瀏覽器的控制臺(tái)實(shí)驗(yàn)
var objA = Object.create(null)
首先我們創(chuàng)建一個(gè)objA——通過Object.create(null)
打印出來看看

然后在創(chuàng)建一個(gè)objB,直接賦值{}

我們發(fā)現(xiàn)直接通過Object.create(null)創(chuàng)建的東西,十分干凈,也不存在原型鏈和原型方法
而通過{ }創(chuàng)建出來的東西,很明顯出現(xiàn)了很多不需要的屬性
小結(jié):
使用Object.create條件:
- 需要一個(gè)非常干凈和高可定制的對(duì)象
- 無需使用Object原型鏈中的方法
在其他正常情況下,直接使用{ }即可
很顯然,源碼這里是需要?jiǎng)?chuàng)建一個(gè)非常干凈的對(duì)象,從而使用的Object.create方法
為什么使用[ ]訪問屬性
對(duì)象獲取屬性的方法有兩種,當(dāng)然還可以直接使用對(duì)象解構(gòu)獲取屬性
- 點(diǎn)屬性訪問器
- 方括號(hào)屬性訪問器
我們做一個(gè)實(shí)驗(yàn)區(qū)別兩者,看看為啥尤大大要這么使用
首先我們先創(chuàng)建一個(gè)obj
var objA = Object.create(null)
訪問不存在的屬性
當(dāng)我們使用點(diǎn)屬性訪問器訪問一個(gè)不存在的屬性時(shí),結(jié)果是undefined

現(xiàn)在試試使用方括號(hào)訪問器試試

沒想到居然直接報(bào)錯(cuò)了
報(bào)錯(cuò)的信息是x 沒被定義,看來是把x當(dāng)成變量了
那我們直接使用字符串試試

結(jié)果居然也和.訪問結(jié)果一致了??!
動(dòng)態(tài)創(chuàng)建屬性
現(xiàn)在我們使用點(diǎn)屬性訪問器去創(chuàng)建一個(gè)不存在的屬性時(shí)

使用方括號(hào)屬性訪問器創(chuàng)建時(shí),結(jié)果一致

通過變量訪問
定義一個(gè)temp變量,存放我們需要訪問的key
var temp = 'x'
我們現(xiàn)在使用.訪問這個(gè)變量

結(jié)果居然發(fā)現(xiàn),這個(gè)東西的結(jié)果和訪問不存在屬性一樣
而通過[]訪問時(shí)

結(jié)果就是訪問temp所代表的x
小結(jié):
點(diǎn)屬性訪問器:
- 直接訪問
.后面的值——因此不支持變量訪問
方括號(hào)屬性訪問器
- 訪問不存在變量時(shí),若不是變量,需要以字符串形式出現(xiàn)
- 支持變量訪問
當(dāng)然因?yàn)檫@里是需要直接動(dòng)態(tài)的獲取數(shù)組的內(nèi)容,相當(dāng)于
- 需要?jiǎng)討B(tài)的創(chuàng)建一個(gè)不存在的
- 屬性屬性是一個(gè)變量
因此,選擇使用方括號(hào)屬性選擇器
到此這篇關(guān)于Vue源碼makeMap函數(shù)深入分析的文章就介紹到這了,更多相關(guān)Vue makeMap函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue Element UI 解決表格數(shù)據(jù)不更新問題及解決方案
在使用Vue和ElementUI開發(fā)后臺(tái)管理系統(tǒng)時(shí),可能會(huì)遇到表格數(shù)據(jù)不更新的問題,這通常是因?yàn)閂ue的響應(yīng)式系統(tǒng)未檢測到數(shù)據(jù)變化或數(shù)據(jù)更新后未正確觸發(fā)視圖的重新渲染,本文給大家介紹vue Element UI 解決表格數(shù)據(jù)不更新問題,感興趣的朋友一起看看吧2024-10-10
Vue-scoped(局部)樣式使用方法及實(shí)例代碼
這篇文章主要介紹了Vue-scoped(局部)樣式使用方法及實(shí)例代碼,文中示例代碼介紹了的非常詳細(xì)感興趣的同學(xué)可以參考閱讀一下2023-05-05
vue 導(dǎo)出文件,攜帶請(qǐng)求頭token操作
這篇文章主要介紹了vue 導(dǎo)出文件,攜帶請(qǐng)求頭token操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09

