function isUndef (v) {
return v === undefined || v === null
}
<font face="黑體" color=green size=1>這個方法其實很簡單,就是判斷一個字段是否被定義,即是不是空,如果是空返回true,不是空返回false
</font>
function isDef (v) {
return v !== undefined && v !== null
}
<font face="黑體" color=green size=1>這個方法跟上一個方法原理上是一樣的,就是判斷一個字段是否被定義,即是不是空,如果是空返回false,不是空返回true
</font>
function isTrue (v) {
return v === true
}
function isFalse (v) {
return v === false
}
<font face="黑體" color=green size=1>這兩個方法就不言而已了,新手也會懂。
</font>
function isPrimitive (value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
// $flow-disable-line
typeof value === 'symbol' ||
typeof value === 'boolean'
)
}
<font face="黑體" color=green size=1>這個方法是判斷某個值是否是原生數據類型。普及一下js的小知識:
</font><font face="黑體" color=red size=1>js的原生數據類型:Number String Boolean Null Undefined Symbol(ES6新增的)
</font><font face="黑體" color=green size=1>接著說這個方法,因為上面已經有了對undefined和null的判斷,這塊就沒再加那兩個數據類型的判斷,在封裝的時候加上也是可以的。
</font>
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
<font face="黑體" color=green size=1>這個方法是判斷某個值是不是對象。
</font>
var _toString = Object.prototype.toString;
<font face="黑體" color=green size=2>該方法返回某個對象數據類型的字符串。為了每個對象都能通過 Object.prototype.toString() 來檢測,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來調用,傳遞要檢查的對象作為第一個參數,稱為 thisArg。
</font>
<font face="黑體" color=blue size=1>想更深刻理解可以訪問該鏈接</font>
該方法返回描述某個對象數據類型的字符串,如自定義的對象沒有被覆蓋,則會返回“[object type]”,其中,type則是實際的對象類型。在使用該方法檢測的時候,可以使用Object.prototype.toString.call()或者Object.prototype.toString.apply()進行測試,如
var toString = Object.prototype.toString;
toString.call(new Date);//[object Date]
toString.call(new String);//[object String]
toString.call(Math);//[object Math]
toString.call(undefined);//[object Undefined]
toString.call(null);//[object Null]
因此,引出Object.prototype.toString.call(obj).slice(8,-1),如
Object.prototype.toString.call('ESStudio balabala……');
//"[object String]"
Object.prototype.toString.call('ESStudio balabala……').slice(8,-1);
//"String"
slice(startIndex,endIndex),從0開始索引,其中8代表從第8位(包含)開始截取(本例中代表空格后面的位置),-1代表截取到倒數第一位(不含),所以正好截取到[object String]中的String。而在vue里,這個方法用在了四個地方
- 第一處是在父子組件傳值的時候驗證props的數據類型,比如你在子組件里定義的props某個字段是Number類型的,而實際父組件傳遞過來的值是String類型,就會提示<font face="黑體" color=red size=1>
warn( "Invalid value for option \"props\": expected an Array or an Object, " + "but got " + (toRawType(props)) + ".", vm );
</font>這里的(toRawType(props))即當前數據類型 - 第二處是在深度組件傳值的時候驗證inject的數據類型,具體提示同上
- 剩余兩次應用目前還沒分析到,就暫時不說了。
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function isRegExp (v) {
return _toString.call(v) === '[object RegExp]'
}
<font face="黑體" color=green size=1>這兩個方法是嚴格的驗證某個值是否普通的javascript對象,只返回true/false
</font>
用 typeof 無法準確判斷一個對象變量,null 的結果也是 object,Array 的結果也是 object,有時候我們需要的是 "純粹" 的 object對象。就可以用這個方法:Object.prototype.toString.call(obj) === "[object Object]"
console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]
無法區分自定義對象類型,自定義類型可以采用 instanceof 區分
<font face="黑體" color=green size=3>昂...就先介紹到這里吧。下篇文章接著介紹,歡迎下次光臨</font>
決定格局最重要的一點,是視野。 當我們在二樓的時候,看到的會是滿地的垃圾;而在二十二樓的時候,會將滿城的風景,盡收眼底。不同的樓層,就會有不同的視野和心態。人也一樣,當我們邁入了一個新的高度,達到了更高的境界,就會有不一樣的視野和胸懷。當然,作為程序員也是一樣的,當下最流行的vue框架,了解了他的原理之后我們的視野也會很廣。 這篇文章主要記錄vue源碼里封裝的一些常用方法,便于在開發的時候使用。