困惑一:
先看一個例子:
function test(){message = "hi";}test();alert(message);會輸出字串“hi"
在函數內部使用var定義的變數是局部變數,省略var操作符的變數是全域變數。
困惑二:
alert(undefined == null)
結果是”true"
我們知道在js中分為基本類型和參考型別,基本類型包括number、string、boolean、undefined、null.如果一個基本類型沒有初始化則會是undefined類型,而null代表null 指標。實際上undefined值是派生自null的,因此返回true.
困惑三:
alert(isNaN(NaN)); //truealert(isNaN(10)); //falsealert(isNaN("10")); //false 自動類型轉換alert(isNaN("blue")); //truealert(isNaN(true)); //false 自動類型轉換NaN指非數值(Not a Number)是一個特殊的數值,在ECMAScript中,任何數值除以0返回NaN,而且任何涉及NaN的操作都會返回NaN. NaN與任何值不等,包括自身。
alert(NaN == NaN); // false
困惑四:
for(var propName in window){document.write(propName);}For - in 語句是一種精準的迭代語句,可以用來枚舉對象的屬性,類似於java中的for( String s : String[])
困惑五:
var qs = location.search.substring(1);var hostName = location.hostname;var url = location.href;//等價於下面with(location){var qs = search.substring(1);var hostName = hostname;var url = href;}with語句的作用是將代碼的範圍設定到一個特定的對象中,主要目的是為了簡化多次編寫同一個對象的工作。
困惑六:
function howManyArgs(){alert(arguments.length);}howManyArgs("String", 45); //2howManyArgs(); //0howManyArgs(12); //1ECMAScript中的參數在內部是用一個數組來表示的,函數接收到的始終都是這個數組,而不關心數組中包含哪些參數(如果沒有參數的話)。
命名的參數只提供便利,但不是必須的。再看下面例子
function doAdd(num1, num2){arguments[1] = 10;alert(arguments[0] + num2);}因為arguments對象中的值會自動反映到對應的具名引數,所以num2會變成10,但是他們的記憶體空間是獨立的(不是引用),另外arguments對象的長度是由傳入的參數個數決定的,不是由定義函數時的具名引數個數決定的。
困惑七:
for(var i=0; i<10; i++){}alert(i); //輸出結果為 10JavaScript沒有塊級範圍。