javascript--面試題

(1)javaScript怎麼清空數組?

javascript

var arrayList = ['a','b','c','d','e','f'];

怎麼清空 arrayListhtml

方法1:直接改變arrayList所指向的對象,原對象並不改變。

arrayList = [];

方法2:這種方法經過設置length=0 使原數組清除元素。

arrayList.length = 0;

方法3

arrayList.splice(0, arrayList.length);

(2)怎麼判斷一個object是不是數組(array)?

方法1:使用 Object.prototype.toString 來判斷是不是數組,這裏使用call來使 toString 中 this 指向 obj。進而完成判斷

function isArray(obj){
    return Object.prototype.toString.call( obj ) === '[object Array]';
}

方法二:使用 原型鏈 來完成判斷,基本思想是利用 實例若是是某個構造函數構造出來的那麼 它的 __proto__是指向構造函數的 prototype屬性。

function isArray(obj){
    return obj.__proto__ === Array.prototype;
}

方法3:利用JQuery

function isArray(obj){
    return $.isArray(obj)
}

(2)數組去重

function uniq(array){
    var temp = []; //一個新的臨時數組
    for(var i = 0; i < array.length; i++){
        if(temp.indexOf(array[i]) == -1){
            temp.push(array[i]);
        }
    }
    return temp;
}

var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(aa)
console.log(uniq(aa))

三、JavaScript如何實現繼承?

  • 構造繼承
  • 原型繼承
  • 實例繼承
  • 拷貝繼承
  • 原型prototype機制或apply和call方法去實現較簡單,建議使用構造函數與原型混合方式
function Parent(){
      this.name = 'wang';
  }

  function Child(){
      this.age = 28;
  }
  Child.prototype = new Parent();//繼承了Parent,經過原型
  var demo = new Child();
  alert(demo.age);
  alert(demo.name);//獲得被繼承的屬性

五、例舉3種強制類型轉換和2種隱式類型轉換?

  • 強制(parseInt,parseFloat,number)隱式(== ===)

六、split()join()的區別

  • 前者是切割成數組的形式,後者是將數組轉換成字符串

七、數組方法pop()push()unshift()shift()

  • pop()尾部刪除 push()尾部添加
  • shift()頭部刪除 unshift()頭部添加

十一、ajax請求時,如何解釋json數據

  • 使用eval parse,鑑於安全性考慮,使用parse更靠譜

十二、事件委託是什麼

  • 讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!

12(1)請說說事件委託機制?這樣作有什麼好處?

  • 事件委託,就是某個事件原本該本身乾的,可是本身不幹,交給別人來幹,就叫事件委託。打個比方:一個button對象,原本本身須要監控自身的點擊事件,可是本身不來監控這個點擊事件,讓本身的父節點來監控本身的點擊事件。前端

    好處

  • A,提升性能:例如,當有不少li同時須要註冊時間的時候,若是使用傳統方法來註冊事件的話,須要給每個li註冊事件。然而若是使用委託事件的話,就只須要將事件委託給該一個元素便可。這樣就能提升性能
  • B,新添加的元素還會有以前的事件java

1三、閉包是什麼,有什麼特性,對頁面有什麼影響?簡要介紹你理解的閉包

  閉包就是可以讀取其餘函數內部變量的函數ajax

  通俗的講:就是函數a的內部函數b,被函數a外部的一個變量引用的時候,就建立了一個閉包。正則表達式

  優勢:

  • ① 減小全局變量。
  • ② 減小傳遞函數的參數量
  • ③ 封裝;

  缺點:

  • 使用閉包會佔有內存資源,過多的使用閉包會致使內存溢出等.

  

1四、添加 插入 替換 移除 到某個接點的方法

  • obj.appendChild()
  • obj.insertBefore()
  • obj.replaceChild()
  • obj.removeChild() 

14(1)、DOM怎樣添加、移動、複製、建立和查找節點

  

// 建立新節點
createDocumentFragment()    //建立一個DOM片斷
createElement()   //建立一個具體的元素
createTextNode()   //建立一個文本節點
// 添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節點前插入一個新的子節點
// 查找
getElementsByTagName()    //經過標籤名稱
getElementsByName()    //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的)
getElementById()    //經過元素Id,惟一性

