這幾天逛掘金,發(fā)現(xiàn)一些有意思的面試題,收集給大家分享一下
一. js
基礎(chǔ)題
let a = {a: 10};
let b = {b: 10};
let obj = {
a: 10
};
obj[b] = 20;
console.log(obj[a]);
如果不運行代碼,請思考一下結(jié)果是啥?
簡書暫時不支持折疊功能,所以直接看一下結(jié)果吧
console.log(obj[a]);//20
- 解析
考的知識點-
1.Object
的key
為字符串
2.obj[a]
和obj[b]
中的a
b
為變量
obj[b] = 20;
console.log(obj)//{a:10,[object Object]: 20}
此時obj[a]
獲取的是obj['object Object']
的值,也就是20
二. 隱式轉(zhuǎn)換a==1&&a==2&&a==3
上題的解法有幾種,下面只說一種,而且是不被推薦的一種,但是涉及到js
基礎(chǔ),咱們就來看一看
- 先說答案
a={
i: 1,
valueOf(){
return this.i++
}
}
- 解析
-
==
兩邊的數(shù)據(jù)格式不一樣,涉及隱式轉(zhuǎn)換
a = {
i: 1,
toString(){
console.log('tostring')
}
}
a==1//tostring
a = {
i: 1,
valueOf(){
console.log('valueOf')
}
}
a==1//valueOf
a = {
i: 1,
valueOf(){
console.log('valueOf')
},
toString(){
console.log('tostring')
}
}
a==1//valueOf
-
object
隱式轉(zhuǎn)換首先調(diào)用valueOf
方法,如果無此方法,就調(diào)用toString
方法;這里指的是object
實例的本身方法,而不是原型鏈上的方法,如果實例本身既無valueOf
也無toString
,那么調(diào)用的就是原型鏈上的方法,所以寫成如下方法也是可以的
a={
i: 1,
toString(){
return this.i++
}
}
三. 請寫出下面的輸出結(jié)果
var a = {
name:'lv',
print(){
return ()=>{
console.log(this.name)
}
}
}
var b = {
name:'yong'
}
a.print()()
a.print().call(b)
a.print.call(b)()
答案如下
"lv"
"lv"
"yong"
解析如下:
- 第一個控制臺輸出很好理解避消,正常執(zhí)行函數(shù)
- 第二個和第三個涉及了
call
知識點和es6
箭頭函數(shù)
1.call
方法會改變函數(shù)(不包括箭頭函數(shù))里this
指向并執(zhí)行函數(shù)
2.箭頭函數(shù)的this
指向是固定的聚谁,不會受call
方法影響,箭頭函數(shù)this
永遠(yuǎn)指向箭頭函數(shù)所在對象的this
,
簡單說就是,該this
是print
函數(shù)的this
.所以第二個代碼輸出'lv'
,第三行代碼執(zhí)行時改變了print函數(shù)
的this
,所以輸出結(jié)果為'yong'
四. 請看題
const a = { 1:'a',2:'b',3:'c'}
const set = new Set([1,2,3,4,'5'])
console.log(a.hasOwnProperty('1'))
console.log(a.hasOwnProperty(1))
console.log(set.has('1'))
console.log(set.has(1))
console.log(set.has('5'))
console.log(set.has(5))
答案如下
true
true
false
true
true
false
- 解析
Object
的key
為字符串,數(shù)字會轉(zhuǎn)換成字符串
hasOwnProperty
接收的參數(shù)為字符串迄委,數(shù)字會轉(zhuǎn)化為字符串
set
結(jié)構(gòu)-鍵值可以是任意格式房匆,所以會區(qū)分出字符串和數(shù)字
五.請寫出下面題目的打印值-關(guān)于this
指向
let length = 10
function fn() {
console.log(this.length)
}
let obj = {
length: 5,
method(fn){
fn()
arguments[0]()
}
}
obj.method(fn,1)
考點:
- 全局下聲明變量
let
和var
的區(qū)別-var
的變量會掛在window
上窝革;let
不會 -
this
的引用對象永遠(yuǎn)是call
的第一個參數(shù)姻蚓,沒有指定call
的第一個參數(shù)(這里包括隱式指定)時為undefined
,非嚴(yán)格模式下會被js
指向window
-
window.length
返回當(dāng)前窗口中包含的框架數(shù)量(框架包括frame和iframe兩種元素). -
arguments[0]()
等價于arguments.0.call(arguments)
等價于fn.call(arguments)
若是運行結(jié)果還是不懂,可以留言堆生,我看到后會答復(fù)
每個運行環(huán)境下的第一個結(jié)果不太一樣专缠,這里只展示我的結(jié)果
0
2
五. 不使用加減乘除計算一個整數(shù)的8倍
這個題目通用解法就是使用二進(jìn)制位運算符
function scaleNum(num,multiple){
let i = multiple/2
return num<<i
}
let a = scaleNum(5,4)
console.log(a)//20
這個代碼只限于2的倍數(shù)計算,如果是其他倍數(shù)還需要用其他的位運算符做一下減法
- 下面獻(xiàn)上我剛看到題目時想到的
CSS
方法,這個方法不建議面試時用淑仆,因為別人好像沒這么寫的(騷操作)
function scaleNum(num,multiple){
let a = document.createElement('div')
a.style.width=`${num}px`
a.style.transform = `scale(${multiple})`
a.id='lllccc'
document.body.appendChild(a)
let result = a.getBoundingClientRect().width
document.body.removeChild(a)
return result
}
let a = scaleNum(5,10)
console.log(a)//50