js面試知識點匯總

1.什么是閉包?舉例說明
從作用域鏈談閉包
閉包就是能夠讀取其他函數內部變量的函數,
閉包實現累加效果

function addcount(){
? ? ? var num = 0;
? ? ? return function(){
? ? ? ? ? ? ? return num += 1;
? ? ? ? }
}
var add = addcount();
console.log(add());
console.log(add());


3.冒泡機制實現數組排序 從小到大

var arr = [7,4,9,1,6,2];
function sortAt(num){
? ? ? ? for(var i = 0 ;i < arr.length-1; i++ ){
? ? ? ? ? ? ? ? ? ? for(var j = i+1; j < arr.length;j++){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var v = arr[i]; //前一個的值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(v > arr[j]){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? var index = arr[j]; //后一個的值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr[i] = index;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr[j] = v;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return arr;
}
console.log(sortAt(arr));


6.Js實現繼承的方法

第一種方法,借用構造函數實現繼承

function Person(){
? ? ? ? ? ? this.name = "nana"
}
function Teacher(){
? ? ? ? ?Person.call(this);
? ? ? ? ?this.type="teacher";
}

Teacher無法繼承Person的原型對象,并沒有真正的實現繼承(部分繼承);

第二種方法,借用原型鏈實現繼承

function Person(){
? ? ? ? ? this.name = "nana";
? ? ? ? ? this.play = 123;
}
function Teacher(){
? ? ? ? ?this.type="teacher";
}
Teacher.prototype = new Person();

7.DOM事件

DOM事件模型是什么:指的是冒泡和捕獲;
DOM事件流是什么:捕獲階段 => 目標階段 => 冒泡階段
DOM事件捕獲的具體流程:window=>document=>html標簽=>body=>目標對象

8.事件委托

事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,觸發(fā)執(zhí)行效果。

<ul id="list">
? ? ? ? <li>item1</li>
? ? ? ? <li>item2</li>
? ? ? ? <li>item3</li>
</ul>

var list = document.getElementById("list");
list.addEventListener('click',function(event){
? ? ? ? ?event = event || window.event;
? ? ? ? ?var target = event.target || event.srcElement;
? ? ? ? ?if(target.nodeName == "LI"){
? ? ? ? ? ? ? ? ? ?alert(target.innerHTML);
? ? ? ? ?}
})

9.事件監(jiān)聽

.onclick 常規(guī)的事件綁定只執(zhí)行最后綁定的事件
btn.addEventListenter('click',function(){}) ?//可綁定多個事件
btn.attachEvent("onclcik",function(){})


10.ajax跨域

ajax出現請求跨域錯誤問題。主要是因為瀏覽器的“同源策略”。同源策略指的是協議相同,域名相同,端口相同。
如何解決ajax跨域問題
1.jsonp。客戶端網頁通過添加了一個script元素,向服務器請求json數據,這種做法不受同源政策;
2.代理請求方式解決接口跨域問題;配置proxy

11.mouseover 和 mouseenter的區(qū)別
mouseover,當指針穿過被選元素和子元素時,都會被觸發(fā);
mouseenter ,當指針穿過被選元素時會被觸發(fā);

12.行內點擊事件改變樣式

onclick="style.backgroundColor ='red';style.Color='#333';"

13.js中判斷JSON數據是否存在某字段的方法

方法一: !('key'? in? obj)
方法二:obj.hasOwnProperty('key')?

15.作用域知識點

window.val = 1;
var json = {
? ? ? val:10,
? ? ? a:function(){
? ? ? ? ? ? ? this.val *= 2;
? ? ? ? ? ? ? return this.val;
? ? ? }
}
console.log(json.a());?
var a = json.a;? ?
console.log(a());?
json.a.call(window);?
console.log(json.a());?
console.log(window.a()) ;??
//20
//2
//40
//8

16.作用域知識點
a方法里作用域屬于window環(huán)境,所以此時,val的的值屬于window.val? =1 ;

;(function(){
? ? ? ?var val = 1;
? ? ? ?var json = {
? ? ? ? ? ? ? val:10,
? ? ? ? ? ? ? a:function(){
? ? ? ? ? ? ? ? ? ? ? ? ?val *= 2;
? ? ? ? ? ? ? ?}
? ? ? ?};
? ? ?json.a();??
? ? ?console.log(json.val + val)? ?
}())

//12


18.原型鏈繼承知識點
B繼承A.prototype原型鏈上的方法;但屬性不繼承;
構造函數如果有屬性時,會先找構造函數里的屬性值,如果沒有,繼續(xù)找prototype上是否有屬性一值;

function A(x){
? ? ? ? this.x = x;
}
A.prototype.x = 1;
function B(x){
? ? ? ? this.x =x;
}
B.prototype = new A();
var a = new A(2);
var b = new B(3);
delete b.x;
console.log(a.x);
console.log(b.x);
// 2
//undefined

22.?下面的代碼會輸出什么?為啥?

for(var i = 0; i < 5; i++) {
? ? ? ? setTimeout(
? ? ? ? ? ? ?function() { console.log(i);
? ? ? ? }, i * 1000 );
}
輸出5個5



25.神馬是 NaN,它的類型是神馬?怎么測試一個值是否等于 NaN?
NaN? ?(Not a Number 它不是一個數字) 類型是Number, isNaN()? ??
isNaN(23)? //false? isNaN('true')? ?//true

26.值類型和引用類型的區(qū)別
值類型 :將變量中的數據完整的拷貝一份,賦值給新的變量
var num = 123; var num1 = num;
console.log(num + num1)? ?//123,123
num = 1;
console.log(num + num1) //1,123
引用類型:表示變量存儲的是數據的地址,復制時只是把地址復制一份,同時指向數據
var o ={n:123}; var o1 = o;
console.log(o.n + o1.n); //123,123
o1.n = 1;
console.log(o.n + o1.n); //1,1

27.深拷貝和先拷貝

淺復制是對對象地址的復制,并沒有開辟新的棧,也就是復制的結果是兩個對象指向同一個地址,修改其中一個對象的屬性,則另一個對象的屬性也會改變。
深復制則是開辟新的棧,兩個對象對應兩個不同的地址,修改一個對象的屬性,不會改變另一個對象的屬性。
function deepCopy (data) {? ?
? ? ? ? ? ?return JSON.parse(JSON.stringify(data));
}

28.call和apply方法;
作用:.改變執(zhí)行上下文 實現繼承
第一個參數 指向的是一個對象(調用對象),只是apply的參數只有2個,第2個參數其實是一個偽數組
function superClass () {
? ? ? ? ? ? this.a = 1;
? ? ? ? ? ? this.print = function () {
? ? ? ? ? ? ? ? ? ?console.log(this.a);
? ? ? ? ? ? }
}
function subClass () {
? ? ? ? ? ? superClass.call(this);
? ? ? ? ? ? this.print();
}
subClass();

29.cmd和amd 的區(qū)別?
cmd和amd都是模塊開發(fā)的一種規(guī)范(模塊定義規(guī)范),amd加載模塊是提前加載模塊,cmd是延遲加載,就近加載
define(function(require,exports,module{
? ? ? ? ?var? ? a=require('./a')
? ? ? ? ?a.doSomething()
? ? ? ? ?var? ? b=require('./b')
? ? ? ? ?b.doSomething();
})? //cmd
define(['./a','./b'],function(a,b){
? ? ?a.doSomething()
? ? ?b.doSomething()
})? //amd

html&&css

1.alt和title的異同

alt是圖片加載失敗時,顯示在網頁上替代的字;搜索引擎對圖片的判斷,主要是靠alt屬性。以簡要文字說明,同時包含關鍵字。

title是鼠標放在圖片上,顯示的文字,是對圖片進一步的說明;

2.簡述一下src和href的區(qū)別;

href用于錨點或者文檔之間的鏈接,用于超鏈接;

src指向外部資源的位置,指向的內容將會嵌套在文檔中當前標簽所在位置;例如img,script;

3.html5新元素;

新的表單控件;date、time、email

新的特殊內容標簽;footer、header、nav、aside

對本地離線儲存有了更好的支持;

用于媒介回放的video和audio;

4.什么是css hack

針對不同的瀏覽器寫不同的css,就是css hark;

ie7 *background:blue; ie5 _background:red;

前綴加_或者*......

5.px和em的區(qū)別

px的值是固定的,是絕對單位,指定多少是多少,寫出來的大小只能和設計稿上的一樣;

em的值是相對于父級,是個相對元素,每次換算可能費點時間,考慮父元素的設置大小;

rem是相對元素,指相對于根元素也就是html;html{font-size:62.5%} ?h1{font-size:2.4rem}

6.html5離線儲存

localStorage :長期儲存數據,瀏覽器關閉后數據也不會丟失

sessionStorage :數據在瀏覽器關閉后自動刪除;

7.移動端事件延遲300毫秒的問題

為什么會有300毫秒的延遲等待時間;這與雙擊縮放的方案有關;瀏覽器捕獲第一次單擊后。會先等待一段時間,如果這段時間里,用戶進行了第二次單擊操作,則瀏覽器會進行雙擊事件處理;如果沒有,則進行單擊事件的處理。

解決方案1:meta標簽禁止縮放

解決方案2:fastclick.js

8.服務器返回狀態(tài)了解

301,302 重定向;

304 帶緩存刷新;

500 服務器錯誤;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容