摘要:檢測數(shù)據(jù)類型中可以使用操作符來判斷數(shù)據(jù)類型。調(diào)用函數(shù)時(shí),某個(gè)參數(shù)未設(shè)置任何值,這時(shí)就可以傳入,表示該參數(shù)為空。我們約定普通函數(shù)以小寫字母開頭,構(gòu)造函數(shù)以大寫字母開頭。五原型以及原型鏈未完待續(xù)
一、數(shù)據(jù)類型
在javascript中的數(shù)據(jù)類型可以分為兩種類型,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。其中基本數(shù)據(jù)類型包括String, Number, Boolean,null,undefined,Symbol(ES6)六大數(shù)據(jù)類型,引用數(shù)據(jù)類型object。
通常,數(shù)值、字符串、布爾值這三種類型,合稱為原始類型,
對(duì)象則稱為合成類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器。
至于undefined和null,一般將它們看成兩個(gè)特殊值。
這里所講的合成類型object,其實(shí)式一個(gè)廣義的對(duì)象,他包括三個(gè)子類型,[狹義的對(duì)象,array,function]我們一般所說的對(duì)象都是狹義的對(duì)象。
基本數(shù)據(jù)類型是按照值進(jìn)行分配的,是存放在了棧內(nèi)存的數(shù)據(jù)片段,可以直接訪問到。引用數(shù)據(jù)類型則是存放在堆內(nèi)存中的數(shù)據(jù),例如: var a = {}; a只是存儲(chǔ)了{(lán)}的指針,這個(gè)指針指向了內(nèi)存的地址。
檢測數(shù)據(jù)類型
javascript中可以使用typeof操作符來判斷數(shù)據(jù)類型。但是typeof null = object; 這是歷史遺留的bug;
typeof 123; // "number" typeof "hfhan"; // "string" typeof true; // "boolean" typeof null; // "object" 獨(dú)一份的與眾不同 typeof undefined; // "undefined" typeof Symbol("hfhan"); // "symbol" typeof function(){}; // "function" // 這里不是object哦~~~ typeof {}; // "object" typeof window // "object" typeof {} // "object" typeof [] // "object"
null是一個(gè)表示“空”的對(duì)象,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。
null和undefined的用法于含義
null表示空值,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時(shí),某個(gè)參數(shù)未設(shè)置任何值,這時(shí)就可以傳入null,表示該參數(shù)為空。比如,某個(gè)函數(shù)接受引擎拋出的錯(cuò)誤作為參數(shù),如果運(yùn)行過程中未出錯(cuò),那么這個(gè)參數(shù)就會(huì)傳入null,表示未發(fā)生錯(cuò)誤。
undefined表示“未定義”,下面是返回undefined的典型場景。
// 變量聲明了,但沒有賦值 var i; i // undefined // 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于 undefined function f(x) { return x; } f() // undefined // 對(duì)象沒有賦值的屬性 var o = new Object(); o.p // undefined // 函數(shù)沒有返回值時(shí),默認(rèn)返回 undefined function f() {} f() // undefined
可以轉(zhuǎn)換為false的值
undefined null false 0 NaN ""或""(空字符串)二、對(duì)象類型
宿主環(huán)境
一般宿主環(huán)境由外殼程序創(chuàng)建于維護(hù),只要是能夠提供js引擎執(zhí)行環(huán)境都稱為是外殼程序。如:web 瀏覽器, 桌面應(yīng)用程序等。
即由web瀏覽器、桌面應(yīng)用程序等的外殼程序所造就的環(huán)境就是宿主環(huán)境。
js對(duì)象的分類
js的對(duì)象可以分為三類:內(nèi)部對(duì)象 宿主對(duì)象 自定義對(duì)象
1. 內(nèi)部對(duì)象
1.1 本地對(duì)象
ECMA-262把本地對(duì)象定義為是: 獨(dú)立于宿主環(huán)境的ECMASCRIPT實(shí)現(xiàn)所提供的對(duì)象。
本地對(duì)象包含Object Function Boolean String Array Date RegExp Number 以及各類錯(cuò)誤對(duì)象(Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError)
1.2 內(nèi)置對(duì)象
ECMA-262把內(nèi)置對(duì)象定義為是: 由 ECMAScript 實(shí)現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對(duì)象,在 ECMAScript 程序開始執(zhí)行時(shí)出現(xiàn)。意味著你不需要明確實(shí)例化就可以是直接使用。
包括由 Global Math兩個(gè)內(nèi)置對(duì)象。
global
global對(duì)象算是一個(gè)比較特殊的對(duì)象了吧,因?yàn)椴还苣銖哪膫€(gè)角度看,它都是不存在的。全局作用域下的一些屬性和方法比如: isNaN parseInt等。都是global的屬性和方法。
JavaScript 全局對(duì)象參考手冊(cè)
2. 宿主對(duì)象
宿主對(duì)象就是執(zhí)行JS腳本的環(huán)境提供的對(duì)象。對(duì)于嵌入到網(wǎng)頁中的JS來說,其宿主對(duì)象就是瀏覽器提供的對(duì)象,所以又稱為瀏覽器對(duì)象(BOM)。
不同的瀏覽器提供的宿主對(duì)象可能不同,即使提供的對(duì)象相同,其實(shí)現(xiàn)方式也大相徑庭!這會(huì)帶來瀏覽器兼容問題,增加開發(fā)難度。
瀏覽器對(duì)象有很多,如Window和Document等等。
對(duì)于web瀏覽器而言,Global有一個(gè)代言人window,但是window并不是ECMAScripta規(guī)定的內(nèi)置對(duì)象,因?yàn)閣indow對(duì)象是相對(duì)于web瀏覽器而言的,而js不僅僅可以用在瀏覽器中。document對(duì)象是window對(duì)象的一個(gè)屬性,是顯示于窗口內(nèi)的一個(gè)文檔。而window對(duì)象則是一個(gè)頂層對(duì)象,它不是另一個(gè)對(duì)象的屬性。document可以理解為文檔,就是你的網(wǎng)頁,而window是你的窗口,就是你的瀏覽器打開所顯示的哪個(gè)窗口。
3. 自定義對(duì)象
顧名思義,就是開發(fā)人員自己定義的對(duì)象。JavaScrip允許使用自定義對(duì)象,使JavaScript應(yīng)用及功能得到擴(kuò)充
三、判斷對(duì)象的類型
使用Object.prototype.toString()來判斷。
Object.prototype.toString.apply(new Function); // "[object Function]" Object.prototype.toString.apply(new Object); // "[object Object]" Object.prototype.toString.apply(new Date); // "[object Date]" Object.prototype.toString.apply(new Array); // "[object Array]" Object.prototype.toString.apply(new RegExp); // "[object RegExp]" Object.prototype.toString.apply(new ArrayBuffer); // "[object ArrayBuffer]" Object.prototype.toString.apply(Math); // "[object Math]" Object.prototype.toString.apply(JSON); // "[object JSON]" var promise = new Promise(function(resolve, reject) { resolve(); }); Object.prototype.toString.apply(promise); // "[object Promise]"
下面正式進(jìn)入我們的正題
四、構(gòu)造函數(shù)
在javascript中對(duì)象的創(chuàng)建有兩種方式,對(duì)象字面量和構(gòu)造函數(shù)
4.1 對(duì)象字面量
var o1 = { p:”I’m in Object literal”, alertP:function(){ alert(this.p); } } // 這種寫法不需要定義構(gòu)造函數(shù),因此不在本文的討論范圍之內(nèi)。這種寫法的缺點(diǎn)是,每創(chuàng)建一個(gè)新的對(duì)象都需要寫出完整的定義語句,不便于創(chuàng)建大量相同類型的對(duì)象,不利于使用繼承等高級(jí)特性。
4.2 構(gòu)造函數(shù)(構(gòu)造器)
new表達(dá)式是配合構(gòu)造函數(shù)使用,可以實(shí)現(xiàn)更好的效果
new String(“a string”) // 調(diào)用內(nèi)置的String()方法來構(gòu)建了一個(gè)字符串對(duì)象。 function CO(){ this.p = “I’m in constructed object”; this.alertP = function(){ alert(this.p); } } var o2 = new CO();
針對(duì)new操作符號(hào)在調(diào)用構(gòu)造函數(shù),我們來刨析一下具體發(fā)生了什么
發(fā)生了四件事
var obj = {}; // 第一步創(chuàng)建一個(gè)空對(duì)象 obj.__proto__ = CO.prototype; // 讓空對(duì)象的成員指向構(gòu)造函數(shù)的prototype成員對(duì)象 CO.call(obj); // 第三步,將構(gòu)造函數(shù)的作用域賦值給新的對(duì)象 return obj; // 返回新的對(duì)象
注意
function C2(a, b){ this.p = a + b; this.alertP = function(){ alert(this.p); } return this.p;//此返回語句在C2作為構(gòu)造函數(shù)時(shí)沒有意義 } var c2 = new C2(2,3); c2.alertP();//結(jié)果為5 alert(C2(2, 3)); //結(jié)果為5 // 該實(shí)例是可行的,但是不推薦哦, // 該函數(shù)既可以用作構(gòu)造函數(shù)來構(gòu)造一個(gè)對(duì)象,也可以作為普通的函數(shù)來使用。用作普通函數(shù)時(shí),它接收兩個(gè)參數(shù),并返回兩者的相加的結(jié)果。為了代碼的可讀性和可維護(hù)性,建議作為構(gòu)造函數(shù)的函數(shù)不要摻雜除構(gòu)造作用以外的代碼;同樣的,一般的功能函數(shù)也不要用作構(gòu)造對(duì)象。
以上兩種方式中展現(xiàn)的都是我們自定義的對(duì)象,看了兩種創(chuàng)建對(duì)象對(duì)的方式,我們來結(jié)合內(nèi)部對(duì)象來繼續(xù)分析:
4.3 普通創(chuàng)建法
一個(gè)函數(shù)可以通過下面的方式直接創(chuàng)建。
function a(){ }
創(chuàng)建一個(gè)對(duì)象例如是object 可以是 {} ,創(chuàng)建數(shù)組可以是[], 創(chuàng)建正則可以是/.*/
4.4 構(gòu)造函數(shù)創(chuàng)建對(duì)象
var a = new Function(){ } var b = new Object({a:1}) var c = new Array(10) var d = new Date() var e = new Set()
我們直接(new)使用內(nèi)部對(duì)象的構(gòu)造函數(shù)就可以創(chuàng)建一個(gè)對(duì)象了。
// 除了內(nèi)置的一些對(duì)象之外,我們還可以使用普通的函數(shù)來構(gòu)建對(duì)象。 function person (){ } var p1 = new Person();
我們約定普通函數(shù)以小寫字母開頭,構(gòu)造函數(shù)以大寫字母開頭。
五、原型以及原型鏈
未完待續(xù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94354.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對(duì)于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:兩日前,發(fā)了一篇吐槽,莫名的火了一把。關(guān)于的第一個(gè),其實(shí)就是聲明一個(gè)常量,不允許變更。另外對(duì)象迭代這里出自,阮一峰大神寫的入門指南,對(duì)象篇。 兩日前,發(fā)了一篇吐槽,莫名的火了一把。經(jīng)過大家的建議與鼓勵(lì),于是修改了簡歷,開始了重新投遞,2天后接到第一份面試邀請(qǐng)。 此文為個(gè)人面試經(jīng)歷,QA問答過程與總結(jié),不透露面試公司及面試人員,內(nèi)容真實(shí),如果有面試過我的大佬看到博客,歡迎指出問題。 循序...
摘要:如果要理清原型和原型鏈的關(guān)系,首先要明確一下幾個(gè)概念中的所有東西都是對(duì)象,函數(shù)也是對(duì)象而且是一種特殊的對(duì)象中所有的東西都由衍生而來即所有東西原型鏈的終點(diǎn)指向?qū)ο蠖加幸粋€(gè)隱藏的屬性,他指向創(chuàng)建它的構(gòu)造函數(shù)的原型,但是有一個(gè)例外,指向的是。 首先要搞明白幾個(gè)概念: 函數(shù)(function) 函數(shù)對(duì)象(function object) 本地對(duì)象(native object) 內(nèi)置對(duì)象(bu...
閱讀 1936·2021-11-15 17:58
閱讀 2131·2021-10-19 11:45
閱讀 3482·2021-09-02 15:40
閱讀 2595·2021-07-25 10:50
閱讀 3745·2019-08-30 15:56
閱讀 3146·2019-08-30 12:44
閱讀 1028·2019-08-26 13:38
閱讀 1869·2019-08-23 18:29