JavaScript
1.1 簡要描述JavaScript的資料類型。
JavaScript的資料類型可以分為原始類型和物件類型。
原始類型包括string、number和boolean三種。其中,字串時使用一對單引號或者一對雙引號括起來的任意文本;而數字類型都採用64位浮點格式儲存,不區分整數和小數;布爾(邏輯)類型只能有兩個值:true或false。
複雜類型指其他對象,如Array、Date、Object等。
除此之外,JavaScript中海油兩個特殊的原始值: null(空)和undefined(未定義),它們代表了各自特殊類型的唯一成員。
1.2 讀代碼,寫結果
寫出下列運算式的計算結果: 上述代碼的結果分別為:
var a=[];
var b=a;
b[0]=1;
console.log(a[0]); 1
console.log(b[0]); 1
console.log(a===b); true
將對象賦值給變數,僅僅數賦值的引用,對象本身並沒有賦值一次,因此,變數a和變數b指向同一個數組。
1.3 簡要描述null和undefined的區別
null :是JavaScript的關鍵字,用於描述”空值”,對其執行typeof操作,返回”object”,即為一個特殊的對象值,可以表示數字、字串和對象時”無值”的。
undefined :是預定義的全域變數,其值為”未定義”,它是變數的一種取值,表示變數沒有初始化。當查詢對象屬性、數組元素的值時,如果返回undefined則表示屬性或者元素不存在;如果函數沒有任何傳回值,也返回undefined。
需要注意的是,雖然null和undefined是不同的,但是因為都表示”值的空缺”,兩者可以互換。因此,使用”==”任務二者是相等的,需要使用”===”來區分它們。
1.4 讀代碼,寫結果
寫出下列運算式的計算結果: 上述代碼的結果分別為:
10+”object” 10object //轉換為字串
“7” * ”4”28 //轉換為字元
1 - ”x”NaN //無法轉換為數值進行計算,因此返回NaN
1 + { }1[object object] //返回對象的toString()結果按照字串相加
true + true2 //bool類型轉換為數字類型
2 + null2//null轉換為數值0
1.5 讀代碼,寫結果
寫出下列運算式的計算結果: 上述代碼的結果分別為:
var a=2;
var obj={x:1,y:{z:2}};
Var n=[obj,3,[4,5]];
console.log(a<<2);8
console.log(obj[“y”].z);2
console.log(n[0].y[“z”]);2
console.log(n[2][“1”]);5
delete n[0];
console.log(n[0].x);此行代碼錯誤輸出Error
1.6 閱讀如下代碼:
var x=10;
var y=20;
var z=x<y?x++:++y;
上述代碼運行後,變數x、y、z的值是多少。
答案:上述代碼運行後,變數想x的值為11;變數y的值為20;變數z的值為10。
這是因為,運行第三行代碼時,只執行。後的第一個語句,因此,y的值不發生變化,仍為20;並返回x的值賦值給變數z,因此z的值為10,然後將x的值增加1,變為11。
1.7 什麼是”邏輯短路”。
邏輯短路時對於邏輯運算而言,是指僅計算邏輯運算式中的一部分便能缺點結果,而不對整個運算式進行計算的現象。
對於”&&”運算子,當第一個運算元為false時,將不會判斷第二個運算元,吧、因為此時無論第二個運算元為何,最後的運算結果一定是false;
對於” || ”運算子,當第一個運算元為true時,將不會判斷第二個運算元,因為此時無論第二個運算元為何,最後的運算結果一定是true。
1.8 閱讀如下代碼
var empAge=20;
var empName;
if(empAge>20&&empName.length>0){
console.log(1);
}else{
console.log(2);
}
上述代碼運行後,將產生有效輸出,還是代碼錯誤。
參考答案:上述代碼運行,會輸出2,而不會發生錯誤。
這是因為,if條件中的邏輯運算式的第一個條件(empAge>20)不滿足,會返回false,此時將發生邏輯短路,而不會繼續判斷下一個條件。因此,即使下一個條件中的變數empName沒有賦值,此時如果計算empName.length將發生錯誤;但是,因為發生了邏輯短路,不會計算此運算式,因此不會發生錯誤。
既然if條件中的邏輯運算式返回false,則運行else語句:輸出2。
1.9 解釋一下JavaScript中的局部變數與全域變數區別
全域變數擁有全域範圍,在JavaScript代碼的任何地方都可以訪問;在函數內聲明的變數只是在函數體內有定義,即為局部變數,其範圍是局部性的。
需要注意的是,在函數體內聲明局部變數時,如果不使用var關鍵字,則將聲明全域變數。
1.10 讀代碼,寫結果
寫出下列代碼的輸出結果:
var x=”global”;
function test(){
var x=”local”;
return x;
}
console.log(test());
參考答案:上述代碼的輸出結果為local。這是因為,在函數test()體內,局部變數的優先順序高於同名的全域變數。因此,如果在函數體內聲明的局部變數和全域變數重名,則以局部變數優先。因此,調用函數test()時,返回的是局部變數x,其值為local。
1.11 什麼是JavaScript中的函數範圍
JavaScript中的函數範圍是指:變數在聲明它的函數體以及這個函數體嵌套的任意函數體內都有定義的。這意味著,在函數體內聲明的所有變數在整個函數體內始終是可見的,這種特性也被稱為“聲明提前”,即函數內聲明的所有變數(不涉及到賦值)都被提前至函數的頂部聲明。
比如,查看如下代碼:
function test(){
console.log(x);
var x=10;
console.log(x);
}
test();
上訴代碼運行,將先輸出undefined,再輸出10.
這是因為,雖然變數x在第二行聲明並賦值,丹其有效範圍為整個函數體,因此,第一行代碼輸出時,表示變數x已經聲明但是沒有賦值,因此輸出undefined;第三行代碼運行時,因為變數x已經賦值為10,則輸出10。
1.12 讀代碼,寫結果
寫出下列代碼的輸出結果
function test(){
var sum=0;
for(var i=0;i<10;i++){
sum+=i;
}
console.log(sum);
console.log(i);
}
test();
上述代碼中,輸出sum的值為45;輸出i的值為10。
這是因為,在函數test()體內,迴圈計算完畢後,變數sum的值從0累加到10的和即為45;變數i雖然是在for迴圈中聲明,但是在整個函數體內都有效(函數左右域),因此,迴圈完畢後,變數i的值為10。
1.13 讀代碼,寫結果
寫出下列代碼的輸出結果:
var x=”global”;
function test(){
console.log(x);
var x=”local”;
console.log(x);
}
test();
上述代碼中,先輸出undefined,再輸出local。
函數test()體內聲明了與全域變數同名的局部變數x,則將覆蓋全域變數,即局部變數優先。因此,第一次輸出變數x時,為輸出局部變數x,此時變數x只有聲明而沒有賦值,因此輸出undefined;第二次輸出變數x時,局部變數x已經賦值,因此輸出字串local。
1.14 簡述arguments對象的作用
在函數代碼中,使用特殊對象arguments可以訪問函數的參數。即開發人員在定義函數時,無需明確的為方法聲明參數,也可以在方法體中使用arguments來訪問參數。這是因為,arguments是一種特殊對象,在函數代碼中,表示函數的參數數組。
正因為arguments表示參數組成的數組,因此,首先可以使用arguments.length檢測函數的參數個數,其次,可以通過下標(arguments[index])來訪問某個參數。這樣可以用arguments對象判斷傳遞給函數的參數個數並擷取參數,適用於函數參數無法確定個數的情況下。
1.15 簡要描述JavaScript中定義函數的幾種方式
JavaScript中,有三種定義函數的方式:
函數語句:即使用function關鍵字顯示定義函數。如:
function f(x){return x+1;}
函數定義運算式:也稱為“函數直接量”。如:
Var f=function(x){return x+1;}
使用Function()建構函式定義。如:
var f=new Function(“x”,”return x+1;”);
1.16 讀代碼,寫結果
寫出下列代碼的輸出結果:
var f=function (x) {return x*x;}
console.log(f);
console.log(f(10));
上述代碼運行時,先輸出function(x) {return x*x;};再輸出100。
這是因為,變數f代表一個函數對象,因此直接輸出變數時,將輸出函數體對應的字元文本;f(10)表示調用變數f所對應的函數,返回100並輸出。
1.17 閱讀如下代碼
function f(){
console.log(“function”);
}
function test(){
console.log(f);
f();
f=”hello”;
console,log(f);
f();
}
test();
上述代碼運行,會先輸出:function f(){console.log("function");};然後輸出function;再輸出hello;然後會輸出異常資訊:string is not a function。
這是因為,定義函數時,函數名稱作為一個全域變數,該變數指向函數對象。因此,執行函數test中的第一行代碼時,將輸出變數f所對應的函數對象,即輸出函數體中代碼的字串形式;然後執行f