目錄
-
引言
- 乘法 (入門)
- 改變上下文 (入門)
- 批量改變對(duì)象的屬性 (入門)
- 屬性遍歷 (簡(jiǎn)單)
- 判斷是否包含數(shù)字 (入門)
- 檢查重復(fù)字符串 (簡(jiǎn)單)
- 判斷是否以元音字母結(jié)尾 (入門)
- 獲取指定字符串 (簡(jiǎn)單)
- 判斷是否符合指定格式 (簡(jiǎn)單)
- 判斷是否符合 USD 格式 (中等)
引言
盘箍担客網(wǎng)這個(gè) 前端筆試題庫(kù)寞蚌,可以說(shuō)這60道是最基礎(chǔ)的了珠增,也是考察的東西比較雜杂拨,有時(shí)間4天差不多就可以刷完,鞏固基礎(chǔ)還是有些用的补胚。做完題回顧一上午就可以過(guò)完一遍÷肽停現(xiàn)在我結(jié)合我的答案和參考的其他人的答案,在這里做一個(gè)總結(jié)溶其,也是自己知識(shí)的整理結(jié)果骚腥。
- 前端刷題 —— 牛客網(wǎng)前端題庫(kù)60道詳解(一)
- 前端刷題 —— 牌刻樱客網(wǎng)前端題庫(kù)60道詳解(二)
- 前端刷題 —— 攀客網(wǎng)前端題庫(kù)60道詳解(三)
- 前端刷題 —— 牛客網(wǎng)前端題庫(kù)60道詳解(四)
- 前端刷題 —— 畔峋客網(wǎng)前端題庫(kù)60道詳解(五)
- 前端刷題 —— 牌跄客網(wǎng)前端題庫(kù)60道詳解(六)
51. 乘法
題目描述
求 a 和 b 相乘的值,a 和 b 可能是小數(shù)昔汉,需要注意結(jié)果的精度問(wèn)題
輸入:3, 0.0001
輸出:0.0003
// 方法一:確定小數(shù)的位數(shù)然后保證精度是多少位
function multiply(a, b) {
let arrA = a.toString().split('.')[1] || ''
let arrB = b.toString().split('.')[1] || ''
let fix = arrA.length + arrB.length
return (a * b).toFixed(fix)
}
// 方法二:自己寫(xiě)的
function multiply(a, b) {
let arrA = a.toString().split('.')
let arrB = b.toString().split('.')
let count = 0
// 第一個(gè)有小數(shù)位
if(arrA[1]) {
count+=arrA.length
a = a * Math.pow(10,arrA.length)
}
// 第二個(gè)數(shù)有小數(shù)位
if(arrB[1]) {
count+=arrB.length
b = b * Math.pow(10,arrB.length)
}
return a * b * Math.pow(10, -count)
}
相關(guān)知識(shí)點(diǎn):
- javascript小數(shù)精度問(wèn)題
javascript的數(shù)值存儲(chǔ)是雙精度浮點(diǎn)數(shù)64位懈万,根據(jù)IEEE 754標(biāo)準(zhǔn),0-51為值靶病,52-62位指數(shù)钞速,63位是符號(hào)位。
二進(jìn)制浮點(diǎn)數(shù)表示法對(duì)0.1這樣的有誤差嫡秕。
解決方法就是先升冪再降冪。
52. 改變上下文
題目描述
將函數(shù) fn 的執(zhí)行上下文改為 obj苹威,返回 fn 執(zhí)行后的值
輸入:
alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })
輸出:Yo, Rebecca!
// 方法一:call
function alterContext(fn, obj) {
return fn.call(obj)
}
// 方法一:apply
function alterContext(fn, obj) {
return fn.apply(obj)
}
// 方法一:bind
function alterContext(fn, obj) {
return fn.bind(obj)()
}
相關(guān)知識(shí)點(diǎn):
- call/apply/bind
53. 批量改變對(duì)象的屬性
題目描述
給定一個(gè)構(gòu)造函數(shù) constructor昆咽,請(qǐng)完成 alterObjects 方法,將 constructor 的所有實(shí)例的 greeting 屬性指向給定的 greeting 變量牙甫。
輸入:var C = function(name) {this.name = name; return this;}; var obj1 = new C('Rebecca'); alterObjects(C, 'What\'s up'); obj1.greeting;
輸出:What's up
// 方法一:原型對(duì)象上添加屬性
function alterObjects(constructor, greeting) {
constructor.prototype.greeting = greeting
}
相關(guān)知識(shí)點(diǎn):
- 原型鏈
54. 屬性遍歷
題目描述
找出對(duì)象 obj 不在原型鏈上的屬性(注意這題測(cè)試?yán)拥拿疤?hào)后面也有一個(gè)空格~)
1掷酗、返回?cái)?shù)組,格式為 key: value
2窟哺、結(jié)果數(shù)組不要求順序
輸入var C = function() {this.foo = 'bar'; this.baz = 'bim';}; C.prototype.bop = 'bip'; iterate(new C());
輸出
["foo: bar", "baz: bim"]
// 方法一: forEach換成map更好泻轰,這里不是重點(diǎn)所以不做處理
function iterate(obj) {
let arr = []
Object.getOwnPropertyNames(obj).forEach(value => arr.push(`${value}: ${obj[value]}`))
return arr
}
相關(guān)知識(shí)點(diǎn):
- Object.getOwnPropertyNames(obj), 獲取所有的對(duì)象自身屬性
55. 判斷是否包含數(shù)字
題目描述
給定字符串 str且轨,檢查其是否包含數(shù)字浮声,包含返回 true,否則返回 false
輸入: 'abc123' ; 輸出: true
// 方法一:字符串比較ASCII碼
function containsNumber(str) {
for (let i = 0; i < str.length; i++) {
if(str[i] >= '0' && str[i] <= '9') {
return true
}
}
return false
}
// 方法二:隱式類型轉(zhuǎn)化
function containsNumber(str) {
for (let i = 0; i < str.length; i++) {
if(str[i] >= 0 || str[i] <= 9) {
return true
}
}
return false
}
// 方法三:正則
function containsNumber(str) {
return /\d/g.test(str)
}
相關(guān)知識(shí)點(diǎn):
- 字符串比較ASCII碼
字符串比較會(huì)比較他們的ASCII碼值旋奢,數(shù)字是連續(xù)的ASCII碼泳挥,0123456789分別是48-57,在這個(gè)范圍內(nèi)的就可以至朗。
- 隱式類型轉(zhuǎn)化
數(shù)字字符串和數(shù)字比較屉符,會(huì)隱式轉(zhuǎn)化成數(shù)字,字符串和數(shù)字比較,會(huì)轉(zhuǎn)化成數(shù)字NaN矗钟,和數(shù)字比較返回false唆香,所以這種方式也可以找到字符串中是否有數(shù)字。
- 正則
56. 檢查重復(fù)字符串
題目描述
給定字符串 str吨艇,檢查其是否包含連續(xù)重復(fù)的字母(a-zA-Z)躬它,包含返回 true,否則返回 false
輸入: 'rattler'
輸出: true
// 方法一:雙指針
function containsRepeatingLetter(str) {
// 如果字符串長(zhǎng)度小于2直接返回false
if(str.length < 2)return false
// 左右指針
let left = 0
let right = 1
while(str[right]) {
// 如果左右相等且都是a-z范圍的就返回true
if(str[left++] === str[right++] && str[left].toLowerCase() >= 'a' && str[left].toLowerCase() <= 'z' && str[right].toLowerCase() >= 'a' && str[right].toLowerCase() <= 'z'){
return true
}
}
// 否則返回false
return false
}
// 方法二:正則虑凛,小括號(hào)表示分組,\1表示引用第一個(gè)分組
function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str);
}
相關(guān)知識(shí)點(diǎn):
- 雙指針(算法思維)
- 正則
57. 判斷是否以元音字母結(jié)尾
題目描述
給定字符串 str软啼,檢查其是否以元音字母結(jié)尾
1桑谍、元音字母包括 a,e祸挪,i锣披,o,u贿条,以及對(duì)應(yīng)的大寫(xiě)
2雹仿、包含返回 true,否則返回 false
輸入: 'gorilla' ; 輸出: true
// 方法一:indexOf
function endsWithVowel(str) {
return ['a','e','i','o','u'].indexOf(str.slice(-1).toLowerCase()) === -1 ? false: true
}
// 方法二:includes
function endsWithVowel(str) {
return ['a','e','i','o','u'].includes(str.slice(-1).toLowerCase())
}
相關(guān)知識(shí)點(diǎn):
- 字符串方法slice整以,toLowerCase
- 數(shù)組方法indexOf胧辽,includes
58. 獲取指定字符串
題目描述
給定字符串 str,檢查其是否包含 連續(xù)3個(gè)數(shù)字
1公黑、如果包含邑商,返回最先出現(xiàn)的 3 個(gè)數(shù)字的字符串
2、如果不包含凡蚜,返回 false
輸入: '9876543'
輸出: 987
PS: 這個(gè)題我們理解的是三個(gè)連續(xù)遞增的數(shù)字人断,但是題的意思是連續(xù)的數(shù)字即可。
// 方法一:計(jì)數(shù)器
function captureThreeNumbers(str) {
let start = 0
let count = 0
for(let i = 0; i < str.length; i++) {
if (!isNaN(str[i])) {
count++
} else {
count = 0
start = i+1
}
}
return count >= 3 ? str[start]+str[start+1]+str[start+2] : false
}
// 方法二:正則 match可以得到匹配的結(jié)果
function captureThreeNumbers(str) {
let arr = str.match(/\d{3}/)
return arr ? arr[0] : false
}
如果是連續(xù)遞增的數(shù)字朝蜘,要這樣實(shí)現(xiàn):
// 方法一:雙指針
function captureThreeNumbers(str) {
let left = 0
let right = 0
while(str[right+1] !== undefined) {
// 保證右指針連續(xù)恶迈,且屬于數(shù)字,右指針往過(guò)移動(dòng)
if(Math.abs(str[right+1] - str[right]) === 1 && str[right] >=0 && str[right] <=9) {
right++
// 如果小于3谱醇,左指針就去右指針右邊
}else if(right - left + 1 < 3){
left = ++right
// 大于3直接返回
}else {
return str.substr(left,3)
}
}
// 循環(huán)結(jié)果暇仲,如果大于3就返回,否則返回false
return right - left + 1 >= 3 ? str.substr(left,3) : false
}
相關(guān)知識(shí)點(diǎn):
- 計(jì)數(shù)器
- 正則
- 雙指針(算法思維) + 判斷連續(xù)數(shù)字
59. 判斷是否符合指定格式
題目描述
給定字符串 str副渴,檢查其是否符合如下格式
1熔吗、XXX-XXX-XXXX
2、其中 X 為 Number 類型
輸入:'800-555-1212'
輸出:true
// 方法一:正則
function matchesPattern(str) {
return /^\d{3}-\d{3}-\d{4}$/.test(str)
}
相關(guān)知識(shí)點(diǎn):
- 匹配或者判斷什么格式就優(yōu)先考慮正則
60. 判斷是否符合 USD 格式
題目描述
給定字符串 str佳晶,檢查其是否符合美元書(shū)寫(xiě)格式
1桅狠、以$
開(kāi)始
2、整數(shù)部分,從個(gè)位起中跌,滿 3 個(gè)數(shù)字用 , 分隔
3咨堤、如果為小數(shù),則小數(shù)部分長(zhǎng)度為 2
4漩符、正確的格式如:$1,023,032.03
或者$2.03
一喘,
錯(cuò)誤的格式如:$3,432,12.12
或者$34,344.3
輸入:'$20,933,209.93'
輸出:true
// 方法一:正則,從左往右寫(xiě)嗜暴,依次匹配
function isUSD(str) {
return /^\$[\d]{1,3}(\,[\d]{3})*(|\.[\d]{2})$/.test(str)
}
相關(guān)知識(shí)點(diǎn):
- 正則
已經(jīng)到底拉凸克,60道題完事,恭喜你闷沥,通關(guān)啦~~~~