成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js 深入 —— 從數(shù)據(jù)類型到原型鏈

FWHeart / 3172人閱讀

摘要:檢測數(shù)據(jù)類型中可以使用操作符來判斷數(shù)據(jù)類型。調(diào)用函數(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ù)值、字符串、布爾值這三種類型,合稱為原始類型,

對象則稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。

至于undefined和null,一般將它們看成兩個特殊值。

這里所講的合成類型object,其實式一個廣義的對象,他包括三個子類型,[狹義的對象array,function]

我們一般所說的對象都是狹義的對象。

基本數(shù)據(jù)類型是按照值進行分配的,是存放在了棧內(nèi)存的數(shù)據(jù)片段,可以直接訪問到。引用數(shù)據(jù)類型則是存放在堆內(nèi)存中的數(shù)據(jù),例如: var a = {}; a只是存儲了{}的指針,這個指針指向了內(nèi)存的地址。

檢測數(shù)據(jù)類型

javascript中可以使用typeof操作符來判斷數(shù)據(jù)類型。但是typeof null = object; 這是歷史遺留的bug;

typeof 123;               // "number"
typeof "hfhan";           // "string"
typeof true;              // "boolean"
typeof null;              // "object"  獨一份的與眾不同
typeof undefined;         // "undefined"
typeof Symbol("hfhan");   // "symbol"
typeof function(){};      // "function"   // 這里不是object哦~~~
typeof {};                // "object"
typeof window             // "object"
typeof {}                 // "object"
typeof []                 // "object"

null是一個表示“空”的對象,轉(zhuǎn)為數(shù)值時為0undefined是一個表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時為NaN

null和undefined的用法于含義

null表示空值,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時,某個參數(shù)未設置任何值,這時就可以傳入null,表示該參數(shù)為空。比如,某個函數(shù)接受引擎拋出的錯誤作為參數(shù),如果運行過程中未出錯,那么這個參數(shù)就會傳入null,表示未發(fā)生錯誤。

undefined表示“未定義”,下面是返回undefined的典型場景。

// 變量聲明了,但沒有賦值
var i;
i // undefined

// 調(diào)用函數(shù)時,應該提供的參數(shù)沒有提供,該參數(shù)等于 undefined
function f(x) {
  return x;
}
f() // undefined

// 對象沒有賦值的屬性
var  o = new Object();
o.p // undefined

// 函數(shù)沒有返回值時,默認返回 undefined
function f() {}
f() // undefined
可以轉(zhuǎn)換為false的值
undefined
null
false
0
NaN
""或""(空字符串)
二、對象類型

宿主環(huán)境

一般宿主環(huán)境由外殼程序創(chuàng)建于維護,只要是能夠提供js引擎執(zhí)行環(huán)境都稱為是外殼程序。如:web 瀏覽器, 桌面應用程序等。

即由web瀏覽器、桌面應用程序等的外殼程序所造就的環(huán)境就是宿主環(huán)境

js對象的分類

js的對象可以分為三類:內(nèi)部對象 宿主對象 自定義對象

1. 內(nèi)部對象

1.1 本地對象

ECMA-262把本地對象定義為是: 獨立于宿主環(huán)境的ECMASCRIPT實現(xiàn)所提供的對象。

本地對象包含Object Function Boolean String Array Date RegExp Number 以及各類錯誤對象(Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError

1.2 內(nèi)置對象

ECMA-262把內(nèi)置對象定義為是: 由 ECMAScript 實現(xiàn)提供的、獨立于宿主環(huán)境的所有對象,在 ECMAScript 程序開始執(zhí)行時出現(xiàn)。意味著你不需要明確實例化就可以是直接使用。

包括由 Global Math兩個內(nèi)置對象。

global

global對象算是一個比較特殊的對象了吧,因為不管你從哪個角度看,它都是不存在的。全局作用域下的一些屬性和方法比如: isNaN parseInt等。都是global的屬性和方法。
JavaScript 全局對象參考手冊

2. 宿主對象

宿主對象就是執(zhí)行JS腳本的環(huán)境提供的對象。對于嵌入到網(wǎng)頁中的JS來說,其宿主對象就是瀏覽器提供的對象,所以又稱為瀏覽器對象(BOM)。

不同的瀏覽器提供的宿主對象可能不同,即使提供的對象相同,其實現(xiàn)方式也大相徑庭!這會帶來瀏覽器兼容問題,增加開發(fā)難度。

瀏覽器對象有很多,如WindowDocument等等。

對于web瀏覽器而言,Global有一個代言人window,但是window并不是ECMAScripta規(guī)定的內(nèi)置對象,因為window對象是相對于web瀏覽器而言的,而js不僅僅可以用在瀏覽器中。

document對象是window對象的一個屬性,是顯示于窗口內(nèi)的一個文檔。而window對象則是一個頂層對象,它不是另一個對象的屬性。document可以理解為文檔,就是你的網(wǎng)頁,而window是你的窗口,就是你的瀏覽器打開所顯示的哪個窗口。

3. 自定義對象

顧名思義,就是開發(fā)人員自己定義的對象。JavaScrip允許使用自定義對象,使JavaScript應用及功能得到擴充

三、判斷對象的類型

使用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]"

