js--型別判斷比較2
阿新 • • 發佈:2018-11-06
typeof instanceof object.prototype.toString
typeof 只能判斷基本型別:number string object undefined boolean
==typeof==
console.log(typeof(2),'test') //number console.log(typeof(true),'test') //boolean console.log(typeof('2'),'test') //string console.log(typeof([]),'test') //object console.log(typeof({}),'test') //object console.log(typeof(null),'test') //object console.log(typeof(undefined),'test') //undefined function f() {} console.log(typeof(f),'test') //function
==instanceof==(以為很簡單,卻最複雜)
判斷變數是否為某個物件的例項,返回值為true或者false
<html> <!--在這裡插入內容--> let o = {} console.log(a2 instanceof Object) //true let a = [] console.log(a3 instanceof Array) //true function f() {} console.log(f instanceof Function) //true console.log(true instanceof Boolean) //false console.log(1 instanceof Number) //false console.log('1' instanceof String) //false </html>
大家可以看到當涉及到值型別時,就會顯示"不太正常"
var str = new String('000') var str2 = '000' console.log(str1 instanceof String) //true console.log(str2 instanceof String) //false console.log(str) //String{"000"} console.log(str2) //000大家會發現不同方式的建立字串,instanceof 卻不一樣?
所以instanceof 的工作原理究竟是什麼呢?
規範定義的該運算子
<html> <!--在這裡插入內容--> function instance_of(L, R) {//L 表示左表示式,R 表示右表示式 var O = R.prototype;// 取 R 的顯示原型 L = L.__proto__;// 取 L 的隱式原型 while (true) { if (L === null) return false; if (O === L)// 這裡重點:當 O 嚴格等於 L 時,返回 true return true; L = L.__proto__; } } </html>
只有資料型別的隱式型別和顯式型別絕對相等時,才會返回true
==這就設計到了原型鏈==了
這兩種方式都可以建立字串,但是str是在堆記憶體中開闢一片新空間存放新物件,是有原型鏈的,str2是放在常量池中(沒有原型鏈的).
1.如果常量池中已經有字串常量”aaa”
通過方式二建立物件,程式執行時會在常量池中查詢”aaa”字串,將找到的“aaa”字串的地址賦給a。
通過方式一建立物件,無論常量池中有沒有”aaa”字串,程式都會在堆記憶體中開闢一片新空間存放新物件。
2.如果常量池中沒有字串常量”aaa”
通過方式二建立物件,程式執行時會將”aaa”字串放進常量池,再將其地址賦給a。
通過方式一建立物件,程式會在堆記憶體中開闢一片新空間存放新物件,同時會將”aaa”字串放入常量池,相當於建立了兩個物件。
所以 new出來的會有原型屬性.而直接賦值的則沒有.
==Object.prototype.toString.call()==
<html>
<!--在這裡插入內容-->
console.log(Object.prototype.toString.call('1'))
console.log(Object.prototype.toString.call(1))
console.log(Object.prototype.toString.call(true))
console.log(Object.prototype.toString.call(null))
console.log(Object.prototype.toString.call(undefined))
console.log(Object.prototype.toString.call([]))
var set = new Set();
console.log(Object.prototype.toString.call(set))
var map = new Map();
console.log(Object.prototype.toString.call(map))
console.log(Object.prototype.toString.call({}))
function f2(){}
console.log(Object.prototype.toString.call(f2))
//output
[object String]
[object Number]
[object Boolean]
[object Null]
[object Undefined]
[object Array]
[object Set]
[object Map]
[object Object]
[object Function]
</html>
所以用 Object.protoType.toString.call() 更準確
==記住Object.protoType.toString() 去檢視型別都是Object,所以要用Object.protoType.toString.call()==