一道前端筆試難題 對New的思考

2021-10-04 02:48:56 字數 1497 閱讀 2298

function

foo(

)return

this;}

foo.

getname

=function()

foo.prototype.

getname

=function()

vargetname

=function()

function

getname()

foo.

getname()

;getname()

;foo()

.getname()

;getname()

;new

foo.getname()

;new

foo().

getname()

;new

newfoo()

.getname()

;

問依次輸出的是什麼?

第乙個

把函式看成物件,foo.x 可以賦值並且取得,但是函式內部賦值的一概取不到,哪怕是不加var 所以就是2

第二個

這個就涉及到了預編譯的內容,函式申明會被提公升到最前面然後是var定義的變數,所以轉化下相當於

function

getname()

var getname;

function

getname()

所以後面的函式申明覆蓋前面的,最後返回值是4

第三個

foo()相當於呼叫了一次函式返回的是window,在函式內部不加申明符則預設為全域性變數,將getname修改了,所以最後相當於呼叫window.getname()返回1

第四個

同理返回1

第五個

運算順序【new foo() > foo() > new foo】 原式相當於new (foo.getname)(),根據new的執行機制會執行一次構造器函式即foo.getname()那麼會返回2

關於new做了什麼 大致分為三步:

1.以構造器的prototype屬性為原型,建立新物件;

2.將this(可以理解為上句建立的新物件)和呼叫引數傳給構造器,執行;

3.如果構造器沒有手動返回物件,則返回第一步建立的物件

第六個

相當於(new foo()).getname(),即呼叫構造器函式foo建立的例項物件裡的方法(應該用this.getname = function (){})但是很明顯裡面沒有,所以去原型裡找,最後返回3

第七個

相當於new (((new foo()).getname)(),承接第六個,使用的是原型鏈上的函式作為構造器,還是返回3

一道筆試題的思考(三)

題目 隨機產生5個數,這5個數每個數的範圍都在 10,35 之間,5個數的和是定值100,盡量讓5個數的概率隨機,寫出演算法?如,原來a,b,c,d,e都是20,隨機後變成a 34b 29c 11d 10e 16,但是他們之和還是100,再次隨機後a 11b 21c 13d 28e 27,他們的和還...

對一道微軟面試題的思考

有100萬個數字 1到9 其中只有1個數字重複2次,如何快速找出該數字。大家討論的很激烈,也給出了很多的演算法。lthyxy同學的演算法是 掃瞄一遍做計數,然後看那個數的計數器是2。程式如下 int num 10 for int i 0 i 1000000 i a i 就是你那些數 num a i ...

一道無參構造筆試題引發的思考

斷點除錯來分析一道筆試題 先說正確的輸出的結果 相信小夥伴會有疑惑 為啥先有個a?打上斷點,且跟隨本憨憨斷點除錯看看究竟.第一步 進入debug模式 第二步 下一步竟然進入到了class a 的方法a中 這就是疑處所在 執行後的控制台 接下來繼續看 第三步 執行到b的無參構造 執行後的控制台 第四步...