《javascript高級程序設計》javascript
什麼是javascript?java
一種直譯式腳本語言,是一種動態類型、弱類型、面向對象、基於原型的語言,內置支持類型。它的解釋器被稱爲javascript引擎,爲瀏覽器的一部分,普遍用於客戶端的腳本語言。c++
Javascript的數據類型有哪些?程序員
Undefined;null;boolean;string;number;symbol;objectes6
Undefined:未定義。正則表達式
Null:定義了可是爲空,即定義了可是尚未賦值。數組
Boolean:true/false。瀏覽器
String:字符串,有最大長度。異步
Number:數字,有幾種特殊狀況:NaN;infinity(無窮大);-infintty(負無窮大)函數
什麼是對象?
對象具備惟一性,惟一標識是內存地址,在js中,對象全部的屬性和方法都概括爲「屬性」(js中對象的行爲和狀態都能用屬性來抽象),而且和c++和java不一樣,js中對象的屬性(包括方法)能夠在運行中更改。js語言標準已經說明,js是一門面向對象的語言,我想標準中能這樣說,正是由於js的高度動態性的對象系統(js的對象系統具備極高的靈活性)。js是基於原型的面向對象的腳本語言,es6中引入了class定義類的方式,new和function搭配的怪異方式終於能夠退休了,任何場景winter都推薦使用class類的寫法。類的寫法實際上也是由原型運行時承載的,邏輯上javascript認爲每一個類是由共同原型的一組對象,類中定義的方法和屬性則會被寫在原型對象之上。
面對對象和基於對象有什麼區別?
面向對象的三大特色(封裝,繼承,多態)缺一不可。一般「基於對象」是使用對象,可是沒法利用現有的對象模板產生新的對象類型,繼而產生新的對象,也就是說「基於對象」沒有繼承的特色。而「多態」表示爲父類類型的子類對象實例,沒有了繼承的概念也就無從談論「多態」。如今的不少流行技術都是基於對象的,它們使用一些封裝好的對象,調用對象的方法,設置對象的屬性。可是它們沒法讓程序員派生新對象類型。他們只能使用現有對象的方法和屬性。因此當你判斷一個新的技術是不是面向對象的時候,一般可使用後兩個特性來加以判斷。「面向對象」和「基於對象」都實現了「封裝」的概念,可是面向對象實現了「繼承和多態」,而「基於對象」沒有實現這些,的確很饒口。簡單地說:基於對象不能繼承,更談不上多態.
有哪些方法能夠獲取原型對象?
1:從構造函數獲取原型對象
構造函數.prototype
2:從對象實例獲取父級原型對象
a:對象實例._proto_ (有兼容性問題,不建議使用)
b:object.getprototypeof(對象實例)
javascript中的對象有哪些?
宿主對象(取決於js的運行環境,好比運行在瀏覽器則由windos對象)
內置對象(內置對象又分爲:固有對象;原生對象;普通對象)
宏觀任務和微觀任務有什麼區別?
宿主發生的任務叫宏觀任務,js引擎發起的任務叫微觀任務,微任務優先於宏任務。咱們首先應該造成一個感性的認知:一個javascript引擎會常駐於內存中,它等待着咱們(宿主)把js代碼或者函數傳遞給它執行。
肯定異步代碼執行順序,咱們這樣總結:
1:首先咱們分析有多少個宏任務;
2:在每一個宏任務中,分析有多少個微任務;
3:根據調用次序,肯定宏任務中的微任務執行次序;
4:根據宏任務的出發規則和調用次序,肯定宏任務的執行次序;
5:肯定整個順序。
哪些語句會由於let而產生做用域?
var聲明變量有不少瑕疵,後來引入了let。爲了實現let,js在運行時引入了塊級做用域。也就是,在let出現以前,js的if for等語句皆不會產生做用域。簡單統計,如下語句會產生let的使用的做用域:for;if;switch;try/catch/finally。題外話:當即執行函數,能夠構造一個新的域,從而控制var的範圍(當即執行函數前應該加分號,或者加void)
js代碼到底要不要加分號?
關於分號,大部分時候不用加分號,少部分要注意:
1:以括號開頭的語句,如當即執行函數
2:以數組開頭的語句,可能被解析成下標
3:以正則表達式開頭的語句,斜槓可能被解析成除號
4:以template開頭的語句