前端面試題之JavaScript(三)


1.立即執(zhí)行函數(shù)表達式是什么?有什么作用

var a=2;
(function foo(){
    var a=3;
    console.log(a); //3
})();
console.log(a); //2

由于函數(shù)被包含在一對()括號內(nèi)部,因此成為了一個表達式,通過在末尾加上另外一個()可以立即執(zhí)行這個函數(shù),比如(function foo(){..})()。第一個()將函數(shù)變成表達式,第二個()執(zhí)行了這個函數(shù)。
作用

  • 將函數(shù)里的變量和外部變量隔離開
  • 防止函數(shù)名污染所在作用域。

2. 求n!,用遞歸來實現(xiàn)

function factorial(n){
  if(n==1){
  return 1;
}
  return n*factorial(n-1);
}
factorial(5);

3.以下代碼輸出什么?

image.png

4.寫一個函數(shù),返回參數(shù)的平方和?

  <script>
    function sumOfSquares() {
      var sum = 0;
      for (var i = 0; i < arguments.length; i++){
        sum += arguments[i] ** 2;
    }
    return sum;
}
    var result = sumOfSquares(2, 3, 4)
    var result2 = sumOfSquares(1, 3)
    console.log(result)  //29
    console.log(result2)  //10
  </script>

5.如下代碼的輸出?為什么

  • var a聲明提前
    等價于
var a;
console.log(a);
 a= 1;
console.log(b);
  • console.log(a)中的a聲明未賦值,所以返回undefined
    console,log(b)中的b在全局作用域中遍尋不到所需變量,所以拋出異常 ReferenceError

6. 如下代碼的輸出?為什么

  • 函數(shù)聲明提前,函數(shù)表達式無法聲明提前,var sayAge
    等價于
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge;
    sayName('world');
    sayAge(10);
        sayAge= function(age){
        console.log(age);
    };
  • sayName('world')查看sayName前面有函數(shù)聲明,所以為hello world
  • sayAge(10)查看sayName前面有var sayAge聲明,說明sayAge()被分配給所在作用域,因此sayAge()不會返回ReferenceError。但是sayAge此時沒有賦值,sayAge()由于對undefined值進行函數(shù)調(diào)用而導致非法操作,因此拋出異常TypeError

7.如下代碼輸出什么? 為什么

  • 函數(shù)聲明提前
    等價于
var x=10
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}
bar()
  • bar()在該作用域找bar聲明,找到了,進去,
  • 進入到bar作用域里,foo()在該作用域找不到函數(shù)聲明,于是往上一層找,找到了,在foo()作用域中,console.log(x)的x在foo()下的作用域里找不到變量x,于是繼續(xù)往上一層作用域找,找到了,所以x的值等于10,console.log(x)本身值等于undefined

8.如下代碼輸出什么? 為什么

image.png

等價于

var x=10
function bar() {
 var x=30
function foo(){
   console.log(x)
}
  foo()
}
bar()

9.如下代碼輸出什么? 為什么

  • fn()在該作用域找函數(shù)聲明,沒有,找函數(shù)表達式,找到被賦值fn1(),fn1()在該作用域找函數(shù)聲明,找到,在fn1()作用域下,return fn3,
    在fn1()函數(shù)作用域找fn3函數(shù)聲明,找到,在fn3()作用域下,遇到fn2(),在該作用域找fn2(),沒找到,從上一級找,找到,在fn2()作用域下,遇到console.log(a),a在該作用域找不到變量聲明,往上一級找,找到,var a=2 ,所以最后結(jié)果為2

10.如下代碼輸出什么? 為什么

image.png
  • 1
    原理如上

11.如下代碼輸出什么? 為什么

  • 注意 var a=4 變量聲明提前 var a 提前 在fn2()前面,所以為undefined
var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
     var a = 4
    fn2()
   
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //輸出多少

12.如下代碼輸出什么? 為什么



13.如下代碼輸出什么? 為什么

image.png
  • 源代碼相當于下列代碼
var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
 // n=a
 //n=c.age 
  ++n
}
function f2(obj){
  ++obj.age
}

f1(a) 
f2(c) 
f1(c.age) 
console.log(a) 
console.log(c) 

基本類型引用類型傳參都是值傳遞,相當于賦值,前者和后者沒有任何關(guān)系,但是引用類型賦值賦的是引用即內(nèi)存地址,所以還是會訪問同一對象,所以當引用改變屬性的時候,會相應改變。如果函數(shù)當中給對象重新賦值,那內(nèi)作用域的對象和外作用域?qū)ο缶秃翢o關(guān)系了。
參考:http://www.itdecent.cn/p/0b9216bd05a7 基本類型傳參,引用類型傳參。


14.對象淺拷貝函數(shù)

  <script>
    function shallowCopy(obj) {
      var newObj = {};
      for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
          newObj[i] = obj[i];
        }

      }

      return newObj;
    }
    // var obj = {
    //   name: "zhx", age: "17", arr: [1, 3, 5, 6, 7]
    // };
    var obj={
      name:'zhx',
      age:'19',
      infomation:{
        height:'100',
        weight:'40'
      }
    }

    var obj1=shallowCopy(obj);
    obj.infomation.height=40;
    console.log(obj);
    console.log(obj1);
  </script>

15. 對象深拷貝函數(shù)

  <script>
    function deepCopy(obj){
      var newObj={};
      for(var key in obj){
        if(typeof oldObj[key] === 'object') {
                newObj[key] = deepCopy(oldObj[key]);
            }else{
                newObj[key] = oldObj[key];
            }
      }
      return newObj;
    }
    var obj={
      name:'zhx',
      age:'19',
      infomation:{
        height:'100',
        weight:'40'
      }
    }

    var obj1=shallowCopy(obj);
    obj.infomation.height=40;
    console.log(obj);
    console.log(obj1);
  </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù)聲明和函數(shù)表達式有什么區(qū)別 函數(shù)聲明:使用function關(guān)鍵字聲明一個函數(shù) 函數(shù)表達式:聲明一個變量然后賦值...
    王難道閱讀 227評論 0 0
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,131評論 2 17
  • 1.幾種基本數(shù)據(jù)類型?復雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,882評論 0 106
  • 特奢匯不斷為其會員提供超高的客戶價值,目前平臺上有30多萬的收費會員,年底將達到200萬,三年內(nèi)將有9000萬的會...
    b5d5edf5911a閱讀 170評論 0 0
  • 這是網(wǎng)易微專業(yè)之《前端工程師》CSS單元測試題,我做了兩次,第一次在沒上課之前做的,全靠邊寫邊測試,錯了五六題吧,...
    荷小音閱讀 4,557評論 3 5

友情鏈接更多精彩內(nèi)容