**公司面試題總結 (5.12號第六家一面)javascript
技術很硬的一家公司,只是本身水平還比較水,問的是一些比較基礎的東西,可是組織好語言把一件事情的原理講清楚自我感受仍是有難度,或許就是基礎的部分掌握不太好,今天把面試過程的問題總結了下,也算是個鞏固(記性很差,能回憶起來的都在下面)css
1.js的值類型和引用類型html
(1)值類型:number,boolean、null、undefined。
(2)引用類型:對象、數組、函數。java
JavaScript中函數參數的傳遞方式既不是傳值,也不是傳引用,而是叫傳內存的引用: call-by-sharing node
1 function changeStuff(num, obj1, obj2) 2 { 3 num = num * 10; 4 obj1.item = "changed"; 5 obj2 = {item: "changed"}; 6 } 7 8 var num = 10; 9 var obj1 = {item: "unchanged"}; 10 var obj2 = {item: "unchanged"}; 11 changeStuff(num, obj1, obj2); 12 console.log(num); // 10 13 console.log(obj1.item); // changed 14 console.log(obj2.item); // unchanged
changeStuff()
中的num, obj1, obj2都是一個引用所以,咱們從內存和引用的角度再來看看changeStuff()
的定義:程序員
1 function changeStuff(num, obj1, obj2) 2 { 3 num = num * 10; // 對num賦值,修改num的指向,新內存的內容爲old_num * 10 4 obj1.item = "changed"; // 修改原始obj1內存中的內容 5 obj2 = {item: "changed"}; // 對obj2賦值,修改obj2指向,新內存的內容爲{item: "changed"} 6 }
下面還有幾個例子,仔細區分和理解下面試
1 function test1(){ 2 var a=[1]; 3 var b=a; 4 alert(a);// 1 5 b=[2]; 6 alert(a);//1 7 } 8 test1(); 9 function test2(){ 10 var a=[1]; 11 var b=a; 12 alert(a);// 1 13 b[0]=2; 14 alert(a);//2 15 } 16 test2(); 17 function test3(a){ 18 a={name:'bob'}; 19 } 20 var a={name:'john'}; 21 alert(a.name);//john 22 test3(a); 23 alert(a.name);//john 24 25 function test4(a){ 26 a.name='bob'; 27 } 28 var a={name:'john'}; 29 alert(a.name);//john 30 test4(a); 31 alert(a.name);//bob
2.json的數據格式以及如何處理編程
json就是javascript object notation ,他與xml同樣都是用來作數據的傳遞用的,json是一種文本格式,不是文檔格式,是獨立存在的而不是侷限於某一種語言,是理想的數據交換格式
json
json基於兩種結構來搭建:(1).名字/鍵值對 (2) 有序值的列表
數組
json 各類數據格式以下:(1)object (2)array (3)value 值 (4)string (5)number
注意:任何的xml均可以經過json的數據格式來表示,json的編碼格式統一是Unicode格式,編碼默認是UTF-8
3.DOM對象模型
DOM就是document object model 其中
document表明文檔對象 ,
object :對象。js中的對象又分爲三種 用戶定義對象(由程序員自行建立的對象),內建對象(內建在javascript語言裏的對象,ECMA-262 只定義了兩個內置對 象,即 Global 和 Math (它們也是本地對象,根據定義,每一個內置對象都是本地對象),本地對象就是 ECMA-262 定義的類(引用類型)。它們包括:
Object Function Array String Boolean Number Date RegExp Error EvalError RangeError ReferenceError SyntaxError TypeError URIError
宿主對象(由瀏覽器提供的對象,全部 BOM 和 DOM 對象都是宿主對象)。
4.選取DOM元素的方法
(1)經過ID選取元素:getElementById();該函數是document對象特有的函數,參數只有一個,必須放在單引號,或者雙引號裏面,返回值是有着該參數的元素節點對應的 對象。
(2)經過標籤名獲取元素:getElementsByTagName();也是隻有一個參數,參數是標籤的名字,可是它返回的是一個對象數組(Nodelist對象),即便整個文檔裏這個標籤只 有一個元素,也是返回一個數組,只是這時的數組長度爲1,。
(3)經過css類選取元素:getElementsByClassName();也是隻接受一個參數,及類名,要指定多了類名時,只要在字符串參數中,用空格分隔開來就行
如element.getElementsByClassName("class2 class1")將選取elements後代元素中同時應用了class1和class2樣式的元素(樣式名稱不區分前後順序),返回也是一個對 象數組(Nodelist對象),對應着文檔裏的一組特定元素節點。
(4)經過名字選取元素:getElementsByName();也是一個參數,name 的名稱,返回一個對象數組(Nodelist對象)。Name屬性,只在少數的HTML元素中有效,好比: 表 單,表單元素,<iframe>,<img>元素。這是由於name屬性是爲了方便提交表單數據而打造。 而且,getElementsByName()方法,不在Document類中,只是針對 HTML文檔可用,在XML中卻不能用。
(5)、經過CSS選擇器選取元素:document.querySelectorAll("selector") 其中,selector爲合法的CSS選擇器,好比: 經過過#id,.class,p[tittle=」aaa」] , var test=document.querySelectorAll("#test");經過這樣得到對象那個後,再繼續操做。等等。返回值也是一個對象數組(Nodelist 對象)。
這些原生的元素選取的方法比jQuery要快不少。
擴展:獲取和設置屬性。(1)getAttribute();只有一個參數,打算得到的屬性的名字;
(2)setAttribute();容許對屬性節點值作出修改。使用方法:object.setAttribute(attribute,value);
5.js中的經常使用事件
onabort onblur onchange onclick ondblclick onerror onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseout onmouseover onmouseup onreset onresize onselect onsubmit onunload
6.js調用函數的方法
1 var myobject={ 2 value:0, 3 inc:function(){ 4 alert(this.value) 5 } 6 } 7 myobject.inc()
1 var add=function(a,b){ 2 alert(this)//this被綁頂到window 3 return a+b; 4 } 5 var sum=add(3,4); 6 alert(sum)
1 var quo=function(string){ 2 this.status=string; 3 } 4 quo.prototype.get_status=function(){ 5 return this.status; 6 } 7 var qq=new quo("aaa"); 8 alert(qq.get_status());
7.js綁定事件的方法
<input onclick="alert('hello neo')" type="button" value="hello neo"
1 document.getElementById("demo").onclick=function(){ 2 alert(this.getAttribute("type")); // this 指當前發生事件的HTML元素,這裏是<div>標籤 3 }
其中前者的使用方法 elementObject.addEventListener(eventName,handle,useCapture)
eventName | 事件名稱。注意,這裏的事件名稱沒有「 on 」,如鼠標單擊事件 click ,鼠標雙擊事件 doubleclick ,鼠標移入事件 mouseover,鼠標移出事件 mouseout 等。 |
handle | 事件句柄函數,即用來處理事件的函數。 |
useCapture | Boolean類型,是否使用捕獲,通常用false 。這裏涉及到JavaScript事件流的概念,後續章節將會詳細講解。 |
後者的使用方法elementObject.attachEvent(eventName,handle); 這裏注意eventname有on
addEventListener()是標準的綁定事件監聽函數的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持該函數; 可是,IE8.0及其如下版本不支持該方法,它使用attachEvent()來綁定事件監聽函數。因此,這種綁定事件的方法必需要處理瀏覽器兼容問題。
8.事件冒泡和事件捕獲
(1)冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標(document對象)的順序觸發。
IE 5.5: div -> body -> document
IE 6.0: div -> body -> html -> document
Mozilla 1.0: div -> body -> html -> document -> window
(2)捕獲型事件(event capturing):事件從最不精確的對象(document 對象)開始觸發,而後到最精確(也能夠在窗口級別捕獲事件,不過必須由開發人員特別指定)。
(3)DOM事件流:同時支持兩種事件模型:捕獲型事件和冒泡型事件,可是,捕獲型事件先發生。兩種事件流會觸及DOM中的全部對象,從document對象開始,也在document對象結束。
DOM事件模型最獨特的性質是,文本節點也觸發事件(在IE中不會)。
支持W3C標準的瀏覽器在添加事件時用addEventListener(event,fn,useCapture)方法,基中第3個參數 useCapture是一個Boolean值,用來設置事件是在事件捕獲時執行,仍是事件冒泡時執行。而不兼容W3C的瀏覽器(IE)用 attachEvent()方法,此方法沒有相關設置,不過IE的事件模型默認是在事件冒泡時執行的,也就是在useCapture等於false的時候 執行,因此把在處理事件時把useCapture設置爲false是比較安全,也實現兼容瀏覽器的效果。
傳統綁定事件方式
在一個支持W3C DOM的瀏覽器中,像這樣通常的綁定事件方式,是採用的事件冒泡方式。
ele.onclick = doSomething2
IE瀏覽器
如上面所說,IE只支持事件冒泡,不支持事件捕獲,它也不支持addEventListener函數,不會用第三個參數來表示是冒泡仍是捕獲,它提供了另外一個函數attachEvent。
ele.attachEvent("onclick", doSomething2);
事件的傳播是能夠阻止的:
• 在W3c中,使用stopPropagation()方法
• 在IE下設置cancelBubble = true;
在捕獲的過程當中stopPropagation()後,後面的冒泡過程也不會發生了~
stopPropagation() 能阻止父元素的click事件函數執行,但不能阻止當前元素同時綁定的其它事件函數執行 。
3.阻止事件的默認行爲,例如click <a>後的跳轉~
• 在W3c中,使用preventDefault()方法;
• 在IE下設置window.event.returnValue = false;
不是全部的事件都能冒泡,例如:blur、focus、load、unload
9.事件委託的機制
所謂事件的委託,就是經過父元素給子元素綁定事件,其實現的原理一是基於事件發生機制中的冒泡過程,二是監聽事件源,w3c下是e.target , IE下是window.event.srcElement 下面是原生的js實現一個事件委託的過程
1 oUl.onmouseover = function(ev){ 2 var ev = ev || window.event;//獲取event對象 3 var target = ev.target || ev.srcElement;//監聽事件源 4 if(target.nodeName.toLowerCase() == "li"){//當事件源於要添加事件的對象一致時 5 //執行事件 6 target.style.background = "red"; 7 } 8 }
經過事件委託來綁定事件有兩方面的好處 : 1. 提高性能 2.動態綁定,新添加的元素也有事件,而不用從新執行綁定過程
10.控制檯的使用(挖坑,慢慢填)
11.瀏覽器對象模型 BOM
JavaScript中的任何一個全局函數或變量都是window的屬性
window子對象
window對象關係屬性
window對象定位屬性
window.open方法語法
window.open(url, name, features, replace);
open方法參數說明
open函數features參數說明,若是不使用第三個參數,將打開一個新的普通窗口
參數名稱 | 類型 | 說明 |
---|---|---|
height | Number | 設置窗體的高度,不能小於100 |
left | Number | 說明建立窗體的左座標,不能爲負值 |
location | Boolean | 窗體是否顯示地址欄,默認值爲no |
resizable | Boolean | 窗體是否容許經過拖動邊線調整大小,默認值爲no |
scrollbars | Boolean | 窗體中內部超出窗口可視範圍時是否容許拖動,默認值爲no |
toolbar | Boolean | 窗體是否顯示工具欄,默認值爲no |
top | Number | 說明建立窗體的上座標,不能爲負值 |
status | Boolean | 窗體是否顯示狀態欄,默認值爲no |
width | Number | 建立窗體的寬度,不能小於100 |
特性字符串中的每一個特性使用逗號分隔,每一個特性之間不容許有空格
open方法返回值爲一個新窗體的window對象的引用
setTimeout與setInterval方法有兩個參數,第一個參數能夠爲字符串形式的代碼,也能夠是函數引用,第二個參數爲間隔毫秒數,它們的返回是一個可用於對應clear方法的數字ID
var tid = setTimeout("alert('1')",1000); alert(tid); clearTimeout(tid);
History 對象的屬性:length 返回瀏覽器歷史列表中的 URL 數量
History 對象的方法
Location 對象的屬性
Location 對象的方法
Navigator 對象的屬性
只有自身和使用window.open方法打開的窗口和才能被JavaScript訪問,window.open方法打開的窗口經過window.opener屬性來訪問父窗口。 而在opener窗口中,能夠經過window.open方法的返回值來訪問打開的窗口!
window.frames集合:在框架集或包含iframe標籤的頁面中,frames集合包含了對有框架中窗口的引用
alert(frames.length);//框架的數目 alert(frames[0].document.body.innerHTML);//使用下標直接獲取對框架中窗口的引用 //不但可使用下標,還可使用frame標籤的name屬性 alert(frames["frame1"].document.title);
在框架集中還可使用ID來獲取子窗口的引用
var frame1 =document.getElementById("frame1");//這樣只是獲取了標籤 var frame1Win = frame1.contentWindow;//frame對象的contentWindow包含了窗口的引用 //還能夠直接獲取框架中document的引用 var frameDoc = frame1.contentDocument; alert(frameDoc);//但IE不支持contentDocument屬性
市場上的瀏覽器種類多的不可勝數,它們的解釋引擎各不相同,期待全部瀏覽器都一致的支持JavaScript,CSS,DOM,那要等到不知什麼時 候,然而開發者不能幹等着那天。歷史上已經有很多方法來解決瀏覽器兼容問題了,主要分爲兩種:1.userAgent字符串檢測,2.對象檢測;固然,也 不能考慮全部的瀏覽器,咱們須要按照客戶需求來,若是能夠確信瀏覽網站的用戶都使用或大部分使用IE瀏覽器,那麼你大可放心的使用IE專有的那些豐富的擴 展,固然,一旦用戶開始轉向另外一個瀏覽,那麼痛苦的日子便開始了。下面是市場上的主流瀏覽器列表:
注意,瀏覽器老是不斷更新,咱們不但要爲多種瀏覽器做兼容處理,還要對同一瀏覽器多個版本做兼容處理。好比IE瀏覽器,其6.0版本和7.0版本都 很流行,由於微軟IE隨着操做系統綁定安裝(以前也是同步發行,微軟平均每兩年推出一款我的桌面,一樣IE也每兩年更新一次;直到如今,因爲火狐的流 行,IE工做組才加快IE的更新),因此更新的較慢,6.0版和7.0版有很大差異。
市場上還存在一些其它瀏覽器,但因爲它們都是使用的上面所列瀏覽器的核心,或與上面瀏覽器使用了相同的解釋引擎,因此無需多做考慮。下面是主流的瀏覽器解釋引擎列表:
Trident (又稱爲MSHTML),是微軟的窗口操做系統(Windows)搭載的網頁瀏覽器—Internet Explorer的排版引擎的名稱,它的第一個版本隨着1997年10月Internet Explorer第四版釋出,以後不斷的加入新的技術並隨着新版本的Internet Explorer釋出。在將來最新的Internet Explorer第七版中,微軟將對Trident排版引擎作了的重大的變更,除了加入新的技術以外,並增長對網頁標準的支持。儘管這些變更已經在至關大 的程度上落後了其它的排版引擎。使用該引擎的主要瀏覽器:IE,TheWorld,MiniIE,Maxthon,騰訊TT瀏覽器。事實上,這些瀏覽器是 直接使用了IE核心,由於其userAgent字符串中返回的信息與IE是如出一轍的!
壁虎,英文爲"Gecko"。Gecko是由Mozilla基金會開發的佈局引擎的名字。它本來叫做NGLayout。Gecko的做用是讀取諸如 HTML、CSS、XUL和JavaScript等的網頁內容,並呈現到用戶屏幕或打印出來。Gecko已經被許多應用程序所使用,包括若干瀏覽器,例如 Firefox、Mozilla Suite、Camino,Seamonkey等等
Presto是一個由Opera Software開發的瀏覽器排版引擎,供Opera 7.0及以上使用。Presto取代了舊版Opera 4至6版本使用的Elektra排版引擎,包括加入動態功能,例如網頁或其部分可隨着DOM及Script語法的事件而從新排版。Presto在推出後不 斷有更新版本推出,使很多錯誤得以修正,以及閱讀Javascript效能得以最佳化,併成爲速度最快的引擎。
是HTML網頁排版引擎之一,由KDE所開發。KDE系統自KDE2版起,在檔案及網頁瀏覽器使用了KHTML引擎。該引擎以C++編程語言所寫, 並以LGPL受權,支援大多數網頁瀏覽標準。因爲微軟的Internet Explorer的佔有率至關高,很多以FrontPage製做的網頁均包含只有IE才能讀取的非標準語法,爲了使KHTML引擎可呈現的網頁達到最多, 部分IE專屬的語法也一併支援。目前使用KHTML的瀏覽器有Safari和Google Chrome。而KHTML也產生了許多衍生品,如:WebKit,WebCore引擎
12.overflow hidden爲何可以清除浮動
首先這涉及到BFC機制,