js面試題目

1 function test (x, y, z) {數組

console.log(test.length)
console.log(arguments.length)
console.log(arguments.callee === test)
console.log(arguments[2])

}
test(10,20)
答案:3 2 true undefined
解析:
test.length是返回的函數的形參個數,因此爲3;函數

arguments.length返回的是函數調用時的實參個數,因此爲2;this

arguments.callee:初始值就是正被執行的 Function 對象,用於在函數內部調用自身,arguments對象自己是個由函數調用時傳入的實參組成的僞數組,訪問單個參數的方式與訪問數組元素的方式相同。prototype

只傳入了兩個參數,天然爲undefined.
2 var a = 10
a.pro = 10
console.log(a.pro + a)代理

var s = 'hello'
s.pro='world'
console.log(s.pro+s)
答案:NaN undefinedhello
解析:JavaScript引擎內部在處理對某個基本類型 a進行形如a.pro的操做時,會在內部臨時建立一個對應的包裝類型(對數字類型來講就是Number類型)的臨時對象,並把對基本類型的操做代理到對這個臨時對象身上,使得對基本類型的屬性訪問看起來像對象同樣。可是在操做完成後,臨時對象就銷燬了,下次再訪問時,會從新創建臨時對象,固然就會返回undefined了
3code

var f =1
if(!f) {
  var a =10
}
function fn() {
  var b =20
  c = 30
}
fn()
console.log(a)
console.log(c)
console.log(b)

答案:undefined 30 報錯:b is not defined
解析:
一、沒有用var聲明的是全局變量,即使在函數內部;
二、只有在function內部新聲明的纔是局部變量,在if,while,for等聲明的變量實際上是全局變量(除非自己在function內部)
三、由於變量提高,雖然if塊的內容沒執行,可是預解析階段會執行var a,只是沒有賦值而已,所以打印a是undefined而打印b會報錯對象

4ip

var length = 10
function fn () {
    console.log(this.length)
}
var obj = {
    length: 5,
    method: function(fn) {
        fn()
        arguments[0]();
    }
}

obj.method(fn,1)
答案:10,2,第一次輸出10應該沒有什麼異議,這裏的this指向window,第二個調用arguments[0]()至關於執行arguments調用方法,this指向arguments,而這裏傳了兩個參數,故輸出arguments長度爲2。get

5 function fn(a) {
console.log(a)
var a = 2
function a() {}
console.log(a)
}
fn(1)
答案:f a() { } 2
解析:咱們知道預解析階段,變量聲明和函數聲明會提早,且變量名和函數名同名時,函數優先級高於變量,會覆蓋變量,所以第一個輸出的是f a(){ },繼續執行,會執行a=2,再輸出的時候就會輸出2,不理解的同窗百度一下變量提高和函數提高
6 已知數組,編寫一個程序將數組便情話而且去掉其中的重複數字,而後升序排列
[[11,22,22],[13,14,15,15],[16,17,18,19,[11,12,[12,13,[14]]]],12]
7 實現一個函數add,知足如下結果
add(1) // 1
add(1,2) // 3
add(1)(2) // 3
add(1,2)(3,4) // 10
add(1)(2)(3) //6原型

function add () {
        const arg = [...arguments]
        function sum () {
            arg.push(...arguments)
            return sum
        }
        sum.toString = function () {
            return arg.reduce((x, y) => {
                return x + y
            })
        }
        return sum
    }
    console.log(add(1))
    console.log(add(1, 2))
    console.log(add(1, 2)(3, 4)(5,6))

8 看代碼

function Foo () {
        getName = function () {
          console.log(1)
        }
        return this
      }
      Foo.getName = function () {
        console.log(2)
      }
      Foo.prototype.getName = function () {
        console.log(3)
      }
      var getName = function () {
        console.log(4)
      }
      function getName () {
        console.log(5)
      }
      Foo.getName()
      getName()
      Foo().getName()
      getName()
      new Foo.getName()
      new Foo().getName()
      new new Foo().getName()

答案:2 4 1 1 2 3 3 1 訪問的是Foo函數上存儲的靜態屬性2 函數表達式覆蓋函數聲明,所以調用的是覆蓋後的getName 3 先執行了Foo(),此時返回window,而且函數裏getName沒有var 因此覆蓋了全局的 所以是14 等同於window.getName 45 點運算符優選與new, 執行爲 new (Foo.getName)()6 執行順序爲 (new Foo()).getName() (new Foo()) 返回Foo一個實例7 執行順序爲 new ((new Foo()).getName)() 先初始化Foo實例 而後將其原型上的getName 做爲構造函數再次new

相關文章
相關標籤/搜索