1.call和apply方法的用途和區別?
用途:都改變this指向;
區別:call傳遞的是連續參數,apply傳遞的是數組參數
2.利用純css構造一個三角形
<style> .dom{ width: 0px; height: 0px; border-width: 40px; border-style: solid; border-color: red transparent transparent transparent; /*或者border-color: transparent transparent red;*/ } </style> <div class="dom"></div>
3.JavaScript中typeof可能返回的結果?如何檢測?
string number object function undefined boolean
方法:Object.prototype.toSring.call()
調用object構造函數上的原型的toSring方法,改變它的this指向
4.
push():可向數組的末尾添加一個或多個元素,並返回新的長度
pop():用於刪除並返回數組的最后一個元素。
shift():用於把數組的第一個元素從其中刪除,並返回第一個元素的值
unshift():可向數組的開頭添加一個或更多元素,並返回新的長度。
5.什么是默認事件,什么是冒泡事件?如何禁止?
冒泡事件:即事件從最底層逐個經過上面一級級事件的過程,就是冒泡事件。在非IE瀏覽器中提供了一個事件對象stopPropagation,那么在IE瀏覽器中可以通過cancelBubble事件對象阻止。
默認事件:瀏覽器的默認事件就是瀏覽自己的行為,比如我們在點擊<a href="#">的時候,瀏覽器跳轉到指定頁面,或者是當我們滾動鼠標時頁面會向下滾動,但我們按空格鍵和按方向鍵時也會向下滾動,為了更好的用戶體驗,這時我們就需要阻止這種行為的發生。
阻止事件冒泡:
function stopBubble(e) { if(e && e.stopPropagation) {
e.stopPropagation(); }else { window.event.cancelBubble = true; } }
阻止默認事件:
function stopDefault(e) {
if(e && e.preventDefault) {
e.preventDefault();
}else {
window.event.returnValue = false;
}
return false;
}
6.異步加載的三種方案
第一種:defer
<script type="text/javascript" src="demo.js" defer="defer"></script>
第二種:async
<script type="text/javascript" src="demo.js" async="async"></script>
第三種:創建script,插入到DOM中,加載完畢后callBack
function loadScript(url, callback){ var script = document.createElement("script"); script.type = "text/javascript"; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" ||script.readyState == "complete"){ script.onreadystatechange = null; callback(); } }; } else { //Others: Firefox, Safari, Chrome, and Opera script.onload = function(){ callback(); }; } script.src = url; document.body.appendChild(script); }
7.你了解JS對象嗎?可以簡單說說自定義構造函數創建對象的原理嗎?
var this = {} return this //隱式返回this
var this = Object.create(Person.prototype)return this;//顯式返回
8.有字符串“aaabbbcccdddeeefgggaa”,轉換成連續不重復的字符串,eg:abcdefga
var reg = /(.)\1*/g;
var str = 'aaabbbcccdddeeefgggaa';
str.replace(reg,str);
9.很多瀏覽器的body都有默認的margin,這個值是多少呢?
8px;
10.如今有一個Ul,里面有十億個Li,要求點擊li觸發事件,彈出對應的li的內容
var ul = document.getElementsByTagName('ul')[0];
ul.onclick=function(e) {
var event = e || window.event;
var tar = event.target || event.srcElement;
if(tar.tagName.toLowerCase()==="li")
alert(tar.innerText);
}
考點:事件委托:“事件代理”即是把原本需要綁定的事件委托給父元素,讓父元素擔當事件監聽的職務
11.描述時間線的順序
①、創建Document對象,開始解析web界面。document.readyState='loading'。
②、遇到link外部css,創建線程加載,並繼續原線程的解析。
③、遇到外部js文件,並沒設有async/defer的屬性,瀏覽器正常加載js(阻塞),等js加載完成再執行下面的內容。
④、遇到外部js文件,但是設有async/defer的屬性,瀏覽器創建新的線程進行加載,原線程繼續自己的行為。(async是當加載js完畢直接就執行,defer是頁面解析完畢后再執行,異步加載不允許用document.write());
⑤、遇到Img,先正常解析出dom結構,異步加載src,並繼續進行解析。
⑥、當文檔解析完畢(document.readyState="interative")。
⑦、解析完畢之后,所有設置defer的腳本會按照順序執行。
⑧、document對象觸發DOMContentLoaded事件,標志程序執行從同步腳本執行階段轉換為事件驅動。
⑨、當async的腳本加載並執行后,Img加載完成后,document.readyState="compete"。
⑩、以異步響應處理網絡,用戶操作實行交互。