摘要:復(fù)雜類型復(fù)雜類型從字面量是直接生成構(gòu)造函數(shù)的,所以不會像基本類型一樣兩種情況。
JS(ES6)中的基本數(shù)據(jù)類型:1.數(shù)值型(Number):包括整數(shù)、浮點數(shù)、2.布爾型(Boolean)、3.字符串型(String)、4.數(shù)組(Array)、5.空值(Null) 、6.未定義(Undefined),基本數(shù)據(jù)類型是按值訪問的,因為可以直接操作保存在變量中的實際值。1.typeof
引用類型:Object 、Array 、Function 、Data,引用數(shù)據(jù)類型是保存在堆內(nèi)存中的對象
var a; console.log("1:" + typeof a); var b = null; console.log("2:" + typeof b); var c = undefined; console.log("3:" + typeof c); var d = new Object; console.log("4:" + typeof d); var e = function() {}; console.log("5:" + typeof e); var f = {}; console.log("6:" + typeof f); var g = ""; console.log("7:" + typeof g); var h = []; console.log("8:" + typeof h); var i = true; console.log("9:" + typeof i); var j = 123; console.log("10:" + typeof j); var k = NaN; console.log("11:" + typeof k); var l = /^[-+]?d+$/; console.log("12:" + typeof l);
打印結(jié)果如下
總結(jié):typeof對null、undefined、NaN、數(shù)組、正則、Object的類型都為object
2.constructorconstructor 用于判斷一個變量的原型,constructor 屬性返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用.
當一個函數(shù) F被定義時,JS引擎會為F添加 prototype 原型,然后再在 prototype上添加一個 constructor 屬性,并讓其指向 F 的引用,當執(zhí)行 var f = new F() 時,F(xiàn) 被當成了構(gòu)造函數(shù),f 是F的實例對象,此時 F 原型上的 constructor 傳遞到了 f 上,因此 f.constructor === F
var F = function(){} console.log(F.prototype); var f = new F(); console.log(f.constructor===F) //true
不難看出,F(xiàn) 利用原型對象上的 constructor 引用了自身,當 F 作為構(gòu)造函數(shù)來創(chuàng)建對象時,原型上的 constructor 就被遺傳到了新創(chuàng)建的對象上, 從原型鏈角度講,構(gòu)造函數(shù) F 就是新對象的類型。這樣做的意義是,讓新對象在誕生以后,就具有可追溯的數(shù)據(jù)類型,也就是說對象的constructor屬性指向他的構(gòu)造函數(shù)
所以內(nèi)置對象在內(nèi)部構(gòu)建時闊以這樣做出判斷
注:
null 和 undefined 是無效的對象,因此是不會有 constructor 存在的,這兩種類型的數(shù)據(jù)需要通過其他方式來判斷
constructor屬性并非一定指向構(gòu)造函數(shù),他也是可以修改、變更的(當把F.prototype = {}改寫后,會默認把constructor覆蓋掉)
instanceofinstanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性
及的構(gòu)造函數(shù)有這些基礎(chǔ)類型:String、Number、Boolean、Undefined、Null、Symbol(ES6引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨一無二的值); 復(fù)雜類型:Array,Object; 其他類型:Function、RegExp、Date。
var obj = new Object() obj instanceof Object // true
注意左側(cè)必須是對象(object),如果不是,直接返回false,列如:
var num = 1 num instanceof Number // false num = new Number(1) num instanceof Number // true
可以看出都是num,而且都是1,只是因為第一個不是對象,是基本類型,所以直接返回false,而第二個是封裝成對象,所以true。
這里要嚴格注意這個問題,有些說法是檢測目標的__proto__與構(gòu)造函數(shù)的prototype相同即返回true,這是不嚴謹?shù)模瑱z測的一定要是對象才行,如:
基礎(chǔ)類型
var num = 1 num.__proto__ === Number.prototype // true num instanceof Number // false num = new Number(1) num.__proto__ === Number.prototype // true num instanceof Number // true num.__proto__ === (new Number(1)).__proto__ // true
上面例子可以看出,1與new Number(1)幾乎是一樣的,只是區(qū)別在于是否封裝成對象,所以instanceof的結(jié)果是不同的,string、boolean等,這些基礎(chǔ)類型一樣的。
new String(1) // String {"1"} String(1) // "1"
new String(1)與String(1)是不同的,new是封裝成對象,而沒有new的只是基礎(chǔ)類型轉(zhuǎn)換,還是基礎(chǔ)類型
其他基礎(chǔ)類型一樣的。
復(fù)雜類型,比如數(shù)組與對象,甚至函數(shù)等,與基礎(chǔ)類型不同。
復(fù)雜類型
var arr = [] arr instanceof Array // true arr instanceof Object // true Array.isArray(arr) // true
復(fù)雜類型從字面量是直接生成構(gòu)造函數(shù)的,所以不會像基本類型一樣兩種情況。
但是上面那個問題,當然,基礎(chǔ)類型也會有這個問題,就是與Object對比。沒辦法,Object在原型鏈的上層,所以都會返回true,如下:
(new Number(1)) instanceof Object // true
由于從下往上,比如你判斷是Number,那就沒必要判斷是不是Object了,因為已經(jīng)是Number了……
其他類型
var reg = new RegExp(//) reg instanceof RegExp // true reg instanceof Object // true var date = new Date() date instanceof Date // true date instanceof Object // true 除了Function,都一樣,具體Function如下: function A() {} var a = new A() a instanceof Function // false a instanceof Object // true A instanceof Function // true
這里要注意,function A() {}相當于var A; A = function() {},然后分析:
a是new出來,所以是經(jīng)過構(gòu)造,因此已經(jīng)是對象,不再是函數(shù),所以false
a是經(jīng)過構(gòu)造的對象,返回ture沒問題
A是個函數(shù),這沒什么問題
{}.toString.call(obj)用法如下
console.log({}.toString.call(1)); console.log({}.toString.call("11")); console.log({}.toString.call(/123/)); console.log({}.toString.call({})); console.log({}.toString.call(function() {})); console.log({}.toString.call([])); console.log({}.toString.call(true)); console.log({}.toString.call(new Date())); console.log({}.toString.call(new Error())); console.log({}.toString.call(null)); console.log({}.toString.call(undefined)); console.log(String(null)); console.log(String(undefined));
返回如下
注意:必須通過 call 或 apply 來調(diào)用,而不能直接調(diào)用 toString , 從原型鏈的角度講,所有對象的原型鏈最終都指向了 Object, 按照JS變量查找規(guī)則,其他對象應(yīng)該也可以直接訪問到 Object 的 toString方法,而事實上,大部分的對象都實現(xiàn)了自身的 toString 方法,這樣就可能會導(dǎo)致 Object 的 toString 被終止查找,因此要用 call/apply 來強制調(diào)用Object 的 toString 方法
jQuery中的方法$.type(),就是用到了toString
type: function( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android<4.0, iOS<6 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; },
分析源代碼:
typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ]
通過判斷傳入類型,如果是object或者function類型就直接返回class2type 中鍵值是對的結(jié)果,如果不是,那么一定就是基本類型, 通過 typeof 就可以
class2type[ toString.call(obj) ] || "object"
這是為了防止一些未知情況的,如果未取到,就返回object,保證了程序可用性
參考文章:
JS類型判斷,typeof/constructor/instanceof的區(qū)別
js中的constructor和prototype
JS類型判斷
jquery源碼
揭開js之constructor屬性的神秘面紗
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100670.html
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...
摘要:注意基本變量類型不是對象類型,只有基本包裝類型才是對象類型。至于顯示的原型,在里用屬性表示,這個是原型繼承的基礎(chǔ)知識,在這里就不在敘述了。 前言 如果你要開發(fā)一個復(fù)雜的產(chǎn)品,那么肯定少不了使用面向?qū)ο髾C制,當然也避不開 Javascript 里面的繼承,instanceof 運算符是原生 Javascript 語言中用來判斷實例繼承的操作符。所以我們有必要深入理解該運算符! inst...
摘要:本文將講解我目前所知道的判斷數(shù)據(jù)類型的方法。數(shù)據(jù)類型一共有種除了之外的種屬于原始數(shù)據(jù)類型。等價于問題四的返回值是什么答案。 本文將講解我目前所知道的判斷JavaScript數(shù)據(jù)類型的方法。JavaScript數(shù)據(jù)類型一共有7種: Undefined Null Boolean String Symbol Number Object 除了Object之外的6種屬于原始數(shù)據(jù)類型。有時,我...
摘要:除和外,所有的數(shù)據(jù)類型都是可以轉(zhuǎn)化為對象,而如果是對象,就肯定有構(gòu)造函數(shù)。特性因為和沒有構(gòu)造函數(shù),因此不能用此方法來判斷。由于同一條原型繼承鏈上的各個對象的構(gòu)造函數(shù)都不一樣,因此,此方法可以區(qū)分開繼承鏈上的各個自定義數(shù)據(jù)類型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...
摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴格區(qū)分使用。的實現(xiàn)使用了原型繼承的表示左表達式,表示右表達式,它是用是否等于來判斷對象的類型的。常見框架和庫的實數(shù)據(jù)類型判斷測試這里將的實現(xiàn)原理抽取出來,用原生實現(xiàn)。 JavaScript一共有六種數(shù)據(jù)類型,分為原始類型(又名基本類型)和對象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...
摘要:比如我們今天要討論的,在當中如何判斷一個數(shù)組是數(shù)組。在數(shù)組的原型鏈上也能找到構(gòu)造函數(shù)由上面的幾行代碼可以看出,使用運算符可以分辨數(shù)組和對象,可以判斷數(shù)組是數(shù)組。用判斷實例化的數(shù)組擁有一個屬性,這個屬性指向生成這個數(shù)組的方法。 如果你沒有注意過這個問題,那么這個標題應(yīng)該會讓你感到困惑,判斷數(shù)據(jù)類型這么基礎(chǔ)的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...
閱讀 1527·2021-11-24 09:38
閱讀 3376·2021-11-18 10:02
閱讀 3266·2021-09-22 15:29
閱讀 2950·2021-09-22 15:15
閱讀 1054·2021-09-13 10:25
閱讀 1869·2021-08-17 10:13
閱讀 2003·2021-08-04 11:13
閱讀 1985·2019-08-30 15:54