1五、"=="和"==="的不一樣

  • 前者會自動轉換類型,後者不會

  ==判斷內容是否相等不比較類型編程

  console.log(1=="1");//true

  ===判斷內容相等且類型也相等json

  console.log(1==="1"); //false

1六、編寫一個b繼承a的方法、

function A(name){
    this.name = name;
    this.sayHello = function(){alert(this.name+」 say Hello!」);};

}
function B(name,id){
    this.temp = A;
    this.temp(name);        //至關於new A();
    delete this.temp;       
     this.id = id;   
    this.checkId = function(ID){alert(this.id==ID)};
}

1七、如何阻止事件冒泡和默認事件

function stopBubble(e)
{
    if (e && e.stopPropagation)
        e.stopPropagation()
    else
        window.event.cancelBubble=true
}
return false

17(1)什麼是事件冒泡/捕獲

事件冒泡:子元素事件的觸發會影響父元素事件

  • 開關事件冒泡:
  • A,開啓事件冒泡:element.addEventListener(eventName,handler,false);
  • B,關閉事件冒泡:假設傳統方式事件的返回值爲e,就能夠經過e.stopPropagation()來關閉事件冒泡;

事件捕獲:父元素的事件會影響子元素的事件;

  • 開啓事件捕獲:element.addEventListener(eventName,hadler,true)

1九、談談this對象的理解

  • this是js的一個關鍵字,隨着函數使用場合不一樣,this的值會發生變化。
  • 可是有一個總原則,那就是this指的是調用函數的那個對象。
  • this通常狀況下:是全局對象Global。做爲方法調用,那麼this就是指這個對象

this對象的理解

  • this是一個關鍵字,它表明函數運行時,自動生成一個內部對象,只能在函數內部使用
  • 1.做爲純粹的函數調用this指向全局對象
  • 2.做爲對象的方法調用this指向調用對象
  • 3.做爲構造函數被調用this指向新的對象(new會改變this的指向)
  • 4.apply調用this指向apply方法的第一個參數
  • this老是指向函數的直接調用者(而並不是間接調用者);
  • 若是有new關鍵字,this指向new出來的那個對象;
  • 在事件中,this指向這個事件的對象,特殊的是,IE中的attachEvent中的this老是指向全局對象Window;

2四、對於前端自動化構建工具備瞭解嗎?簡單介紹一下

  • Gulp,Grunt等

2五、說一下什麼是JavaScript的同源策略?

  • 一段腳本只能讀取來自同一來源的窗口和文檔的屬性,這裏的同一源指的是主機名,協議和端口號的組合

2六、eval是指作什麼的?

  • 它的功能是把對應的字符串解析成JS代碼並運行;
  • 應該避免使用eval,不安全,很是耗性能(2次、一次解析成js語句,一次執行);
  • 由JSON字符串轉換爲JSON對象的時候能夠用eval,val obj=eval('('+str+')')

27.請列舉字符串操做的方法?

  • chartCodeAt方法返回一個整數,表明指定位置字符的Unicode編碼;
  • chartAt方法返回指定索引位置處的字符。若是超出有效範圍的索引值返回空字符串;
  • slice方法返回字符串的片斷
  • substring方法返回位於String對象中指定位置的子字符串。
  • substr方法返回一個從指定位置開始的指定長度的子字符串。
  • indexOf方法返回String對象內第一次出現子字符串位置。若是沒有找到子字符串。則返回-1;
  • lastIndexOf方法返回String對象中字符串最後出現的位置。若是沒有匹配到子字符串,則返回-1;
  • search方法返回與正則表達式查找內容匹配的第一個字符串的位置;
  • concat方法返回字符串值,該值包含了兩個或多個提供的字符串的鏈接;
  • split將一個字符串分割爲子字符串,而後將結果做爲字符串數組返回;

2八、null和undefined的區別?

null是表示"無"的對象,轉爲數值時爲0;undefined是表示"無"的原始值,轉爲數值時爲NaN。

Q1

  • 一、變量被聲明瞭,但沒有賦值,就等於undefined。
  • 調用函數時
  • 2,應該提供的參數沒有提供該參數等於undefined。
  • 三、對象沒有賦值的屬性,該屬性的值爲undefined.
  • 四、函數沒有返回值時,默認返回undefined。數組

    Q2

  • 一、做爲函數的參數,表示該函數的參數不是對象
  • 二、做爲對象原型鏈的終點。安全

