JavaScript中有很多內(nèi)置的對象
- 比如說全局對象Windows
- 全局函數(shù)
- 公用的屬性藏在哪
- toString是哪里來的
- 在瀏覽器里面才有Window,在node里面是沒有Window的.
- 無論你在哪個網(wǎng)頁都可以訪問到一個對象Window 歷史原因,瀏覽器早于JavaScriptECMA的制定. 在別的運(yùn)行環(huán)境中,JavaScript是有一個全局對象global,在瀏覽器中是window.
那為什么需要全局對象呢?也就說全局對象存在的意義?
因為JavaScript的內(nèi)存是空空如也,如果不提供源生的API你怎么操作啊? 要是自己再寫多麻煩啊? 也就是說全局對象是源生JavaScript提供的 日常使用的API,這個全局對象是Window,因為它是一個對象,所以有一個地址指向一個對象Window,Window里面有很多屬性,他就是一個hash.那么除了global還有哪些對象呢? 沒有了,因為global 所有的東西都放在window里面了. window下面又對應(yīng)很多對象, 這就是典型的B樹數(shù)據(jù)類型.(這也就是為什么分stack和hacp內(nèi)存的原因)
- Window下面的屬性分為兩類,第一類是ECMAScript規(guī)定的,除外呢就是私有的屬性.(也就是瀏覽器廠商自己寫的API提供給開發(fā)者使用的屬性,每個不同的瀏覽器廠商對私用的屬性實現(xiàn)也不一樣,因為沒有標(biāo)準(zhǔn)啊) 例子:alert prompt console confirm等屬性
- 那究竟有多少window 屬性呢?可以查MDN Window 關(guān)鍵字,它會詳細(xì)列出.
- 其中比較重要的就是document,它是私有的window屬性是瀏覽器廠商自己寫的提供給開發(fā)者使用的API.總的來說,window的屬性分為兩類,ECMA規(guī)定的和私有的(W3C規(guī)定的)
- document 對象提供了對文檔的一切操作,增刪改查~~~~.bom提供了可以操作瀏覽器的api比如history屬性.這也就是為什么學(xué)JavaScript要學(xué),ecma,bom,dom三部分/
- ECMA中 Number()的使用,1 Number() 2 var n = new Number
第二種用法可以把數(shù)字包裝成一個對象,真很奇怪啊! 為什么要把數(shù)字包裝成對象呢?他們又有什么區(qū)別呢? - 首先第一個,它們的內(nèi)存圖是不一樣的!!!! 被包裝過得數(shù)字是對象,不是簡單類型了, 他的值是一個地址指向另外一片內(nèi)存,那個內(nèi)存里面有一個屬性的值就是原始數(shù)字一般訪問不到這個原始的數(shù)字值,你要用valueof ()這個函數(shù)才能調(diào)用到原始的數(shù)值;除此之外還能調(diào)用tostring()函數(shù),屬性的名字XXXX ,除外因為是對象了,可以調(diào)用很多對象屬性和方法.
- 被包裝過之后的參數(shù),用typeof 運(yùn)算符返回的是對象類型.這么做的意義在哪里恩?
- JavaScript設(shè)計包裝對象的最大目的,首先是使得JavaScript的“對象”涵蓋所有的值。其次,使得原始類型的值可以方便地調(diào)用特定方法。
簡單來說,不包裝就是簡單的數(shù)值,包裝過后變成對象后,可以使用很多函數(shù)來操作這個數(shù)值.
- 可是這樣引發(fā)一個思考! 我不包裝數(shù)值,數(shù)值也可以調(diào)用toString方法啊,既然如此我為什么那么費(fèi)力不討好,為什么搞得那么復(fù)雜呢?
- 這和JavaScript的發(fā)明有關(guān)系,當(dāng)年JavaScript發(fā)明的時候,公司老板要求開發(fā)人員要像Java語言,var a = new Number(1)這種java使用方法沒有人用. 那么再引發(fā)一個問題了,雖然 var a =1 這種是開發(fā)人員喜歡的,但是它沒有函數(shù)可以操作啊,他就是一個簡單的數(shù)值.
var n = 1;
n.toString() //這是開發(fā)者妙招,當(dāng)代碼運(yùn)行到這里的時候,JavaScript引擎就馬上生成一個臨時的對象temp,temp的值是一個地址指向一個對象n,這樣n就可以使用函數(shù)了.當(dāng)n.toString運(yùn)行完畢后,temp這個對象就被抹殺掉.
- 問題來了,就算你是臨時變成了對象,也是對象啊,那么n.XX = 2;這樣添加方法的操作會不會報錯呢?//答案是不報錯,但是你調(diào)用它就是undefined,n.xx=2操作完之后的temp是被抹殺了, 當(dāng)你調(diào)用n.xx的時候,這時候生存的temp是新的,它里面已經(jīng)沒有.xx這個屬性了.所以結(jié)果為undefined. 畫內(nèi)存圖流程可以得到答案.
- temp = new Number(n); temp .toString() 在中間做了一個臨時的轉(zhuǎn)換.使得就算是簡單數(shù)值也可以調(diào)用 函數(shù)方法了,就這樣使得 new Number 這種復(fù)雜用法就徹底沒有人使用了.
JavaScript對象中的屬性太多,需要課后自己學(xué)習(xí)熟悉,下面講幾個重要的
- .trim() 裁剪修剪
數(shù)組 對象 標(biāo)準(zhǔn)庫
瀏覽器提供的東西,你可以用的都叫API
- 學(xué)習(xí)API的話,看MDN+阮一峰JavaScript
- MDN全面深入偏重理論,阮一峰淺顯易懂偏重使用
什么是瀏覽器標(biāo)準(zhǔn)庫
- 之前說過,JavaScript內(nèi)存分stack heacp ,瀏覽器中有一個global/window 它是一個對象,而且Windows是一個哈希表,內(nèi)面有很多東西,主要分成兩部分,標(biāo)準(zhǔn)庫,非標(biāo)準(zhǔn)庫.
- 標(biāo)準(zhǔn)庫: object,string,number,array,Boolean,function
- 之前老師講課,講到轉(zhuǎn)換類型,以及瀏覽器提供的轉(zhuǎn)換API,Number(),String(),Boolean() 注意這些都是大寫字母開頭.在括號里面加入?yún)?shù),是可以將對于的參數(shù)轉(zhuǎn)換成括號前標(biāo)明的類型.也就是說變成基本類型. 但是如果在前面加個new 也就是說:new Number(),new String(), new Boolean();那么他們是將參數(shù)轉(zhuǎn)換成對象, 在JavaScript中,把這種方法叫做包裝對象.
- 除了包裝對象意外,對象細(xì)分 函數(shù)+對象+數(shù)組三個,那么Object 和new Object的區(qū)別在哪里呢?
25課真筆記來了
- 給Object函數(shù)什么,就會包裝成對應(yīng)的類型.對于Object本身,加不加new都一樣.
- JavaScript 原生提供Object對象(注意起首的O是大寫),所有其他對象都繼承自這個對象。Object本身也是一個構(gòu)造函數(shù),可以直接通過它來生成新對象。Object作為構(gòu)造函數(shù)使用時,可以接受一個參數(shù)。如果該參數(shù)是一個對象,則直接返回這個對象;如果是一個原始類型的值,則返回該值對應(yīng)的包裝對象。
- Array是JavaScript的內(nèi)置對象,同時也是一個構(gòu)造函數(shù),可以用它生成新的數(shù)組。
- Number對象是數(shù)值對應(yīng)的包裝對象,可以作為構(gòu)造函數(shù)使用,也可以作為工具函數(shù)使用。作為構(gòu)造函數(shù)時,它用于生成值為數(shù)值的對象。
- String對象是JavaScript原生提供的三個包裝對象之一,用來生成字符串的包裝對象。
- Math是JavaScript的內(nèi)置對象,提供一系列數(shù)學(xué)常數(shù)和數(shù)學(xué)方法。該對象不是構(gòu)造函數(shù),不能生成實例,所有的屬性和方法都必須在Math對象上調(diào)用。
- Date對象是JavaScript提供的日期和時間的操作接口。
它可以表示的時間范圍是,1970年1月1日00:00:00前后的各1億天(單位為毫秒)。 - ....還有很多的對象,或者函數(shù),其實都是瀏覽器提供給開發(fā)者用的API.