每一個JavaScript環境有一個全局對象,瀏覽器中就是window對象,Node環境中是global對象,在函數外面,this指向window對象,無論是經過var 聲明或者直接建立的變量,都是這個全局對象的屬性。在函數內部經過var聲明的變量只會成爲一個函數內部局部變量,直接建立的對象仍是會成爲全局對象的屬性。瀏覽器
this指向調用改函數的對象 var myglobal = "hello"; // 不推薦寫法 console.log(this); // window console.log(myglobal); // "hello" console.log(window.myglobal); // "hello" console.log(window["myglobal"]); // "hello" console.log(this.myglobal); // "hello" (function (){ var mylocal= 'world'; myglobal1 = "!!"; console.log(this); //window console.log(mylocal); //"world" console.log(window.mylocal); //undefined console.log(this.indow.mylocal); //undefined console.log(window.myglobal1); //"!!" console.log(myglobal1); //"!!" }());
須要注意的地方:
建立隱式全局變量 var a = b = 0; 賦值運算從右到左,在此狀況下比如var a = (b = 0),b是未聲明的。函數
var的反作用
經過var 聲明的變量不能delete。
JavaScript中,你能夠在函數的任何位置聲明多個var語句,而且它們就好像是在函數頂部聲明同樣(變量提高)發揮做用。須要注意的是ES6中經過let和const聲明的變量是不存在變量提高狀況的。測試
// 例子 myname = "global"; // 全局變量 function func() { alert(myname); // "undefined" var myname = "local"; alert(myname); // "local" } func(); myname = "global"; // global variable function func() { var myname; // 等同於 -> var myname = undefined; alert(myname); // "undefined" myname = "local"; alert(myname); // "local"} func();
代碼處理分兩個階段,第一階段是變量,函數聲明,以及正常格式的參數建立,這是一個解析和進入上下文的階段。第二個階段是代碼執行,函數表達式和不合格的標識符(爲聲明的變量)被建立。變量,函數的聲明永遠在代碼處理的第一步,與代碼編寫位置無關。this
定義變量
ECMAScript變量是鬆散類型的,能夠保存任何類型的數據。spa
var message = "hello" ; message = 100; //有效,不推薦
經過var定義局部變量;忽略var會定義全局變量,做爲window的屬性;
使用未定義的變量,會報錯,xxx is not defined,對於未定義的變量,只能使用typeof操做符,返回"undefined"。指針
var message; 等同於 var message = undefined; 非 var message = 'undefined';
5種簡單數據類型
Undefined, Null, Boolean, Number, Stringcode
複雜數據類型
Object對象
Null 類型
null值表示一個空對象指針,若是定義的變量準備在未來用於保存對象,那麼最好將該變量初始化爲null而不是其餘值。這樣只要檢查變量的值是否爲null,就能夠判斷變量是否判斷一個對象的引用。blog
console.log( null == undefined); // true console.log( null === undefined); // false obj !=null 能夠判斷對象是否爲null 或者 爲undefined var obj; console.log(obj != null) //false console.log(obj != undefined) //false
使用typeof操做符返回字符串圖片
"undefined" 變量未定義或者聲明定義後未賦值。除了typeof操做符,操做未定義的變量會報錯 "boolean" 變量的值是布爾值 "string" 變量的值是字符串 "number" 變量的值是數值 "object" 變量的值是對象或null "function" 變量的值是函數
隱式類型轉換
Number 類型
若是小數點後面沒有跟任何數字,或者浮點數值自己就是一個整數,那麼該浮點數會被轉換爲整數。保存浮點數所需的內存空間是整數的兩倍,若是可能,ECMAScript會不失時機地將浮點數轉化爲整數。
var floatNum1 = 1.; // 解析爲1 var floatNum2 = 10.0; // 解析爲10
基於IEEE754數值的浮點計算會產生舍入偏差,不要測試某個特定的浮點數值。
console.log(0.1 + 0.2 == 0.3); // false
非數值轉換爲數值
Number();
parseInt(); 指定基數
parseFloat(); 只解析十進制值,沒有第二個參數指定基數
+;
console.log(+'5'); //5 console.log(+'5.5'); //5.5 console.log(+'5w'); //NaN console.log(+'ww'); //NaN console.log(parseInt('5',10)); // 5 console.log(parseInt('5.5',10)); //5 console.log(parseInt('5w',10)); //5 console.log(parseInt('ww',10)); //NaN var month = "06", year = "09"; console.log(parseInt(month)); //6 console.log(parseInt(month, 10)); //6 console.log(parseInt(year)); //0 console.log(parseInt(year, 10)); //9
parseInt()能夠從字符串中獲取數值。當字符串以」0″開頭的時候就有可能會出問題,開頭爲」0″的字符串會被當作8進制處理。爲了不矛盾和意外的結果,老是指定基數(radix)參數---第二個參數。
+"08" // 結果是 8 +"08netease" //NaN Number("08") // 8 Number("08netease") //NaN parseInt("08netease", 10) //8 parseInt(arg0, arg1)較慢