大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以?點此加我微信ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北
籍前端群,可加我微信進群。
天天推送各種框架和庫的,看起來也挺累的。。。今天放松一下,做幾道 JavaScript
基礎題找找自信吧!
可以先投票做題,然后翻到后面看答案。
第1題 — 原型
function?Animal(){?this.type?=?"animal"
}function?Dog(){?this.name?=?"dog"
}Dog.prototype?=?new?Animal()var?PavlovPet?=?new?Dog();?console.log(PavlovPet.__proto__?===?Dog.prototype)
console.log(Dog.prototype.__proto__?===?Animal.prototype)
console.log
打印出的值是?
第2題 — 小心“排序”
var?arr?=?[5,?22,?14,?9];console.log(arr.sort());
console.log
打印出的值是?
第3題 — 異步循環
for?(let?i?=?0;?i?<?3;?i++)?{const?log?=?()?=>?{console.log(i)}setTimeout(log,?100)
}
console.log
打印出的值是?
第4題 — numbers里面有啥?
const?length?=?4
const?numbers?=?[]
for?(var?i?=?0;?i?<?length;?i++);{numbers.push(i?+?1)
}console.log(numbers)
console.log
打印出的值是?
第5題 — 長度為0
const?clothes?=?['shirt',?'socks',?'jacket',?'pants',?'hat']
clothes.length?=?0console.log(clothes[3])
console.log
打印出的值是?
第6題 — 變量定義
var?a?=?1
function?output?()?{console.log(a)var?a?=?2console.log(a)
}
console.log(a)
output()
console.log(a)
console.log
打印出的值是?
第7題 — 找到值了嗎
function?foo()?{let?a?=?b?=?0a++return?a
}foo()
console.log(typeof?a)
console.log(typeof?b)
console.log
打印出的值是?
第8題 — 類型轉換
console.log(+true)
console.log(!"ConardLi")
console.log
打印出的值是?
第9題 — ESM
//?module.js?
export?default?()?=>?"Hello?world"
export?const?name?=?"c"//?index.js?
import?*?as?data?from?"./module"console.log(data)
console.log
打印出的值是?
第10題 — 對象做 key
const?a?=?{};
const?b?=?{?key:?"b"?};
const?c?=?{?key:?"c"?};a[b]?=?123;
a[c]?=?456;console.log(a[b]);
console.log
打印出的值是?
答案 - 第1題
把原型的基礎知識記清楚這道題就錯不了:
所有的對象都有
[[prototype]]
屬性(通過_proto_
訪問),該屬性對應對象的原型;所有的函數對象都有prototype
屬性,該屬性的值會被賦值給該函數創建的對象的_proto_
屬性。
答案是:
true
true
答案 - 第2題
抱歉,答案不是 [5, 9, 14, 22]
。如果不傳入排序函數,sort
函數會將每個元素轉換成字符串,然后根據它們的 UTF-16
值排序。
答案是:
[14,?22,?5,?9]
答案 - 第3題
這題我會,因為:
定時器是異步執行,瀏覽器會優先執行同步任務,在遇到定時器時會先把它們暫存在一個宏任務隊列中,待當前宏任務隊列的所有任務執行完畢后才會去執行隊列中的任務,此時循環已執行完畢,i 已經是 3。
所以答案是:
0
1
2
哎不對?答案為啥不是 3、3、3
?
因為循環里的 i
是用 let
聲明的,而不是用 var
聲明的!
let
聲明的變量擁有塊級作用域。即在 for
循環或 if
中用 let
定義變量,在外面是訪問不到的。
形如 for (let i...)
的循環在每次迭代時都為 i 創建一個新變量,并以之前迭代中同名變量的值將其初始化,所以上面的代碼實際上相當于:
for?(let?i?=?0)?{const?log?=?()?=>?{console.log(i)}setTimeout(log,?100)
}
for?(let?i?=?1)?{const?log?=?()?=>?{console.log(i)}setTimeout(log,?100)
}
for?(let?i?=?2)?{const?log?=?()?=>?{console.log(i)}setTimeout(log,?100)
}
答案 - 第4題
要看仔細啊,看到小括號和大括號之間有個;
嗎?
答案是:
[5]
答案 - 第5題
將數組的長度賦值為 0
就相當于從數組中刪除所有元素。
答案是:
undefined
答案 - 第6題
第一個輸出:全局的
var a
第二個輸出:
output
函數中聲明的var a
變量提升,還未賦值第三個輸出:
output
函數局部作用域的 a 已賦值第四輸出:全局的
var a
沒有變
答案是:
1
undefined
2
1
答案 - 第7題
let a
是一個局部變量。typeof a
檢查的是未聲明的變量。
b
是個全局變量,它在 foo
函數中被賦值。
答案是:
undefined
number
答案 - 第8題
+
運算符首先會嘗試將 boolean
類型轉換為數字類型,true
被轉換為 1
,false
被轉換為 0
。
字符串 'ConardLi'
是一個真值,所以 !'ConardLi'
為 false。
答案是:
1
false
答案 - 第9題
考察下你對 ES Module
的認識
答案是:
{?default:?function?default(),?name:?"c"?}
答案 - 第10題
對象能做對象的 key 嗎?當然不能,兩次賦值實際上是:
a["Object?object"]?=?123;
a["Object?object"]?=?456;
答案是:
456
怎么樣,找到自信了嗎?💯💯💯 全對的來這里集合!!!
·················?若川簡介?·················
你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助4000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。
掃碼加我微信 ruochuan02、拉你進源碼共讀群
今日話題
目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 ruochuan12?進群。分享、收藏、點贊、在看我的文章就是對我最大的支持~