Javascript中幾個看起來簡單,卻不必定會作的題

Javascript做爲前端開發必須掌握的一門語言,由於語言的靈活性,有些知識點看起來簡單,在真正遇到的時候,卻不必定會直接作出來,今天咱們就一塊兒來看看幾道題目吧前端

題目1數組

var val = 'smtg';

console.log(' Value is' + (val === 'smtg') ? 'Something' : 'Nothing');

這道題考察的知識點是運算符的優先級。測試

首先,小括號的優先級是最高的,因此首先會作判斷,val與smtg相等返回true。所以最後這道題等價於判斷是執行下面的語句1仍是語句2.this

//語句1prototype

'Value is' + (true ? 'Something' : 'Nothing');

//語句2code

'Value is true' ? 'Something' : 'Nothing';

根據運算符優先級咱們知道,鏈接元算符+的優先級要高於條件運算符?的優先級,所以實際執行的是語句2,因此最後返回的結果是索引

'Something'.ip

題目2開發

咱們再來看看下面這道題。字符串

var ary = [0,1,2];

  ary[6] = 6;

  var result = ary.filter(function(x){

  return x === undefined; 

  });

  console.log(result);

這道題考察的時候數組的初始化和filter方法。

第一眼看上去,覺得會輸出[undefined,undefined,undefined],可是實際輸出倒是undefined,爲何會這樣?

這是由於在JavaScript裏存在稀疏數組的概念,數組在初始化時,只會對已經肯定索引的選項進行初始化,對於不存在索引的選項不進行初始化,經過如下代碼能夠肯定。

0 in ary;//true

  1 in ary;//true

  3 in ary;//false     

  4 in ary;//false

  6 in ary;//true 

對數組使用in運算符時,是經過枚舉數組的索引,經過3和4返回false能夠知道,ary[3]和ary[4]實際是不存在的,未進行初始化。

咱們再來看看 Array.prototype.filter方法和polyfill,注意代碼中標註的地方。

Array.prototype.filter = function(fun /*thisArg*/){

  if(this === void 0 || this === null){

    throw new TypeError();

  }

  var t = Object(this);

  var len = t.length >>> 0;

  if(typeof fun !== 'function'){

    throw new TypeError();

  }

  var res = [];

  var thisArg = arguments.length >=2 ? arguments[1]:void 0;

  for(var i = 0;i<len;i++){

    if(i in t){  //注意這裏,使用的是in運算符

      var val = t[i];

      if(fun.call(thisArg,val,i,t)){

        res.push(val);

      }

    }

  }

  return res;

}

在filter方法源碼中,我發現使用了in運算符,而arg數組沒有對索引爲3,4,5的值進行初始化,所以會直接跳過執行,因此最後返回undefined。

題3

function caseshow(val){

  switch(val){

    switch(value){

      case 'A':

        console.log('A');

               break;

       case 'B':

        console.log('B');

               break;

         case 'C':

        console.log('C');

                        break;

      default:
        console.log('do not know!');

    }          

  }      

}    

caseshow(new String('A'));

咋一看,不少人會覺得輸出'case A',但實際輸出'do not know'。why? 這道題考察的知識點是:switch和string,咱們須要知道一下兩點:

1,JavaScript中switch執行的是嚴格相等(===)。 2,字符串和string的實例不同。

第二點咱們能夠測試下。

var s_p = 'foo'; var s_o = new String(s_p)

console.log(typeof s_p) //'string' 
console.log(typeof s_o) //'object'
console.log(s_p === s_o)  //'false'

所以針對題目中的'A'與String('A')並不嚴格相等,最終會返回‘do not know’

題4 針對上面的題目3,咱們稍做一點改動,成爲下面的題目4,再看看結果輸出什麼?

function caseshow2(val){ 
    switch(val){   
       case 'A':
    console.log('A');
    break;   case 'B':
    console.log('B');
    break;   case undefined:
    console.log('undefined');
    break;   default:
    console.log('do not know!'); 
 } } 
   caseshow2(String('A'));

    題目4相對於題目3,只是在最後調用的時候傳入的參數是String('A'),它的結果就變成了'Case A'。這是爲何呢?

其實很簡單,String(X)返回的是一個字符串而不會生成一個新的String實例,所以與'A'是嚴格相等的

相關文章
相關標籤/搜索