辨別類型
javaScript目前共有7種類型,number、string、undefined、null、boolean、object、symbol。
Array 和function 是object的一個子類型。
/*===== 辨別類型 =====*/
console.log(typeof 42 === "number") // true
console.log(typeof '42' === "string") // true
console.log(typeof undefined === "undefined") // true
console.log(typeof true === "boolean") // true
console.log(typeof {} === "object") // true
console.log(typeof Symbol() === "symbol") // true
/*===== 特殊類型 (空值、數(shù)組、函數(shù)) =====*/
console.log(typeof null === "object") // true -- null為object是個bug
console.log(typeof [1, 2, 3] === "object") // true
console.log(typeof
function doSomething(a, b) {} === "function") // true
// 函數(shù)的屬性
function doSomething(a, b) {}
console.log(doSomething.length) // 2
辨別空值的方法
var a = null
// 方法1 判斷a為空并且是對象
console.log(!a && typeof a === "object") // true
// 方法2 跨原型鏈調用toString() (推薦)
console.log(Object.prototype.toString.call(null)) // [object Null]
辨別數(shù)組的方法
var myArr = [1, 2, 3]
// 方法1 isPrototypeOf() -- 判斷myArr是否在Array的原型鏈中
console.log(Array.prototype.isPrototypeOf(myArr)) // true
// 方法2 instanceof 實際是在檢測對象的繼承關系,不可靠 (不推薦)
// myArr屬于Array(Array是JS中的內置構造函數(shù))
// 此方法雖然可用,但難于理解,并且會有異常情況產(chǎn)生錯誤判斷
console.log(myArr instanceof Array) // true
// 方法3 跨原型鏈調用toString() (推薦)
console.log(Object.prototype.toString.call(myArr)) // [object Array]
console.log(Object.prototype.toString.call(myArr).match(/^\[object\s(.*)\]$/)[1] === 'Array') // true
// 方法4 Array.isArray(obj) (推薦)
// 此方法屬于ES5的范疇,如需舊瀏覽器支持,需要做兼容處理
console.log(Array.isArray(myArr)) // true
// 方法5 constructor構造器屬性
console.log(myArr.constructor == Array) // true
寫個跨原型鏈調用toString()獲得object實際類型的函數(shù)
var money = null
var skillArr = ['js', 'css', 'html']
function getObjType(obj, objType) {
return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1] === objType
}
console.log(getObjType(money, 'Null')) // true
console.log(getObjType(skillArr, 'Array')) // true
判斷某個屬性是否存在于某個對象中
function Animal() {} //定義Animal構造函數(shù)
Animal.prototype = { //定義Animal原型
species: "動物",
say: function () {
console.log('i can say word')
}
}
var cat = new Animal()
var MyAnimal = {
species: '動物',
say: function () {
console.log('i can say word')
}
}
// 方法1 hasOwnProperty()
console.log(Animal.hasOwnProperty('species')) // false -- 不是自有屬性
console.log(MyAnimal.hasOwnProperty('species')) // true -- 是自有屬性
// 方法2 in
console.log('species' in cat) // true -- 包含該屬性,可以非自有
辨別非數(shù)字
var a =2
Number.isNaN(a) // false
判斷兩個值絕對相等
var a = 2/"foo" // NaN
var b = -3*0 // -0
Object.is(a, NaN) // true
Object.is(b, -0) // true
Object.is(b, 0) // false