前端基礎知識,你還記得那些(持續更新)

1:javascript 中 null和undefined的區別

總所周知:null == undefined  ,可是:null !== undefined
那麼這二者到底有啥區別呢?

~null
這是一個對象,可是爲空。由於是對象,因此 typeof null 返回 'object' 。
null 是 JavaScript 保留關鍵字。
null 參與數值運算時其值會自動轉換爲 0 ,所以,下列表達式計算後會獲得正確的數值:
表達式:123 + null    結果值:123
表達式:123 * null    結果值:0
~undefined
undefined是全局對象(window)的一個特殊屬性,其值是未定義的。但 typeof undefined 返回 'undefined' 。
雖然undefined是有特殊含義的,但它確實是一個屬性,並且是全局對象(window)的屬性。請看下面的代碼:
javascript

alert('undefined' in window);//輸出:true 
var obj= {}; 
alert('undefined' in obj); //輸出:false


從中能夠看出,undefined是window對象的一個屬性,但卻不是obj對象的一個屬性。
注意:儘管undefined是有特殊含義的屬性,但卻不是JavaScript的保留關鍵字。
undefined參與任何數值計算時,其結果必定是NaN。
隨便說一下,NaN是全局對象(window)的另外一個特殊屬性,Infinity也是。這些特殊屬性都不是JavaScript的保留關鍵字!java

null == 0; // false 
undefined == ""; // false 
null == false; // false 
undefined == false; // false 
null == undefined; // true


2:函數的聲明和變量的聲明的思考

觀察下面代碼想一想結果會是什麼樣的:數組

var a = 0; function a(){}; console.log(a);// 0 
function a(){};var a = 0; console.log(a); // 0
function a(){};var a; console.log(a); //function a() {};
var a; function a(){} console.log(a); //function a() {};

說明函數聲明後才聲明變量,而後再賦值變量值;同時在不賦值的狀況下函數的聲明優先級高於變量;瀏覽器

PS:這裏我可能理解有問題,請知道的,提醒下!app


3:javascript 中的數據類型

js中一共有5中基礎數據類型:Null、Undefined、String、Number、Boolean 還有一種複雜數據類型:Object 。函數


4:typeof 操做符

typeof 會返回這些值: undefined 、string、number、boolean、object (null 是一個空的對象)this


5:instanceof 檢測引用型數據類型

Array、Object、類型檢測spa

==============2016-03-07更新===========
prototype

6:檢測是不是數組的方法

  • 方法一.判斷其是否具備「數組性質」,如slice()方法。可本身給該變量定義slice方法,故有時會失效代理

  • 方法二.obj instanceof Array 在某些IE版本中不正確

  • 方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法以下

if(typeof Array.isArray==="undefined"){
  Array.isArray = function(arg){
       return Object.prototype.toString.call(arg)==="[object Array]"
  };  
}


7:將僞數組轉化爲數組

function a(){
    console.log(Array.prototype.slice.call(arguments))
};
a(1,2,3);// [1,2,3]


僞數組(類數組):沒法直接調用數組方法或指望length屬性有什麼特殊的行爲,但仍能夠對真正數組遍歷方法來遍歷它們。典型的是函數的 arguments 參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回 NodeList對象都屬於僞數組。可使用Array.prototype.slice.call(fakeArray)將數組轉化爲真正的Array 對象;


8:定義一個log方法,讓它能夠代理console.log的方法

方法一:

function log(msg) {
    console.log(msg);
}
 
log("hello world!") // hello world!

方法二:

function log(){
    console.log.apply(console, arguments);
};

補充:call和apply方法的不一樣

對於apply和call二者在做用上是相同的,便是調用一個對象的一個方法,以另外一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。

但二者在參數上有區別的。對於第一個參數意義都同樣,但對第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成爲一個數組傳入, 而call則做爲call的參數傳入(從第二個參數開始)。 如 func.call(func1,var1,var2,var3)對應的apply寫法爲:func.apply(func1, [var1,var2,var3]) 。


9:原生JS的window.onload與Jquery的$(document).ready(function(){})有什麼不一樣?如何用原生JS實現Jq的ready方法?

window.onload()方法是必須等到頁面內包括圖片的全部元素加載完畢後才能執行。

$(document).ready()是DOM結構繪製完畢後就執行,沒必要等到加載完畢。

/* 方法一
 * 傳遞函數給whenReady()
 * 當文檔解析完畢且爲操做準備就緒時,函數做爲document的方法調用
 */
var whenReady = (function() {               //這個函數返回whenReady()函數
    var funcs = [];             //當得到事件時,要運行的函數
    var ready = false;          //當觸發事件處理程序時,切換爲true
 
    //當文檔就緒時,調用事件處理程序
    function handler(e) {
        if(ready) return;       //確保事件處理程序只完整運行一次
 
        //若是發生onreadystatechange事件,但其狀態不是complete的話,那麼文檔還沒有準備好
        if(e.type === 'onreadystatechange' && document.readyState !== 'complete') {
            return;
        }
 
        //運行全部註冊函數
        //注意每次都要計算funcs.length
        //以防這些函數的調用可能會致使註冊更多的函數
        for(var i=0; i<funcs.length; i++) {
            funcs[i].call(document);
        }
        //事件處理函數完整執行,切換ready狀態, 並移除全部函數
        ready = true;
        funcs = null;
    }
    //爲接收到的任何事件註冊處理程序
    if(document.addEventListener) {
        document.addEventListener('DOMContentLoaded', handler, false);
        document.addEventListener('readystatechange', handler, false);            //IE9+
        window.addEventListener('load', handler, false);
    }else if(document.attachEvent) {
        document.attachEvent('onreadystatechange', handler);
        window.attachEvent('onload', handler);
    }
    //返回whenReady()函數
    return function whenReady(fn) {
        if(ready) { fn.call(document); }
        else { funcs.push(fn); }
    }
})();

//方法二

function ready(fn){
    if(document.addEventListener) {        //標準瀏覽器
        document.addEventListener('DOMContentLoaded', function() {
            //註銷事件, 避免反覆觸發
            document.removeEventListener('DOMContentLoaded',arguments.callee, false);
            fn();            //執行函數
        }, false);
    }else if(document.attachEvent) {        //IE
        document.attachEvent('onreadystatechange', function() {
            if(document.readyState == 'complete') {
                document.detachEvent('onreadystatechange', arguments.callee);
                fn();        //函數執行
            }
        });
    }
};
相關文章
相關標籤/搜索