JS 2018.09.13訓練題筆記
1、JavaScript程式中,alert(undefined == null)的輸出結果是 ture;
解析:undefined值是派生自null值的,因此ECMA-262規定對它們的相等性測試要返回true。
==僅判斷值是否相同,undefined值和null是相同的,故true
===在判斷值是否相同的同時
2、javascript常見事件的觸發情況
- onBlur:當失去輸入焦點後產生該事件
- onFocus:當輸入獲得焦點後,產生該檔案
- onchange:當文字值改變時,產生該事件
- onselect:當文字加亮後,產生該事件
- onClick:當元件被點選時產生的事件
3,、下面這段javascript程式碼,
var msg='hello';
for (var i=0; i<10; i++)
{
var msg='hello'+i*2+i;
}
alert(msg);
最後一句alert的輸出結果是 hello189
解析:易錯答案(hello)javascript只有函式域,沒有塊作用域的概念,所以在同一個作用域中同一個變數宣告多次還是第一次宣告那個!
4、有如下程式碼:
var name="World!";
(function(){
var name;
if(typeof name=== 'undefined'){
name='Jack';
console.log('Goodbye'+name);
}
else
{
console.log('hello'+name);
}
}
)();
請問執行後彈出的值是:Goodbye Jack
解析:當函式內部變數與全域性變數同名是,全域性變數會被覆蓋,因為JS是單執行緒執行var name 當前沒有複製,所以型別為undefined;
變數宣告提升
JS碼分為解析階段和執行階段。
在解析階段會找到所有宣告,並會與各自執行環境關聯。只有宣告操作會被提升,賦值和邏輯操作會被留在原地等待程式碼執行。
如對於 var a=2; 解析器會把它當成宣告操作(var a)和賦值操作(a=2)兩部分。宣告操作會被提升到它所在執行環境的頂部,並賦值 undefined而賦值操作則會原地待命。 原始碼相當於:
var name="world";
(function(){
var name; //JS無塊級作用域,所以變數宣告提升到此處
if(typeof name==="undefined"){ //進入if控制語句
name="Jack";
console.log("Goodbye"+name); //執行該語句
}else{
console.log("Hello"+name);
}
})();
//所以答案為 Goodbye Jack
5、如下程式碼輸出的結果是什麼:
1 2 3 4 |
|
1 |
|
做加法時要注意雙引號,當使用雙引號時,JavaScript認為是字串,字串相加等於字串合併。
因此,這裡相當於字串的合併,即為122.
1 |
|
第一個+"2"中的加號是一元加操作符,+"2"會變成數值2,因此1+ +"2"相當於1+2=3.
然後和後面的字串“2”相合並,變成了字串"32".
1 |
|
"A"-"B"的運算中,需要先把"A"和"B"用Number函式轉換為數值,其結果為NaN,在減法操作中,如果有一個是NaN,則結果是NaN,因此"A"-"B"結果為NaN。
然後和"2"進行字串合併,變成了NaN2.
1 |
|
根據上題所述,"A"-"B"結果為NaN,然後和數值2進行加法操作,在加法操作中,如果有一個運算元是NaN,則結果為NaN。
6、filter的兩種使用方法
- 在模板中使用filter
我們可以直接在{{}}中使用filter,跟在表示式後面用 | 分割,語法如下:
{{ expression | filter }}
也可以多個filter連用,上一個filter的輸出將作為下一個filter的輸入
{{ expression | filter1 | filter2 | ... }}
filter可以接收引數,引數用 : 進行分割,如下:
{{ expression | filter:argument1:argument2:... }}
除了對{{}}中的資料進行格式化,我們還可以在指令中使用filter,例如先對陣列array進行過濾處理,然後再迴圈輸出:
<span ng-repeat="a in array | filter ">
- 在controller和service中使用filter
我們的js程式碼中也可以使用過濾器,方式就是我們熟悉的依賴注入,例如我要在controller中使用currency過濾器,只需 將它注入到該controller中即可,程式碼如下:
app.controller('testC',function($scope,currencyFilter){
$scope.num = currencyFilter(123534);
}
在模板中使用{{num}}就可以直接輸出 $123,534.00了!在服務中使用filter也是同樣的道理。
ng提供了一個$filter服務可以來呼叫所需的filter,你只需注入一個$filter就夠了,使用方法如下:
app.controller('testC',function($scope,$filter){
$scope.num = $filter('currency')(123534);
$scope.date = $filter('date')(new Date());
}
可以達到同樣的效果。好處是你可以方便使用不同的filter了。
7、假設有如下程式碼,那麼a(10)的返回結果是 (5)
function a(a)
{
a^=(1<<4)-1;
return a;
}
解析:
1<<4 左移相當於1*2^4=16
a^=16-1=15
a=a^15=10^15
^ 異或運算:
10的二進位制00001010
15的二進位制00001111
========>00000101 轉成十進位制:5
(按位異或運算,同為1或同為0取0,不同取1)
8、JS中,可以將物件分為“內部物件”、“宿主物件”和“自定義物件”三種。
- 內部物件
js中的內部物件包括Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各種錯誤類物件,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。
其中Global和Math這兩個物件又被稱為“內建物件”,這兩個物件在指令碼程式初始化時被建立,不必例項化這兩個物件。
- 宿主物件
宿主物件就是執行JS指令碼的環境提供的物件。對於嵌入到網頁中的JS來說,其宿主物件就是瀏覽器提供的物件,所以又稱為瀏覽器物件,如IE、Firefox等瀏覽器提供的物件。不同的瀏覽器提供的宿主物件可能不同,即使提供的物件相同,其實現方式也大相徑庭!這會帶來瀏覽器相容問題,增加開發難度。
瀏覽器物件有很多,如Window和Documen,Element,form,image,等等。
- 自定義物件
顧名思義,就是開發人員自己定義的物件。JS允許使用自定義物件,使JS應用及功能得到擴充
9、match是支援正則表示式的String物件的方法
今天在牛客網上刷題時做的筆記,方便自己複習。