2九、new操做符具體幹了什麼呢?

  • 一、建立一個空對象,而且this變量引用該對象,同時還繼承了該函數的原型。
  • 二、屬性和方法被加入到this所引用的對象中。
  • 三、新建立的對象由this所引用,而且最後隱式的返回this。

30(1)JSON的瞭解?

json(JavaScript Object Notation)是一種輕量級的數據交換格式。它是基於JavaScript的一個子集。數據格式簡單,易於讀寫,佔用帶寬小

 如:{"age":"12",""}

json字符串轉換爲json對象

  var obj=eval('('+str+')');
  var obj=str.parseJSON();
  var obj=JSON.parse(str);

JSON對象轉換爲JSON字符串

  var last=obj.toJSONString();
  var last=JSON.stringify(obj);

3一、call()和play()的區別和做用?

  • 一、apply()函數有兩個參數:第一個參數是上下文,第二個參數是參數組成的數組。若是上下文是null,則使用全局對象代替。
  • 如:function.apply(thi是,[1,2,3]);
  • 二、call()的第一個參數是上下文,後續是實例傳入的參數序列。
  • 如:function.call(this,1,2,3);

3二、JS數組去重

如下是展現三種方法

Array.prototype.unique1 = function () {
  var n = []; //一個新的臨時數組
  for (var i = 0; i < this.length; i++) //遍歷當前數組
  {
    //若是當前數組的第i已經保存進了臨時數組,那麼跳過,
    //不然把當前項push到臨時數組裏面
    if (n.indexOf(this[i]) == -1) n.push(this[i]);
  }
  return n;
}

Array.prototype.unique2 = function()
{
    var n = {},r=[]; //n爲hash表,r爲臨時數組
    for(var i = 0; i < this.length; i++) //遍歷當前數組
    {
        if (!n[this[i]]) //若是hash表中沒有當前項
        {
            n[this[i]] = true; //存入hash表
            r.push(this[i]); //把當前數組的當前項push到臨時數組裏面
        }
    }
    return r;
}

Array.prototype.unique3 = function()
{
    var n = [this[0]]; //結果數組
    for(var i = 1; i < this.length; i++) //從第二項開始遍歷
    {
        //若是當前數組的第i項在當前數組中第一次出現的位置不是i,
        //那麼表示第i項是重複的,忽略掉。不然存入結果數組
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

3六、ajax過程

  • 一、建立XMLHttpRequest對象,也就是建立一個異步調用對象。
  • 二、建立一個新的HTTP請求,並指想向該HTTP請求的方法、URL及驗證信息。
  • 三、設置響應HTTP請求狀態變化的函數。
  • 四、發送HTTP請求。
  • 五、獲取異步調用返回的數據。
  • 六、使用JavaScript和DOM實現局部刷新。

js延遲加載的方式有哪些?

  • defer和async,動態建立DOM方式(用得最多),按需異步載入js

面向對象和類的區別?

  • 簡單的說類是對象的模板。
  • 在js中沒有類,因此在js中所謂的類就是構造函數,對象就是有構造函數建立出來的實例對象。面向對象就是使用面向對象的方式處理問題,面向對象是向過程進行封裝。
  • 對象的概念,面向對象編程的程序實際就是多個對象的集合,咱們能夠把全部的事物都抽象成對象,在程序設計中能夠看做:對象=屬性+方法。屬性就是對象的數據,而方法就是對象的行爲
  • 類的概念,類是對象的模板,而對象是類的實例化。舉個例子,汽車設計圖能夠看做是類,而具體的汽車就是對象。再好比有一個類是表示人,而後能夠經過人這個模板來實例化出張三,李四...

面向對象有三大特性

  • 抽象性,須要經過核心數據和特定環境才能描述對象的具體意義
  • 封裝性,封裝就是講數據和功能組合到一塊兒,在js中對象就是鍵值對的集合,對象將屬性和方法封裝起來,方法將過程封裝起來
  • 繼承性,將別人的屬性的方法成爲本身的,傳統繼承基於模板(類),js中繼承基於構造函數
相關文章
相關標籤/搜索