javascript
《JavaScript权威指南》学习笔记 第二天 下好一盘大棋
? ? ?前段學(xué)習(xí)js的時候總是零零散散的,以至于很多東西都模棱兩可。時間稍微一久,就容易忘記。最主要的原因是這些東西,原來學(xué)的時候就不是太懂,以至于和其他知識無法形成記憶鏈,所以孤零零的知識特別容易忘記。重溫犀牛書,加上最近對記憶宮殿的記憶方法有點感興趣,于是結(jié)合起來來做筆記。
?
開始吧,上去先扔一張我畫的js的數(shù)據(jù)類型。后面的所有東西,基本上都是基于這張圖的。
?
?
原始類型沒啥說的,就是string,number ,boolean 。
? ? ? 對象類型包括 對象。其實還有Array, func 也是特殊的對象。 ?對象其實就是一個鍵值對,在php里面叫關(guān)聯(lián)數(shù)組。值可以是原始類型即string, boolean、number,當(dāng)然也可以還是一個對象。
? ? ? 這里面有兩個特殊的東西,叫null和undefined。null在各種語言里都比較常見。在js里面null == undefined。這兩個特殊的東西,叫做特殊的原始值,因為其數(shù)據(jù)類型就是其值,其值不能被修改(不可變 immutable).null和undefined的區(qū)別在哪里呢?區(qū)別在于null常表示我們程序級別的,正常的空值。如變量沒有賦值的時候,到了瀏覽器語法檢查的時候,會在該變量作用域的頂部聲明該變量,這個時候給這個變量賦的值就是null.但是當(dāng)該變量不存在的時候,下面卻調(diào)用了,就會報undefined,因此可以認為undefined是系統(tǒng)級別的,類似于語法錯誤。?
? ? ? 有對象就有類,對象是實例化的類。js的對象是一個大對象,當(dāng)create一個頁面的時候,就會被js構(gòu)造器(construct)創(chuàng)造出來 數(shù)組對象(Array)、函數(shù)對象(function)、日期對象(date)、正則對象(RegExp)以及錯誤對象(Error).這點稍后會詳細的講下。
? ? ? 上面是從從數(shù)據(jù)類型維度來區(qū)分js的值的。數(shù)據(jù)類型是后面的基礎(chǔ),從是否擁有方法又可以區(qū)分,可以擁有方法的類型,不擁有方法的類型。可變的類型,與不可改變的類型、
從擁有方法來講,其實原始類型是不擁有方法的,但是js的特殊性卻讓原始類型也擁有了方法。比如toString()的方法。這些不擁有方法的類型在調(diào)用方法的時候,會先變成包裝對象(一個調(diào)用后立即銷毀的對象),所以原始類型也是擁有方法的類型。但是特殊的類型 null 與 undefined 不擁有方法,因為其值不允許被改變,有方法有個毛用啊。
? ? ?從值可變與不可變的角度來說。原始類型的值是不能被改變的。平時在使用的過程中,確實發(fā)現(xiàn)其值改變了,那是因為我們將改變后的值賦給了新的變量。其原變量本身是沒有變化的。字符串是由字符組成的數(shù)組,這點和C語言一樣,比較好理解。
?
直接量:
什么叫直接量,就是簡單直接粗暴的賦值。類似 var a = 3; ??
直接量,直接賦值。區(qū)別于調(diào)用new String() ?new Number() 來產(chǎn)生的變量。使用直接量,程序沒有執(zhí)行的時候,并不知道值得類型,等到語法解析編譯的時候,才會根據(jù)其具體的值,指定變量類型。因此這樣的方式聲明的變量就叫做直接量。
?
全局對象
瀏覽器啟動,create一個新的頁面。js的全局對象已經(jīng)被創(chuàng)造好了。也就是一個大對象生下了一堆小對象。對于大對象來說,這是一堆小對象,但是對于我們來說。他們?nèi)允且粋€對象類,我們需要去實例化。
大對象生出了一堆東西:
全局屬性: undefined、Infinity、Nan
全局函數(shù):isNaN() ?、parseInt() 、eval()
構(gòu)造函數(shù):(我更喜歡稱為構(gòu)造類)Date() 、RegExp()、String() 、Object() 、Array(). 之所以稱為是構(gòu)造函數(shù),是因為我們也可以直接把他們當(dāng)做函數(shù)使用,在原始類型變成對象的時候,也充當(dāng)包裝對象。
全局對象: Math() 、JSON。
?
包裝對象
這個名字起的比較好。假設(shè)原始類型string 、number 、boolean 分別是烤雞、烤鴨、烤兔。當(dāng)他們變成商品(對象)去賣的時候、就會包上一層包裝紙,錫箔紙、包裝袋。但是這個包裝紙的作用是有限的,當(dāng)其完成其固有的作用的時候,就會被丟棄(包裝對象被銷毀)。
所謂的包裝對象就是用完就丟棄,就像物品的包裝袋一樣。
?
類型轉(zhuǎn)換:
這個分為原始類型之間的轉(zhuǎn)換、對象之間的轉(zhuǎn)換、原始類型轉(zhuǎn)為對象、對象轉(zhuǎn)為原始類型三部分。
原始類型之間互轉(zhuǎn)主要通過內(nèi)隱的方法進行自動轉(zhuǎn)換,也可以調(diào)用系統(tǒng)的構(gòu)造函數(shù)。
原始類型變對象,通過包裝對象。
對象變原始類型。主要是變成字符串和數(shù)字兩種。 通過調(diào)用對象內(nèi)的一個魔術(shù)方法。這個原理和php里面的將變量變成當(dāng)成字符串輸出的原理是一樣的。
?
變量作用域與作用域鏈:
這種東西,畫個圖什么的,就清晰多了。
?
A的變量作用域在A - E,B的變量作用域在B-E,以此類推E的變量作用域在E。
但是E想使用A的一個變量怎么辦,js不像人一樣聰明,直接去D拿,況且js也不知道變量在哪。E先問D有沒有,D要沒有了,再問C,C沒有了問B,最后一直問到A。如果A也沒有咋辦,E發(fā)現(xiàn)自己上當(dāng)受騙了,于是跑到頂層全局對象Error() 那里告狀,然后在頁面上引發(fā)一個ReferenceError(叫你不給我,哼!)的錯誤。這點很像冒泡,也許冒泡就是從這里面來的吧。
這就是JS的作用域鏈。
?
天寒,晚安。
?
轉(zhuǎn)載于:https://www.cnblogs.com/roverliang/p/4979538.html
總結(jié)
以上是生活随笔為你收集整理的《JavaScript权威指南》学习笔记 第二天 下好一盘大棋的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: angelababy和王丽坤同框大笑,这
- 下一篇: 史上最全的maven pom.xml文件