珍島網(wǎng)站模板最近社會(huì)熱點(diǎn)新聞事件
JS面試真題 part2
- 6、typeof 與 instanceof 區(qū)別
- 7、JavaScript原型,原型鏈?有什么特點(diǎn)
- 8、說(shuō)說(shuō)你對(duì)作用域鏈的理解
- 9、談?wù)則his對(duì)象的理解
- 10、說(shuō)說(shuō)new操作符具體干了什么
6、typeof 與 instanceof 區(qū)別
自己回答:
typeof
:用來(lái)判斷數(shù)據(jù)的類型 假設(shè) s1=’字符串‘ ,則 typeof s1
的值為string
。不過(guò)typeof null
的值是object
。因?yàn)閚ull是000000,object的是以000開(kāi)頭,這是js設(shè)計(jì)上的問(wèn)題。
instanceof
:用來(lái)判斷某個(gè)值是否在他的原型鏈上,假設(shè) s1=new String(‘字符串’),則 s1 instanceof String
的值為true,缺點(diǎn)是基礎(chǔ)數(shù)據(jù)需要用new創(chuàng)建出來(lái),s1=’字符串‘,則值為false
標(biāo)準(zhǔn)回答:
typeof
操作符返回一個(gè)字符串,表示未經(jīng)計(jì)算的操作數(shù)的類型 ,使用方法:typeof operand
、 typeof (operand)
,返回operand的類型
前六個(gè)都是基礎(chǔ)類型,其中typeof null
返回的是object,這是一個(gè)bug。還有除了function,其他的引用類型都是返回object。
instanceof
運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的prototype
屬性是否在某個(gè)實(shí)例對(duì)象的原型鏈上
使用方法:object instanceof constructor
,object
為實(shí)例對(duì)象,constructor
為構(gòu)造函數(shù)
typeof 與 instanceof 都是判斷數(shù)據(jù)類型的方法,區(qū)別如下:
- typeof會(huì)返回一個(gè)變量的基本類型,instanceof返回的是一個(gè)布爾值
- instanceof可以準(zhǔn)確的判斷復(fù)雜引用類型,但是不能正確判斷基礎(chǔ)數(shù)據(jù)類型
- typeof也存在弊端,可以判斷基礎(chǔ)數(shù)據(jù)類型(null除外),但是引用類型中,除了function類型以外,其他的也無(wú)法判斷
如果需要通用檢測(cè)數(shù)據(jù)類型,可以采用Object.prototype.toString
,返回"[object xxx]"的字符串
實(shí)現(xiàn)一個(gè)全局通用的數(shù)據(jù)類型判斷方法
使用如下:
7、JavaScript原型,原型鏈?有什么特點(diǎn)
自己回答:
JavaScript原型:JavaScript對(duì)象的構(gòu)造函數(shù)都有原型,實(shí)例對(duì)象的構(gòu)造函數(shù) object().prototype, 實(shí)例的隱式__proto__指向這個(gè)原型,實(shí)例可以通過(guò)__proto__訪問(wèn)構(gòu)造函數(shù)的prototype屬性,從而繼承一些屬性和方法。
原型鏈:構(gòu)造函數(shù)的prototype屬性,也是一個(gè)對(duì)象,這個(gè)對(duì)象也有構(gòu)造函數(shù),也可以指向有構(gòu)造函數(shù)的prototype,就形成了原型鏈,一個(gè)對(duì)象可以在原型鏈上依次向上尋找屬性和方法,即可以向原型,原型的原型,原型的原型的原型依次尋找。直到對(duì)象是null。
原型和原型鏈為對(duì)象提供了一些可以繼承的屬性和方法
標(biāo)準(zhǔn)回答:
原型:每個(gè)對(duì)象都有一個(gè)原型,當(dāng)試圖訪問(wèn)一個(gè)對(duì)象的屬性時(shí),不僅在該對(duì)象上找,也會(huì)在對(duì)象的原型上找,以及對(duì)象原型的原型,依次向上搜索,直到找到一個(gè)名字匹配的屬性或到達(dá)原型鏈的末尾。
準(zhǔn)確的說(shuō),這些方法和屬性定義在Object的構(gòu)造器函數(shù)上的ptototype屬性上,而不是實(shí)例對(duì)象本身。
函數(shù)都有一個(gè)屬性ptototype,function.ptototype就是我們說(shuō)的原型 function.ptototype有個(gè)屬性constructor指向函數(shù)function
原型鏈:原型對(duì)象也有原型,并從中繼承方法和屬性,一層一層,依此類推,這種關(guān)系通常被稱為原型鏈。
對(duì)象實(shí)例p和它的構(gòu)造函數(shù)person之間會(huì)建立一個(gè)鏈接。p. __ proto __ ==person.ptototype
8、說(shuō)說(shuō)你對(duì)作用域鏈的理解
自己回答:
作用域鏈:作用域分為全局作用域和函數(shù)作用域。
函數(shù)作用域里的對(duì)象是活動(dòng)對(duì)象,當(dāng)最里層的函數(shù)作用域沒(méi)有找到活動(dòng)對(duì)象時(shí),可以向外依次尋找,直到全局作用域
標(biāo)準(zhǔn)回答:
作用域,即變量(變量作用域又稱上下文)和函數(shù)生效(能被訪問(wèn))的區(qū)域或集合。換句話說(shuō),作用域決定了代碼區(qū)塊中變量和其他資源的可見(jiàn)性
一般將作用域分為:
- 全局作用域
- 函數(shù)作用域
- 塊級(jí)作用域
全局作用域:任何不在函數(shù)中或者大括號(hào)中聲明的變量,都是在全局作用域下,全局作用域下聲明的變量可以在程序的任意位置訪問(wèn)
函數(shù)作用域:也叫局部作用域,如果一個(gè)變量是在函數(shù)內(nèi)部聲明的它就在一個(gè)函數(shù)作用域下面,這些變量只能在函數(shù)內(nèi)部訪問(wèn),不能在函數(shù)外訪問(wèn)。
塊級(jí)作用域:ES6引入了let和const關(guān)鍵字,和var關(guān)鍵字不同,在大括號(hào)中使用let和const聲明的變量存在于塊級(jí)作用域中。在大括號(hào)之外不能訪問(wèn)這些變量
詞法作用域,又叫靜態(tài)作用域,變量在創(chuàng)建時(shí)就被確定了,而非執(zhí)行階段確定的,JavaScript遵循的就是詞法作用域
作用域鏈:當(dāng)在JavaScript
中使用一個(gè)變量的時(shí)候,首先JavaScript引擎會(huì)嘗試在當(dāng)前作用域下去尋找該變量,如果沒(méi)找到,再到它的上層作用域?qū)ふ?#xff0c;以此類推,找到該變量或是已經(jīng)到了全局作用域,如果在全局作用域仍然找不到該變量,就會(huì)在全局范圍內(nèi)隱式聲明該變量(非嚴(yán)格模式下)或直接報(bào)錯(cuò)
9、談?wù)則his對(duì)象的理解
自己回答:
this是函數(shù)里的指代對(duì)象,指向調(diào)用他的人
分為默認(rèn)調(diào)用,隱式調(diào)用,call/apply/bind調(diào)用
默認(rèn)調(diào)用:普通函數(shù),window對(duì)象
隱式調(diào)用:實(shí)例對(duì)象調(diào)用
call/apply/bind調(diào)用:改變this指向調(diào)用
標(biāo)準(zhǔn)答案:
定義:函數(shù)的調(diào)用方式?jīng)Q定了this
的值(運(yùn)行時(shí)綁定),this
關(guān)鍵字是函數(shù)運(yùn)行時(shí)自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,總指向調(diào)用它的對(duì)象
this
在函數(shù)執(zhí)行過(guò)程中,this
一旦確定了,就不可以再更改
綁定規(guī)則:
-
默認(rèn)綁定:全局環(huán)境中調(diào)用普通函數(shù),函數(shù)內(nèi)部使用this,指向全局對(duì)象window(非嚴(yán)格模式),嚴(yán)格模式下報(bào)錯(cuò),this綁定undefined
-
隱式綁定:函數(shù)作為某個(gè)對(duì)象的方法調(diào)用,此時(shí)this指向上級(jí)對(duì)象,o.b.fn(),fn里的this指向b
-
new綁定:通過(guò)構(gòu)建函數(shù)
new
關(guān)鍵字生成一個(gè)實(shí)例對(duì)象,此時(shí)this
指向這個(gè)實(shí)例對(duì)象
-
顯示綁定:call/apply/bind綁定,顯示修改this指向
箭頭函數(shù)
ES6提供的箭頭函數(shù),在代碼書(shū)寫(xiě)(編譯時(shí))就確定this指向,箭頭函數(shù)不能作為構(gòu)造函數(shù)
優(yōu)先級(jí)
new綁定>顯示綁定>隱式綁定>默認(rèn)綁定
10、說(shuō)說(shuō)new操作符具體干了什么
自己回答:
new操作符:執(zhí)行構(gòu)造函數(shù)、改變實(shí)例對(duì)象的this指向
標(biāo)準(zhǔn)回答:
是什么:new操作符用于創(chuàng)建一個(gè)給定構(gòu)造函數(shù)的實(shí)例對(duì)象
- new通過(guò)構(gòu)造函數(shù)創(chuàng)建出來(lái)的實(shí)例可以訪問(wèn)構(gòu)造函數(shù)中的屬性
- new通過(guò)構(gòu)造函數(shù)創(chuàng)建出來(lái)的實(shí)例可以訪問(wèn)構(gòu)造函數(shù)原型鏈上的屬性和方法
如果構(gòu)造函數(shù)有返回值:
返回基礎(chǔ)值,和沒(méi)有返回值時(shí)表現(xiàn)一致
如果返回對(duì)象,則
new的流程
- 創(chuàng)建了一個(gè)新的對(duì)象obj
- 將對(duì)象與構(gòu)造函數(shù)通過(guò)原型鏈連接起來(lái)
- 將構(gòu)建函數(shù)中的this綁定到對(duì)象obj上
- 如果構(gòu)建函數(shù)有返回值,如果是對(duì)象,則實(shí)例對(duì)象是返回的對(duì)象,如果返回值是基礎(chǔ)類型,則忽略
手寫(xiě)new操作符
function mynew(Func,...args){//1.創(chuàng)建一個(gè)新對(duì)象const obj={}//2.新對(duì)象原型指向構(gòu)造函數(shù)的原型對(duì)象obj.__proto__=Func.prototype//3.將構(gòu)造函數(shù)的this指向,指向obj,并執(zhí)行構(gòu)造函數(shù)let result= Func.apply(obj,args)//4.根據(jù)構(gòu)造函數(shù)執(zhí)行后的返回結(jié)果,確定返回的對(duì)象//如果沒(méi)有返回值或者返回的值不是對(duì)象,則返回新創(chuàng)建的對(duì)象,如果返回的是一個(gè)對(duì)象,則返回該對(duì)象return result intanceof Object?result:obj}