1. 程式人生 > >JS 2018.09.13訓練題筆記

JS 2018.09.13訓練題筆記

1、JavaScript程式中,alert(undefined == null)的輸出結果是     ture;

    解析:undefined值是派生自null值的,因此ECMA-262規定對它們的相等性測試要返回true。 

              ==僅判斷值是否相同,undefined和null是相同的,故true

             ===在判斷值是否相同的同時

還判斷型別是否相同,undefined型別為undefined,null型別為object,因此為false

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

console.log(1"2"+"2");

console.log(1+ +"2"+"2");

console.log("A""B"+"2");

console.log("A""B"+2);

1

console.log(1"2"+"2");

做加法時要注意雙引號,當使用雙引號時,JavaScript認為是字串,字串相加等於字串合併。
因此,這裡相當於字串的合併,即為122.
 

1

console.log(1+ +"2"+"2");

第一個+"2"中的加號是一元加操作符,+"2"會變成數值2,因此1+ +"2"相當於1+2=3.
然後和後面的字串“2”相合並,變成了字串"32".
 

1

console.log("A""B"+"2");

"A"-"B"的運算中,需要先把"A"和"B"用Number函式轉換為數值,其結果為NaN,在減法操作中,如果有一個是NaN,則結果是NaN,因此"A"-"B"結果為NaN。
然後和"2"進行字串合併,變成了NaN2.
 

1

console.log("A""B"+2);

根據上題所述,"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物件的方法

 

 

今天在牛客網上刷題時做的筆記,方便自己複習。