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