引言javascript
牛客網這個前端筆試題庫,能夠說這60道是最基礎的了,也是考察的東西比較雜,有時間4天差很少就能夠刷完,鞏固基礎仍是有些用的。作完題回顧一上午就能夠過完一遍。如今我結合個人答案和參考的其餘人的答案,在這裏作一個總結,也是本身知識的整理結果。前端
題目描述
求 a 和 b 相乘的值,a 和 b 多是小數,須要注意結果的精度問題
輸入:3, 0.0001
輸出:0.0003java
// 方法一:肯定小數的位數而後保證精度是多少位
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)
}
// 方法二:本身寫的
function multiply(a, b) {
let arrA = a.toString().split('.')
let arrB = b.toString().split('.')
let count = 0
// 第一個有小數位
if(arrA[1]) {
count+=arrA.length
a = a * Math.pow(10,arrA.length)
}
// 第二個數有小數位
if(arrB[1]) {
count+=arrB.length
b = b * Math.pow(10,arrB.length)
}
return a * b * Math.pow(10, -count)
}
複製代碼
相關知識點:算法
javascript的數值存儲是雙精度浮點數64位,根據IEEE 754標準,0-51爲值,52-62位指數,63位是符號位。
二進制浮點數表示法對0.1這樣的有偏差。
解決方法就是先升冪再降冪。數組
題目描述
將函數 fn 的執行上下文改成 obj,返回 fn 執行後的值
輸入:alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })
輸出:Yo, Rebecca!markdown
// 方法一: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)()
}
複製代碼
相關知識點:app
題目描述
給定一個構造函數 constructor,請完成 alterObjects 方法,將 constructor 的全部實例的 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 upoop
// 方法一:原型對象上添加屬性
function alterObjects(constructor, greeting) {
constructor.prototype.greeting = greeting
}
複製代碼
相關知識點:post
題目描述
找出對象 obj 不在原型鏈上的屬性(注意這題測試例子的冒號後面也有一個空格~)
一、返回數組,格式爲 key: value
二、結果數組不要求順序
輸入var C = function() {this.foo = 'bar'; this.baz = 'bim';}; C.prototype.bop = 'bip'; iterate(new C()); 複製代碼
輸出
["foo: bar", "baz: bim"]
// 方法一: forEach換成map更好,這裏不是重點因此不作處理
function iterate(obj) {
let arr = []
Object.getOwnPropertyNames(obj).forEach(value => arr.push(`${value}: ${obj[value]}`))
return arr
}
複製代碼
相關知識點:
題目描述
給定字符串 str,檢查其是否包含數字,包含返回 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
}
// 方法二:隱式類型轉化
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)
}
複製代碼
相關知識點:
字符串比較會比較他們的ASCII碼值,數字是連續的ASCII碼,0123456789分別是48-57,在這個範圍內的就能夠。
數字字符串和數字比較,會隱式轉化成數字,字符串和數字比較,會轉化成數字NaN,和數字比較返回false,因此這種方式也能夠找到字符串中是否有數字。
題目描述
給定字符串 str,檢查其是否包含連續重複的字母(a-zA-Z),包含返回 true,不然返回 false
輸入: 'rattler'
輸出: true
// 方法一:雙指針
function containsRepeatingLetter(str) {
// 若是字符串長度小於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
}
// 方法二:正則,小括號表示分組,\1表示引用第一個分組
function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str);
}
複製代碼
相關知識點:
題目描述
給定字符串 str,檢查其是否以元音字母結尾
一、元音字母包括 a,e,i,o,u,以及對應的大寫
二、包含返回 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())
}
複製代碼
相關知識點:
題目描述
給定字符串 str,檢查其是否包含 連續3個數字
一、若是包含,返回最早出現的 3 個數字的字符串
二、若是不包含,返回 false
輸入: '9876543'
輸出: 987
PS: 這個題咱們理解的是三個連續遞增的數字,可是題的意思是連續的數字便可。
// 方法一:計數器
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能夠獲得匹配的結果
function captureThreeNumbers(str) {
let arr = str.match(/\d{3}/)
return arr ? arr[0] : false
}
複製代碼
若是是連續遞增的數字,要這樣實現:
// 方法一:雙指針
function captureThreeNumbers(str) {
let left = 0
let right = 0
while(str[right+1] !== undefined) {
// 保證右指針連續,且屬於數字,右指針往過移動
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)
}
}
// 循環結果,若是大於3就返回,不然返回false
return right - left + 1 >= 3 ? str.substr(left,3) : false
}
複製代碼
相關知識點:
題目描述
給定字符串 str,檢查其是否符合以下格式
一、XXX-XXX-XXXX
二、其中 X 爲 Number 類型
輸入:'800-555-1212'
輸出:true
// 方法一:正則
function matchesPattern(str) {
return /^\d{3}-\d{3}-\d{4}$/.test(str)
}
複製代碼
相關知識點:
題目描述
給定字符串 str,檢查其是否符合美圓書寫格式
一、以$
開始
二、整數部分,從個位起,滿 3 個數字用 , 分隔
三、若是爲小數,則小數部分長度爲 2
四、正確的格式如:$1,023,032.03
或者$2.03
,
錯誤的格式如:$3,432,12.12
或者$34,344.3
輸入:'$20,933,209.93'
輸出:true
// 方法一:正則,從左往右寫,依次匹配
function isUSD(str) {
return /^\$[\d]{1,3}(\,[\d]{3})*(|\.[\d]{2})$/.test(str)
}
複製代碼
相關知識點:
已經到底拉,60道題完事,恭喜你,通關啦~~~~