下面正式進入我們的正題

四、構(gòu)造函數(shù)

在javascript中對象的創(chuàng)建有兩種方式,對象字面量構(gòu)造函數(shù)

4.1 對象字面量

var o1 = {  
    p:”I’m in Object literal”,  
    alertP:function(){  
        alert(this.p);  
    }  
}  
// 這種寫法不需要定義構(gòu)造函數(shù),因此不在本文的討論范圍之內(nèi)。這種寫法的缺點是,每創(chuàng)建一個新的對象都需要寫出完整的定義語句,不便于創(chuàng)建大量相同類型的對象,不利于使用繼承等高級特性。

4.2 構(gòu)造函數(shù)(構(gòu)造器)

new表達式是配合構(gòu)造函數(shù)使用,可以實現(xiàn)更好的效果

new String(“a string”)
// 調(diào)用內(nèi)置的String()方法來構(gòu)建了一個字符串對象。



function CO(){  
    this.p = “I’m in constructed object”;  
    this.alertP = function(){  
        alert(this.p);  
    }  
}  
var o2 = new CO();  
針對new操作符號在調(diào)用構(gòu)造函數(shù),我們來刨析一下具體發(fā)生了什么

發(fā)生了四件事

var obj = {}; // 第一步創(chuàng)建一個空對象
obj.__proto__ = CO.prototype; // 讓空對象的成員指向構(gòu)造函數(shù)的prototype成員對象
CO.call(obj); // 第三步,將構(gòu)造函數(shù)的作用域賦值給新的對象
return obj; // 返回新的對象

注意

function C2(a, b){  
    this.p = a + b;  
    this.alertP = function(){  
        alert(this.p);  
    }  
    return this.p;//此返回語句在C2作為構(gòu)造函數(shù)時沒有意義  
}  
var c2 = new C2(2,3);  
c2.alertP();//結(jié)果為5  
alert(C2(2, 3)); //結(jié)果為5  

// 該實例是可行的,但是不推薦哦,
// 該函數(shù)既可以用作構(gòu)造函數(shù)來構(gòu)造一個對象,也可以作為普通的函數(shù)來使用。用作普通函數(shù)時,它接收兩個參數(shù),并返回兩者的相加的結(jié)果。為了代碼的可讀性和可維護性,建議作為構(gòu)造函數(shù)的函數(shù)不要摻雜除構(gòu)造作用以外的代碼;同樣的,一般的功能函數(shù)也不要用作構(gòu)造對象。

以上兩種方式中展現(xiàn)的都是我們自定義的對象,看了兩種創(chuàng)建對象對的方式,我們來結(jié)合內(nèi)部對象來繼續(xù)分析:

4.3 普通創(chuàng)建法

一個函數(shù)可以通過下面的方式直接創(chuàng)建。

function a(){

}

創(chuàng)建一個對象例如是object 可以是 {} ,創(chuàng)建數(shù)組可以是[], 創(chuàng)建正則可以是/.*/

4.4 構(gòu)造函數(shù)創(chuàng)建對象

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)部對象的構(gòu)造函數(shù)就可以創(chuàng)建一個對象了。

// 除了內(nèi)置的一些對象之外,我們還可以使用普通的函數(shù)來構(gòu)建對象。

function person (){
}

var p1 = new Person();

我們約定普通函數(shù)以小寫字母開頭,構(gòu)造函數(shù)以大寫字母開頭。

五、原型以及原型鏈

未完待續(xù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94354.html

相關(guān)文章

  • JS程序

    摘要:設計模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設計模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學習總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評論0 收藏0
  • 深入理解JavaScript

    摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...

    myeveryheart 評論0 收藏0
  • 關(guān)于個人第一天前端面試的面試問答QA,希望能對其他找前端工作的朋友有所幫助。

    摘要:兩日前,發(fā)了一篇吐槽,莫名的火了一把。關(guān)于的第一個,其實就是聲明一個常量,不允許變更。另外對象迭代這里出自,阮一峰大神寫的入門指南,對象篇。 兩日前,發(fā)了一篇吐槽,莫名的火了一把。經(jīng)過大家的建議與鼓勵,于是修改了簡歷,開始了重新投遞,2天后接到第一份面試邀請。 此文為個人面試經(jīng)歷,QA問答過程與總結(jié),不透露面試公司及面試人員,內(nèi)容真實,如果有面試過我的大佬看到博客,歡迎指出問題。 循序...

    Youngdze 評論0 收藏0
  • JS原型原型深入理解

    摘要:如果要理清原型和原型鏈的關(guān)系,首先要明確一下幾個概念中的所有東西都是對象,函數(shù)也是對象而且是一種特殊的對象中所有的東西都由衍生而來即所有東西原型鏈的終點指向?qū)ο蠖加幸粋€隱藏的屬性,他指向創(chuàng)建它的構(gòu)造函數(shù)的原型,但是有一個例外,指向的是。 首先要搞明白幾個概念: 函數(shù)(function) 函數(shù)對象(function object) 本地對象(native object) 內(nèi)置對象(bu...

    Alex 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<