瀏覽器中輸入url 後發生了什麼
```
1。dns域名解析(DNS解析(域名解析),DNS實際上是一個域名和IP對應的資料庫)
a。瀏覽器自身dns
b。作業系統dns
c。 讀取hosts檔案
d。 域名伺服器發起請求
2。建立tcp連線(三次握手)
a。第一次握手:客戶端向伺服器端傳送請求(SYN=1) 等待伺服器確認;
b。第二次握手:伺服器收到請求並確認,回覆一個指令(SYN=1,ACK=1);
c。第三次握手:客戶端收到伺服器的回覆指令並返回確認(ACK=1)
透過三次握手,建立了客戶端和伺服器之間的連線,現載可以請求和傳輸資料了。
3。發起http請求
a。請求報文
-1。 報文首部
1-1。請求行(方法,urI,http)
1-2請求首部欄位
1-3通用首部欄位
1-4其他 cookie 服務端收到cookie資訊
-2。空行
-3 報文主體
4。接受響應效果
響應報文
-1。 報文首部
1-1。狀態行(狀態碼狀態語)
1-2響應首部欄位
1-3通用首部欄位
1-4其他 cookie 服務端收到cookie資訊
1-5 實體首部欄位
-2。空行
-3 報文主體
5。瀏覽器解析HTML
a。 構建dom 樹 構成渲染樹
b。 下載資源
1-1 css 下載同時,繼續解析
1-2 js 等待下載並執行否再解析
預載入器(一個輕量級解析器,指令碼阻塞時,解析HTML中外部資源引入,並進行將在(不會改變dom樹,這是有主解析完成))
6。瀏覽器佈局渲染
a。 佈局 根據渲染樹佈局,計算每個節點的幾何資訊(在視口中的大小和位置) 所有相對度量單位都被轉換為螢幕上的絕對畫素位置
b。 繪製。在螢幕上繪製各個節點
()
```
型別判斷的方法
```
1。 typeof
* typeof null結果是object ,實際這是typeof的一個bug,null是原始值,非引用型別
* typeof [1, 2]結果是object,結果中沒有array這一項,引用型別除了function其他的全部都是object
* typeof Symbol() 用typeof獲取symbol型別的值得到的是symbol,這是 ES6 新增的知識點
2。 instanceof
用於例項與建構函式的對應
eg:
function Foo(name) {
this。name = name
}
var foo = new Foo(‘bar’)
console。log(foo instanceof Foo) true
3。 constructor
4。 Object。prototype。toString。call()
eg:
var Type = (function() {
var type = {};
var typeArr = [’String‘, ’Object‘, ’Number‘, ’Array‘,’Undefined‘, ’Function‘, ’Null‘, ’Symbol‘];
for (var i = 0; i < typeArr。length; i++) {
(function(name) {
type[’Is‘ + name] = function(obj) {
return Object。prototype。toString。call(obj) == ’[object ‘ + name + ’]‘;
}
})(typeArr[i]);
}
return type;
})();
呼叫方法:Type。IsFunction(function() {}) Type。IsObject({})。。。。。
```
### 陣列物件字串的原生方法
```
陣列
陣列| header 2
賦值方法| pop 和 push shift 和 unshift splice reverse sort
訪問方法|concat join slice toString indexOf lastIndexOf
迭代方法|forEach map filter some every reduce reduceRight
字串
1。轉換為字串型別(三種實現方式)
var num=110;
var mystr=num。toString(); //“110”
var num=111;
var mystr=String(num); //“111”
var num=112;
var mystr=“” + num; //“112”
2。字串分割返回新的陣列
var mystr=“qingchenghuwoguoxiansheng,woaishenghuo,woaiziji”;
var arr1=mystr。split(“,”); //[“qingchenghuwoguoxiansheng”,“woaishenghuo”,“woaiziji”];
var arr2=mystr。split(“”); //[“q”,“i”,“n”,“g”,“c”,“h”,“e”,“n”,“g”,“h”,“u”,“w”,“o”,“g”,“u”,“o”,“x”,“i”,“a”,“n”,“s”,“h”,“e”,“n”,“g”,“,”
,“w”,“o”,“a”,“i”,“s”,“h”,“e”,“n”,“g”,“h”,“u”,“o”,“,”,“w”,“o”,“a”,“i”,“z”,“i”,“j”,“i”];
:split()的第二個引數,表示返回的字串陣列的最大長度
var mystr=“qingchenghuwoguoxiansheng,woaishenghuo,woaiziji”;
var arr1=mystr。split(“,”,2); //[“qingchenghuwoguoxiansheng”,“woaishenghuo”];
var arr2=mystr。split(“”,8); //[“q”,“i”,“n”,“g”,“c”,“h”,“e”,“n”];
3。字串替換
var mystr=“wozaijinxingzifuchuantihuancaozuo,zifuchuantihuano”;
var replaceStr=mystr。replace(“zifuchuan”,“ ”); //wozaijinxing tihuancaozuo,zifuchuantihuano
var replaceStr=mystr。replace(/zifuchuan/,“ ”); //wozaijinxing tihuancaozuo,zifuchuantihuano
var replaceStr=mystr。replace(/zifuchuan/g,“ ”); //wozaijinxing tihuancaozuo, tihuano
4。 5。查詢子字串
判斷字串內是否包含子串,不少開發者會使用for迴圈來判斷,而忘記了JavaScript提供子串函式:
indexOf(),該Of() 方法對大小寫敏感。返回字串中一個子串第一處出現的索引(從左到右搜尋)。如果沒有匹配項,返回 -1
lastIndexOf(),該方法對大小寫敏感。返回字串中一個子串最後一處出現的索引(從右到左搜尋),如果沒有匹配項,返回 -1 。
6。返回指定位置的字元或其字元編碼值 charAt
它的一個兄弟函式就是查詢對應位置的字元編碼值
ChartCodeAt
6。 字串的連線
concat()函式可以有多個引數,傳遞多個字串,拼接多個字串。
7。 字串的切割和提取
slice() substring() substr()
1。slice() 可以為負數,如果起始位置為負數,則從字串最後一位向前找對應位數並且向後取結束位置,如果為正整數則從前往後取起始位置到結束位置。
2。substring()只能非負整數,擷取起始結束位置同slice()函式一致。
3。substr()與第一、第二種函式不同,從起始位置開始擷取,結束位置為第二個引數擷取的字串最大長度。
8。 大小寫轉化
toLowerCase() 轉小寫
toUpperCase() 轉大寫
9。 trim() 字串去空格
10 字串去重
eg:
var str=“aahhgggsssjjj”;
function removeRepeat(msg){
var res=[];
var arr=msg。split(“”);
for(var i=0;i if(res。indexOf(arr[i])==-1){ res。push(arr[i]); } } return res。join(“”); } removeRepeat(str); 11 。 var str=“aacccbbeeeddd”; var sum=[]; var res=[]; var count=0; var arr=str。split(“”); for(var i=0;i if(res。indexOf(arr[i])==-1){ res。push(arr[i]); } } for(var i=0;i for(var j=0;j if(arr[j]==res[i]){ count++; } } sum。push(count); count=0; } console。log(res); //[“a”, “c”, “b”, “e”, “d”] for(var i=0;i var str=(sum[i]%2==0)?“偶數”:“奇數”; console。log(res[i]+“出現了”+sum[i]+“次”); console。log(res[i]+“出現了”+str+“次”); } ``` 閉包 ``` 閉包的形成與變數的作用域以及變數的生存週期有著密切的關係 ##### 變數的作用域 1。全域性作用域 window 2。區域性作用域 每一個函式都是一個作用域 ##### 作用域鏈 當前函式內沒有這個變數,那麼隨著程式碼執行環境的建立的作用域鏈逐層搜尋,一直到window層,找不到丟擲一個未定義錯誤,這種從內向外查詢的關係被稱之為作用域鏈。 變數的生存週期 全域性變數的生存週期是永久的,而函式的內部宣告的變數,退出函式是,變數會隨著函式的結束而銷燬,因此,JavaScript允許使用內部函式, 所以,我們可以透過函式巢狀一個函式,透過另一個函式來訪問這個函式的區域性變數,利用閉包突破作用域鏈,將函式內部的變數和方法傳遞到外部,延續變數的生命,減少全域性環境的汙染,延續變數的 生命。 使用場景, 模組化,不同模組擁有自己獨立的執行環境,不會與全域性衝突,模組與模組之間透過丟擲介面進行依賴使用。像是經常使用的jquery 。(避免全域性衝突使用閉包實現自己的獨立環境) 維持變數不被回收 缺點, 記憶體洩露(一塊被分配的記憶體既不能被使用,又不能回收,直到程序結束) 閉包使得函式的變數都儲存在記憶體之中,記憶體消耗加大,需要手動釋放 出現的原因: 循化引用,js閉包,dom洩露 閉包,原型鏈,繼承,作用域,排序方法 ```