每天收獲一點,慢慢地就多了。
今天開始正式學習javascript,雖然以前都有一些涉及,但是沒有好好的系統的學上一編,趁這段寒假,多學一點總是好的,堅持就是勝利,廢話不多說了。
1. 數據類型:
簡單(基本)數據類型:Boolean, Number,String,Undefined,Null。
復雜數據類型:Array,Object等。
2.區分undefined 和 null
Null:
(1) null 意味着沒有值,即缺少數據。
(2)包含 null 的變量包含“無值”或“無對象”。換句話說,該變量沒有保存有效的數、字符串、boolean、數組或對象。可以通過給一個變量賦 null 值來清除變量 的內容。
(3) Null類型只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正是使用typeof操作符檢測null時會返回"object"的原因(null是一種特殊的object)
Undefined:
(1) undefined常量用於尚未初始化的變量或未初始化的動態對象屬性的特殊值(未定義的值和定義未賦值的為undefined)
(2) Undefined類型只有一個值,即特殊的undefined(注意大小寫,用的時候也不用加引號,人家不是string)。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined
實際上,undefined值是派生自null值的,因此ECMA-262規定對它們的相等性測試要返回true,但是使用全等運算符(===)對null和undefined進行比較時,比較結果為不相等。
3. 區分等於(==)和全等於(===)
重點:等於(==)的情況下只要值相同就返回True;
而全等(===)的時候需要值和類型都要匹配才能返回True.具體看堆棧的區別及邏輯等和邏輯全等
4.變量的聲明:
4.1 變量的聲明必須使用var。
a=10;
這僅僅是給全局對象創建了一個新屬性(但它不是變量)。“不是變量”並不是說它不能被改變,而是指它不符合ECMAScript規范中的變量概念,所以它“不是變量”,這個也是我的盲區,我是參考了湯姆大叔的博客才知道的。詳細分析參考深入理解JavaScript系列(12):變量對象(Variable Object)
4.2 變量聲明提升
這個比較好理解,執行器會將所有的變量聲明移到語句的頂部,如果是在函數的內部聲明局部變量,那么就會將變量聲明提升到函數體內的最頂部。這個只是針對聲明語句。
4.3 變量的傳值和傳址
傳值:
var i = 10; var j = i; //輸出 10 alert(i); i = 30; alert(j); //輸出10 function sqrt(x){ return x*x; } var inValue = 3; var outResult = sqrt(inValue); alert(outResult); //輸出 9 alert(inValue); //輸出 3
傳址:
var myArray = ["tom", "dick"]; var newArray = myArray; alert(newArray[1]); //輸出dick myArray[1] = "jack"; alert(newArray[1]); //輸出jack
4.4 內存使用規則-堆和棧
堆:為復雜數據類型分配空間,例如數組,Object對象,運行時動態的分配內存,速度慢。
棧:基本類型的變量和對象的引用,速度快,可以共享(這邊數據共享還有些不理解。)’
總而言之,javascript堆不需要程序代碼顯式地釋放,會有自動的垃圾回收機制。但是為了提高程序性能,還是可以自己釋放的,最常用的方法就是對其賦值為null。
注意點:
var str = new String("abc"); //對象存放在堆中 var str = "abc"; //棧中存放值“abc”和對值的引用 //推薦使用第二種創建方法
堆棧的區別及邏輯等和邏輯全等
//只是比較棧中的值,不管邏輯等於還是邏輯全等於運算都返回true,可以看出str1.str2指向同一個值、 var str1 = "abc"; var str2 = "abc"; alert(str1 == str2); //true alert(str1 ===str2); //true //實際比較的是堆中的內容,不管是邏輯等於還是邏輯全等於運算都返回false、可以看出str1,str2指向的不是同一個對象。 var str1 = new String("abc"); var str2 = new String("abc"); alert(str1 == str2); //false alert(str1 === str2); //false //比較堆中和棧中的值,進行邏輯等於運算的時候,會首先將變量轉成相同的數據類型,然后進行對比,所以返回true,但是邏輯全等於會對數據類型進行比較,看是否引用了同一個數據,返回false var str1 = new String("abc"); var str2 = "abc"; alert(str1 == str2); //true alert(str1 === str2); //false
今天先寫這么多吧,其實還有好多地方需要學習的,比方typeof,數據類型轉換,array,object。
有關變量的知識很多都是參考了網上一些別人寫得博客,以下附上鏈接:
深入理解JavaScript系列(12):變量對象(Variable Object)
Javascript 中 null、NaN和undefined的區別
JavaScript之數據類型
javascript定義對象
javascript動態添加、修改、刪除對象的屬性和方法
以上全部都屬個人原創,請大家轉載的時候附上原創鏈接: http://www.cnblogs.com/tonylp