總所周知: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
觀察下面代碼想一想結果會是什麼樣的:數組
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
js中一共有5中基礎數據類型:Null、Undefined、String、Number、Boolean 還有一種複雜數據類型:Object 。函數
typeof 會返回這些值: undefined 、string、number、boolean、object (null 是一個空的對象)this
Array、Object、類型檢測spa
==============2016-03-07更新===========
prototype
方法一.判斷其是否具備「數組性質」,如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]" }; }
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 對象;
方法一:
function log(msg) { console.log(msg); } log("hello world!") // hello world!
方法二:
function log(){ console.log.apply(console, arguments); };
對於apply和call二者在做用上是相同的,便是調用一個對象的一個方法,以另外一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。
但二者在參數上有區別的。對於第一個參數意義都同樣,但對第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成爲一個數組傳入, 而call則做爲call的參數傳入(從第二個參數開始)。 如 func.call(func1,var1,var2,var3)對應的apply寫法爲:func.apply(func1, [var1,var2,var3]) 。
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(); //函數執行 } }); } };