專場:
1. 什么是ajax, 簡述一下 ajax 請求數(shù)據(jù)的過程
AJAX即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML)刨疼,是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。
通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換鹅龄,AJAX 可以使網(wǎng)頁實現(xiàn)異步更新揩慕。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新扮休。
Ajax的使用
(1)創(chuàng)建`XMLHttpRequest`對象,也就是創(chuàng)建一個異步調(diào)用對象.
(2)創(chuàng)建一個新的`HTTP`請求,并指定該`HTTP`請求的方法迎卤、`URL`及驗證信息.
(3)設(shè)置響應(yīng)`HTTP`請求狀態(tài)變化的函數(shù).
(4)發(fā)送`HTTP`請求.
(5)獲取異步調(diào)用返回的數(shù)據(jù).
(6)使用JavaScript和DOM實現(xiàn)局部刷新.
getData(url, fn) {
? ? // 實例化XMLHttpRequest對象
? ? var xhr = new XMLHttpRequest();
? ? // 監(jiān)聽狀態(tài)
? ? xhr.onreadystatechange = () => {
? ? // 數(shù)據(jù)請求完畢? ? ? ? ? ? 判斷狀態(tài)碼
? ? if (xhr.readyState === 4&&xhr.status === 200) {
? ? // 將數(shù)據(jù)轉(zhuǎn)化成json在、數(shù)組
? ? fn && fn(JSON.parse(xhr.responseText))
? ? }
? ? }
? ? // 打開數(shù)據(jù)請求? 請求方式玷坠,路徑蜗搔,同步false 異步true(默認)
? ? xhr.open('get/post', "路徑", "true/false");
? ? // 發(fā)送數(shù)據(jù)
? ? xhr.send(null)
}
2. 簡述 this 的 四種指向 問題
this指向的形式4種
a.如果是一般函數(shù),this指向全局對象window;
b.在嚴格模式下"use strict",為undefined.
c.對象的方法里調(diào)用,this指向調(diào)用該方法的對象.
(call,apply,bind會改變this的指向)
.call(),? call(thisScope, arg1, arg2, arg3...)
.apply(), apply(thisScope, [arg1, arg2, arg3...]);兩個參數(shù)
Bind(this) 返回的是一個函數(shù)
d.構(gòu)造函數(shù)里的this,指向創(chuàng)建出來的實例.
3. jquery 的優(yōu)點和缺點
JQ的優(yōu)點:
(1)使用模塊化思想,模塊間保持獨立,不會導(dǎo)致多個開發(fā)人員合作時產(chǎn)生沖突
(2)結(jié)構(gòu)清晰,高內(nèi)聚八堡,低耦合
(3)多態(tài)的方式使方法可以重載樟凄,提高了代碼的復(fù)用率
(4)jQuery 的鏈式調(diào)用以及回溯(dom操作的鏈式操作)
(5)jQuery.fn.extend 與 jQuery.extend方法來實現(xiàn)擴展靜態(tài)方法或?qū)嵗椒?/p>
JQuery的特點()
(1).一款輕量級的js框架。 JQuery核心js文件才幾十kb兄渺,不會影響頁面加載速度
(2).豐富的DOM選擇器(CSS1-3 + XPath) JQuery的選擇器用起來很方便缝龄,好比要找到某個dom對象的相鄰元素js可能要寫好幾行代碼,而JQuery一行代碼就搞定了挂谍。
(3).鏈式表達式叔壤。 JQuery的鏈式操作可以把多個操作寫在一行代碼里,更加簡潔口叙。
(4).事件炼绘、樣式、動畫支持妄田。 JQuery還簡化了js操作css的代碼俺亮,并且代碼的可讀性也比js要強。
(5).Ajax操作支持疟呐。JQuery簡化了AJAX操作脚曾,后臺只需返回一個JSON格式的字符串就能完成與前臺的通信。
(6).跨瀏覽器兼容萨醒。JQuery基本兼容了現(xiàn)在主流的瀏覽器斟珊,不用再為瀏覽器的兼容問題而傷透腦筋。
(7).插件擴展開發(fā)。JQuery有著豐富的第三方的插件囤踩,例如:樹形菜單旨椒、日期控件、圖片切換插件堵漱、彈出窗口等等基本前臺頁面上的組件都有對應(yīng)插件综慎。
(8).可擴展性強。? JQuery提供了擴展接口:JQuery.extend(object),可以在JQuery的命名空間上增加新函數(shù)勤庐。JQuery的所有插件都是基于這個擴展接口開發(fā)的示惊。
JQuery的缺點
<1>.不能向后兼容。每一個新版本不能兼容早期的版本愉镰。舉例來說米罚,有些新版本不再支持某些selector,新版jQuery卻沒有保留對它們的支持丈探,而只是簡單的將其移除录择。這可能會影響到開發(fā)者已經(jīng)編寫好的代碼或插件。
<2>.插件兼容性碗降。與上一點類似隘竭,當(dāng)新版jQuery推出后,如果開發(fā)者想升級的話讼渊,要看插件作者是否支持动看。通常情況下,在最新版jQuery版本下爪幻,現(xiàn)有插件可能無法正常使用菱皆。開發(fā)者使用的插件越多,這種情況發(fā)生的幾率也越高笔咽。我有一次為了升級到j(luò)Query 1.3搔预,不得不自己動手修改了一個第三方插件。
<3>.多個插件沖突叶组。 在同一頁面上使用多個插件時,很容易碰到?jīng)_突現(xiàn)象历造,尤其是這些插件依賴相同事件或selector時最為明顯甩十。這雖然不是jQuery自身的問題,但卻又確實是一個難于調(diào)試和解決的問題吭产。
<4>.jQuery的穩(wěn)定性侣监。 jQuery沒有讓瀏覽器崩潰,這里指的是其版本發(fā)布策略臣淤。jQuery 1.3版發(fā)布后僅過數(shù)天橄霉,就發(fā)布了一個漏洞修正版1.3.1。他們還移除了對某些功能的支持邑蒋,可能會影響許多代碼的正常運行姓蜂。我希望類似修改不要再出現(xiàn)按厘。
<5>.對動畫和特效的支持差。 在大型框架中钱慢,jQuery核心代碼庫對動畫和特效的支持相對較差逮京。但是實際上這不是一個問題。目前在這方面有一個單獨的jQuery UI項目和眾多插件來彌補此點束莫。
4. 跨域如何產(chǎn)生 如何解決跨域
跨域問題的產(chǎn)生就是瀏覽器的同源策略 只有當(dāng)協(xié)議懒棉、端口、和域名都相同的頁面览绿,則兩個頁面 具有相同的源策严。只要有一個不同,就產(chǎn)生跨域問題
1 使用代理.代理就是用在后端監(jiān)聽這個端口,只要是這個端口,就轉(zhuǎn)發(fā)到真正的服務(wù)器地址,獲取數(shù)據(jù)后在通過同源的端口返回數(shù)據(jù)
2.使用jsonp script標(biāo)簽的src沒有同源限制 jsonp通過script標(biāo)簽src獲取接口 拼接了一個 callback,回調(diào)函數(shù)名稱是 cb
3.使用CORS Cross-Origin Resource Sharing(CORS)跨域資源共享是一份瀏覽器技術(shù)的規(guī)范饿敲,提供了 Web 服務(wù)從不同域傳來沙 盒腳本的方法妻导,以避開瀏覽器的同源策略,確保安全的跨域數(shù)據(jù)傳輸诀蓉。 服務(wù)器一般需要增加如下響應(yīng)頭的一種或幾種:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
跨域請求默認不會攜帶Cookie信息栗竖,如果需要攜帶,請配置下述參數(shù):
"Access-Control-Allow-Credentials": true
// Ajax設(shè)置
"withCredentials": true渠啤、
瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時狐肢,域名、端口沥曹、協(xié)議任一不同份名,都是跨域
解決:
1、jsonp跨域
2妓美、nginx反向代理(中間件):
3僵腺、PHP端修改header
4、document.domain
5壶栋、window.name
6辰如、postMessage
7. call/apply 里面的第一個參數(shù)
5. 什么是閉包 項目如何使用閉包 閉包有什么優(yōu)缺點
解釋:函數(shù)套函數(shù)。閉包兩個需求:1.必須有兩個函數(shù)贵试,并且是嵌套關(guān)系琉兜,外面的函數(shù)必須返回里面的函數(shù);2.在全局中必須接收返回 函數(shù)作為變量儲存
缺點:閉包最大缺點就是會造成內(nèi)存泄漏毙玻,存在堆中豌蟋,不會被垃圾回收;
閉包產(chǎn)生的原因:
Js 最大的缺點就是沒有類桑滩,尤其是es5梧疲,自身沒有面向?qū)ο螅兞亢秃瘮?shù)通常都是寫在同一個空間中,變量重名—污染幌氮,函數(shù)名重名—污染
而閉包能夠形成一個封閉的空間缭受,可以避免污染,儲存私有變量浩销,存在函數(shù)里面 贯涎,這個私有變量不會在函數(shù)運行完后被清理 ,可以像全局變量一樣被使用慢洋,不會失效塘雳。
優(yōu)點:
1.內(nèi)容更封閉,保證命名不會沖突普筹;
2.模塊化開發(fā)—封閉的模塊化環(huán)境
6. 談?wù)勀銓γ嫦驅(qū)ο蟮睦斫?面向?qū)ο蟮奶攸c
類與對象
Array? 類
var obj =new Array()? 變?yōu)閷ο?/p>
類:是一個抽象的概念
對象:實際的內(nèi)容
類就是對某些個體的所有的方法和屬性的集合
實例化過程:
1.先構(gòu)造概念
2.將概念實例化就形成了對象
面向?qū)ο螅合葮?gòu)造概念败明,然后將概念實例化,所有實例化對象都可以使用概念內(nèi)的方法
通俗的理解就是:萬物皆對象太防!世界上的任何事和物都可以被視為對象妻顶,而我們需要關(guān)注的是對象本身可以實現(xiàn)的功能,不需要深入理解構(gòu)成對象的元素蜒车。
js中的面向?qū)ο?/p>
面向?qū)ο笤趈s里有兩個層次的含義讳嘱,第一種是會使用面向?qū)ο蠛瘮?shù);第二種是構(gòu)造面向?qū)ο蠛瘮?shù)酿愧。
js也是面向?qū)ο笾械囊环N寫法沥潭,不過相對于java,js是一種弱數(shù)據(jù)類型嬉挡,并不是嚴格意義上的面向?qū)ο蠖鄹搿5莏q就是使用面向?qū)ο蟮膶懛▌?chuàng)作出來的js庫。
面向?qū)ο蟮奶攸c
(“抽風(fēng)機”諧音記憶)
面向?qū)ο笥兴膫€特點:
1. 抽象:抓住核心問題
2. 封裝:即把能夠?qū)崿F(xiàn)功能的函數(shù)寫成封裝起來庞钢,在面向?qū)ο罄锝凶龇椒ò吻 :唵蝸碚f就是把實現(xiàn)功能的函數(shù)寫成方法。
3. 繼承:繼承的意思是基括,在實現(xiàn)同一種功能的前提下颜懊,新對象可以使用就對象的屬性和方法。
4. 多態(tài):一個變量在引用不同類型的情況下的不同狀態(tài)风皿。多態(tài)開發(fā)在開發(fā)組件和模塊化開發(fā)的時候能節(jié)省很多資源饭冬。
原型(prototype)
原型可以用來構(gòu)造函數(shù)的屬性和方法,使這個構(gòu)造函數(shù)的屬性和方法成為公用的揪阶。使用原型的優(yōu)點:在內(nèi)存中節(jié)省資源,提高系統(tǒng)性能患朱。
這是一個用原型構(gòu)造的數(shù)組方法鲁僚,將求和的sum方法掛在原型上,可以使這個方法被重復(fù)使用,當(dāng)然冰沙,重點是節(jié)省內(nèi)存資源侨艾。
使用原型還有一個優(yōu)點,就是優(yōu)先級:
原型的優(yōu)先級類似于CSS中的優(yōu)先級拓挥,沒有使用原型的構(gòu)造函數(shù)唠梨,就好比CSS中的行內(nèi)樣式,優(yōu)先級高侥啤,而與原型掛鉤的屬性和方法 当叭,就像是style的內(nèi)聯(lián)樣式,優(yōu)先級低于行內(nèi)樣式盖灸。所以在調(diào)用同一種方法名的時候蚁鳖,系統(tǒng)會優(yōu)先調(diào)用掛在原型上的方法!
7. 如何深入理解原型鏈
進行方法調(diào)用的時候赁炎,會先在自身上查找醉箕,如果沒有就去該實例的原型鏈上查找,直到找到為止徙垫,如果沒找到就返回undefined讥裤。
原型鏈就是創(chuàng)建一個構(gòu)造函數(shù),它會默認生成一個prototype屬性并指向原型對象姻报。使用下一個構(gòu)造函數(shù)的原型對象作為這個構(gòu)造函數(shù)的實例己英。即 nextFuction.prototype = new thisFuction();
在下下一個構(gòu)造函數(shù)的原型對象 = new nextFuction。這樣下去就會構(gòu)成一條實例與原型之間的鏈條逗抑,這就是原型鏈剧辐。
在構(gòu)造函數(shù)中定義的屬性和方法實際上是實例的屬性和方法。即只能出現(xiàn)在實例中邮府。同理因為在構(gòu)造函數(shù)SubType中定義的subProperty屬性是實例屬性荧关,所以存在于instance中。實例中會有一個[[prototype]]內(nèi)部屬性指向構(gòu)造函數(shù)的原型對象褂傀。這樣就形成了一條鏈忍啤。
在通過原型鏈實現(xiàn)繼承的情況下,當(dāng)讀取模式訪問實例中的屬性時仙辟,會先搜索實例同波,然后再搜索實例的原型,在一層一層直到找到或者到達原型鏈的末端停止叠国,返回undefined未檩。
其實我們上面的是少一環(huán)的,即Object粟焊。因為所有引用類型都是從object繼承來的冤狡。
原型鏈就是設(shè)置構(gòu)造函數(shù)的屬性時孙蒙,會向它的父元素上面的原型上查找,如果原型沒有的話就去object上面查找悲雳,如果大寫的Object上面沒有的話挎峦,就為undefined,自己有的就用自己的
8. setInterval/setTimeout 傳參數(shù) 的四種不同寫法 setInterval(()=>,1)
一合瓢、采用字符串形式setInterval("foo(id)",1000);
二坦胶、匿名函數(shù)包裝 window.setInterval(function() { foo (id); }, 1000);
三、定義返回?zé)o參函數(shù)的函數(shù)
function foo(id){
? ? alert(id);
}
function _foo(id){
? ? return function() {
? ? foo(id);
} }
window.setInterval(_foo(id),1000);
四晴楔、修改setInterval
var _sto = setInterval;
window.setInterval = function(callback,timeout,param){
? ? var args = Array.prototype.slice.call(arguments,2);
? ? var _cb = function() {
? ? callback.apply(null,args);
? ? }
? ? _sto(_cb,timeout);
}
window.setInterval(hello,3000,userName);
9. 如何區(qū)分 宿主對象 內(nèi)置對象 本地對象 分別有哪些?
宿主對象? window? document? ? 簡單的說就是官方未定義的都是宿主對象
內(nèi)置對象? 不可以實例化的對象? 例如: Global? Math
本地對象? 可以實例化的對象 例如:? Object Array? Function Number RegExp Date ...
10. url https://www.aliyun.com/node/day?id=1234&price=100#level1
協(xié)議 域名 search query path pathname host hostname hash
假設(shè)這是一個url地址http://localhost:8080/a/b/c?a=1&b=2#abc顿苇,里面包含的部分:
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
將一個URL解析成一個對象,第2滥崩、3個參數(shù)都是boolean類型岖圈,parseQueryString定義是否將查詢字符串query轉(zhuǎn)化為object,默認為false不轉(zhuǎn)換
用到的最多的就是pathname和query兩個屬性了钙皮,請注意區(qū)分host/hostname蜂科、search/query、path/pathname之間的區(qū)別
protocol: 'http:',//協(xié)議
host: 'localhost:8080',
port: '8080',//端口
hostname: 'localhost',域名
hash: '#abc',
search: '?a=1&b=2',
query: 'a=1&b=2',
pathname: '/a/b/c',
path: '/a/b/c?a=1&b=2',
href: 'http://localhost:8080/a/b/c?a=1&b=2#abc'
11. Query 中短条,$.data() 和 $(“#aa”).data() 各自是什么作用导匣,有什么區(qū)別? 靜態(tài)屬性方 法 實例(prototype 原型對象)屬性的方法
$.data()是從 Jquery對象 中取值茸时,靜態(tài)屬性方法
$(“#aa”).data() 在頁面元素里找到id為aa對象贡定,從中獲取data值,實例屬性的方法
$.data()是靜態(tài)屬性的方法 通過data()函數(shù)存取的數(shù)據(jù)都是臨時數(shù)據(jù)可都,一旦頁面刷新缓待,之前存放的數(shù)據(jù)都將被移除。
$(“#aa”).data()是實例(proto原型對象)屬性的方法
向被選元素附加數(shù)據(jù)渠牲,或者從被選元素獲取數(shù)據(jù)旋炒。
12. jQuery 中 , $.fn ($ = jQuery) 和 $.prototype 三種的區(qū)別 $ 和 jQuery 的區(qū)別
$是jquery的另一種表現(xiàn)形式签杈;
$.fn是$.prototype的別名瘫镇;
$.fn是$的原型對象
$拓展的方法是靜態(tài)方法,可以使用$直接調(diào)用
$.fn拓展的方法是實例方法答姥,必須由“對象”$("")來調(diào)用
function jQuery(){
this...
return jQuery = $
}
靜態(tài)屬性
jQuery.ajax = func ($.ajax)
jQuery.get = func
jQuer.post = $.psot = func
$.each = func
原型對象屬性 (實例屬性) $("#box").show ==> jQuery 的實例化 尋找DOM
jQuery.prototype.show = func
jQuery.prototype.hide = func
jQuery.prototype.css = func
$.fn = jQuery.fn = $.prototype
jQuery.js
jQuery 變量名
$ == jQuery fn = prototype
$.fn = jQuery.fn = $.prototype = jQuery.prototype = 原型對象
jQuery靜態(tài)屬性的擴展 $.getData
$.extend({
getData(){
}
})
jQuery原型對象屬性擴展 $("#box").anmiateFade()
$.fn.extend({
anmiateFade(){
}
})
13. 簡述一下 你對 TCP三次握手 的理解
"傳輸層"的功能铣除,就是建立"端口到端口"的通信。相比之下鹦付,"網(wǎng)絡(luò)層"的功能是建立"主機到主機"的通信尚粘。只要確定主機和端口,我們就能實現(xiàn)程序之間的交流敲长。因此背苦,Unix系統(tǒng)就把主機+端口互捌,叫做"套接字"(socket)。有了它行剂,就可以進行網(wǎng)絡(luò)應(yīng)用程序開發(fā)了。
現(xiàn)在钳降,我們必須在數(shù)據(jù)包中加入端口信息厚宰,這就需要新的協(xié)議。最簡單的實現(xiàn)叫做UDP協(xié)議遂填,它的格式幾乎就是在數(shù)據(jù)前面铲觉,加上端口號。UDP數(shù)據(jù)包吓坚,也是由"標(biāo)頭"和"數(shù)據(jù)"兩部分組成撵幽。"標(biāo)頭"部分主要定義了發(fā)出端口和接收端口,"數(shù)據(jù)"部分就是具體的內(nèi)容礁击。然后盐杂,把整個UDP數(shù)據(jù)包放入IP數(shù)據(jù)包的"數(shù)據(jù)"部分,而前面說過哆窿,IP數(shù)據(jù)包又是放在以太網(wǎng)數(shù)據(jù)包之中的链烈,所以整個以太網(wǎng)數(shù)據(jù)包現(xiàn)在變成了下面這樣:UDP數(shù)據(jù)包非常簡單,"標(biāo)頭"部分一共只有8個字節(jié)挚躯,總長度不超過65,535字節(jié)强衡,正好放進一個IP數(shù)據(jù)包。
5.3 TCP協(xié)議
UDP協(xié)議的優(yōu)點是比較簡單码荔,容易實現(xiàn)漩勤,但是缺點是可靠性較差,一旦數(shù)據(jù)包發(fā)出缩搅,無法知道對方是否收到越败。
為了解決這個問題,提高網(wǎng)絡(luò)可靠性誉己,TCP協(xié)議就誕生了眉尸。這個協(xié)議非常復(fù)雜,但可以近似認為巨双,它就是有確認機制的UDP協(xié)議噪猾,每發(fā)出一個數(shù)據(jù)包都要求確認。如果有一個數(shù)據(jù)包遺失筑累,就收不到確認袱蜡,發(fā)出方就知道有必要重發(fā)這個數(shù)據(jù)包了。
因此慢宗,TCP協(xié)議能夠確保數(shù)據(jù)不會遺失坪蚁。它的缺點是過程復(fù)雜奔穿、實現(xiàn)困難、消耗較多的資源敏晤。
TCP數(shù)據(jù)包和UDP數(shù)據(jù)包一樣贱田,都是內(nèi)嵌在IP數(shù)據(jù)包的"數(shù)據(jù)"部分。TCP數(shù)據(jù)包沒有長度限制嘴脾,理論上可以無限長男摧,但是為了保證網(wǎng)絡(luò)的效率,通常TCP數(shù)據(jù)包的長度不會超過IP數(shù)據(jù)包的長度译打,以確保單個TCP數(shù)據(jù)包不必再分割耗拓。
上圖畫出了TCP建立連接的過程。假定主機A運行的是TCP客戶程序奏司,B運行的是TCP服務(wù)器程序乔询。最初兩端的TCP進程都處于CLOSED狀態(tài)。圖中在主機下面的是TCP進程所處的狀態(tài)韵洋。A是主動打開連接竿刁,B是被動打開連接。
B的TCP服務(wù)器進程先創(chuàng)建傳輸控制模塊TCB麻献,準備接受客戶進程的連接請求们妥,然后服務(wù)器進程就處于LISTEN(監(jiān)聽)狀態(tài),等待客戶的連接請求
首先A的TCP客戶進程向B發(fā)出連接請求報文段勉吻,這時首部中的同步位SYN=1监婶,同時選擇一個初始序號seq=x。TCP規(guī)定齿桃,SYN報文段(即SYN=1的報文段)不能攜帶數(shù)據(jù)惑惶,但要消耗掉一個序號。這時短纵,A的客戶進程就進入SYN-SENT(同步已發(fā)送)狀態(tài)带污。
B收到連接請求報文段后,向A發(fā)送確認香到。在確認報文段中把SYN和ACK位都置為1鱼冀,確認號是ack=x+1,同時也為自己選擇一個初始序號seq=y。請注意悠就,這個報文段也不能攜帶數(shù)據(jù)千绪,但同樣要消耗掉一個序號。這時B的TCP服務(wù)器進程就進入SYN-RCVD(同步已收到)狀態(tài)梗脾。
A的TCP客戶進程收到B的確認后荸型,還要向B給出確認。確認報文段的ACK置為1炸茧,確認號ack=y+1瑞妇,而自己的序號seq=x+1稿静。這時,TCP連接已經(jīng)建立辕狰,A進入ESTABLISHED(已建立連接)狀態(tài)改备,
當(dāng)B收到A的確認后,也會進入ESTABLISHED狀態(tài)柳琢。
以上給出的連接建立過程就是常說的TCP三次握手绍妨。
為什么A還要發(fā)送一次確認呢?這主要是為了防止已失效的連接請求報文段突然又傳送到了B,因而產(chǎn)生錯誤柬脸。
假定A發(fā)出的某一個連接請求報文段在傳輸?shù)倪^程中并沒有丟失,而是在某個網(wǎng)絡(luò)節(jié)點長時間滯留了毙驯,以致延誤到連接釋放以后的某個時間才到達B倒堕。本來這是一個早已失效的報文段。但B收到此失效的連接請求報文段后爆价,就誤以為A又發(fā)了一次新的連接請求垦巴,于是向A發(fā)出確認報文段,同意建立連接铭段。假如不采用三次握手骤宣,那么只要B發(fā)出確認,新的連接就建立了序愚。
由于A并未發(fā)出建立連接的請求憔披,因此不會理睬B的確認,也不會向B發(fā)送數(shù)據(jù)爸吮。但B卻以為新的運輸連接已經(jīng)建立了芬膝,并一直等待A發(fā)來數(shù)據(jù),因此白白浪費了許多資源形娇。
采用TCP三次握手的方法可以防止上述現(xiàn)象發(fā)生锰霜。例如在剛才的情況下,由于A不會向B的確認發(fā)出確認桐早,B由于收不到確認癣缅,就知道A并沒有要求建立連接。
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個連接.
第一次握手:建立連接時,客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入等待確認狀態(tài),等待服務(wù)器確認哄酝;
第二次握手:服務(wù)器接收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài)友存;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手.
14. 如何判斷你當(dāng)前手機瀏覽器的類型 userAgent (QQ , 微信 ,微博 炫七,華為)
(1)通過navigator.userAgent獲取瀏覽器的userAgent字符串
(2)然后indexOf去查找各個瀏覽器名稱/瀏覽器內(nèi)核的名稱爬立,如果返回值不為-1,則該瀏覽器名稱/內(nèi)核即為你當(dāng)前手機的手機瀏覽器/瀏覽器內(nèi)核的類型
以pc端為例:
? var userAgent = navigator.userAgent
? ? if (userAgent.indexOf("Opera")> -1) {
? ? ? ? return "Opera"
? ? };
? ? //判斷是否Firefox瀏覽器
? ? if (userAgent.indexOf("Firefox") > -1) {
? ? ? ? return "FF";
? ? }
? ? //判斷是否chorme瀏覽器
? ? if (userAgent.indexOf("Chrome") > -1){
? return "Chrome";
? ? }
? ? //判斷是否Safari瀏覽器
? ? if (userAgent.indexOf("Safari") > -1) {
? ? ? ? return "Safari";
? ? }
var browser = {
? versions: function() {
? ? var u = navigator.userAgent;
? ? return {
? ? ? ? ? ? trident: u.indexOf('Trident') > -1, //IE內(nèi)核
? ? ? ? ? ? presto: u.indexOf('Presto') > -1, //opera內(nèi)核
? ? ? ? ? ? webKit: u.indexOf('AppleWebKit') > -1, //蘋果万哪、谷歌內(nèi)核
? ? ? ? ? ? gecko: u.indexOf('Firefox') > -1, //火狐內(nèi)核Gecko
? ? ? ? ? ? mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否為移動終端
? ? ? ? ? ? ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios
? ? ? ? ? ? android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android
? ? ? ? ? ? iPhone: u.indexOf('iPhone') > -1 , //iPhone
? ? ? ? ? ? iPad: u.indexOf('iPad') > -1, //iPad
? ? ? ? ? ? webApp: u.indexOf('Safari') > -1 //Safari
? ? ? ? };
? ? }()
}
15. $.fn.extends $.extends 兩者的區(qū)別
jQuery.fn = jQuery.prototype侠驯;
jQuery為開發(fā)插件提拱了兩個方法抡秆,分別是:
jQuery.fn.extend(object):? 給jQuery實例對象添加方法,例如$("#aaa").click()這個jq實例對象所能運用的click()方法
jQuery.extend(object):? ? 為擴展jQuery類本身.為類添加新的方法(添加靜態(tài)方法)吟策,例如$.ajax()這個jq自帶方法
16. 說一下什么是變量提升 如何解決變量提升
當(dāng)我們在一個變量定義前調(diào)用這個變量會輸出一個undefind儒士,因為我們用var來聲明這個變量的時候會在調(diào)用這個變量的前面假設(shè)定義了一個沒有被賦值的變量 ,這就是變量提升,當(dāng)我們用function關(guān)鍵字來定義一個函數(shù)的時候在任何地方我們都可以調(diào)用這個函數(shù)檩坚,如果我們用變量聲明的方式來定義函數(shù)着撩,在函數(shù)定義的前面調(diào)用函數(shù)會報undefind,也是因為變量提升匾委, 用let聲明一個變量就不會存在變量提升