牛客網的45道JS能力評測題我的以爲是很是好的45道js基礎檢測題,基本就是對本身的JavaScript基礎作一個比較全面的評估,包括if語句、循環體、基礎操做符、setInterval、setTimeout、流程控制、經常使用數組方法及es6相關(解構、Map、Set、...
等)。以前我已經作過一遍了,我記得之前牛客網不支持es6的寫法,這兩天花了點時間把全部題目又作了一遍,發現支持es6了。此次每一個題目我都盡力用了不一樣的方法實現,建議各位看官收藏,須要的時候方便查看。固然若是你有更好更新穎的實現方法,歡迎評論區留言交流。前端
我也把經常使用的數組方法和字符串方法貼在這裏,能夠自測掌握程度git
第一題比較簡單,就直接上答案:es6
// 方法一
function indexOf(arr, item) { if(Array.prototype.indexOf){// 判斷瀏覽器是否支持indexOf方法 return arr.indexOf(item); }else{ for(var i=0;i<arr.length;i++){ if(arr[i]===item){ return i; } } } return -1; } // 方法二 function indexOf(arr, item) { if(Array.prototype.indexOf){// 判斷瀏覽器是否支持indexOf方法 return arr.indexOf(item); } else if (arr.indexOf(item) > 0) { return arr.indexOf(item) }else{ return -1 } } 複製代碼
這裏順便說一下Array.prototype.indexOf
github
indexOf()
方法返回在數組中能夠找到一個給定元素的第一個索引,若是不存在,則返回-1。web
語法:正則表達式
arr.indexOf(searchElement) //查找searchElement元素在數組中的第一個位置 arr.indexOf(searchElement[, fromIndex = 0]) //從fromIndex開始查找searchElement元素在數組中的第一個位置 複製代碼
還有另一個查找字符串的方法String.prototype.indexOf()
數組
str.indexOf(searchValue[, fromIndex])
複製代碼
具體能夠看看MDN瀏覽器
方法一:普通的for循環拷貝+push閉包
function append(arr, item) {
let resArr = [] for(let i = 0;i<arr.length;i++){ resArr.push(arr[i]) } resArr.push(item) return resArr } 複製代碼
方法二:使用concat將傳入的數組或非數組值與原數組合並,組成一個新的數組並返回app
function append(arr, item) {
return arr.concat(item); } 複製代碼
方法三:使用slice淺拷貝+push
function append(arr, item) {
let newArr = arr.slice(0); // slice(start, end)淺拷貝數組 newArr.push(item); return newArr; } 複製代碼
方法四:...
擴展運算符 若是不知道的,能夠看看es6的相關知識
function append(arr, item) {
let resArr = [...arr,item] return resArr } 複製代碼
這裏須要注意理解題目,是直接操做原數組,因此不能出現newArr
方法一:普通for循環+splice
function removeWithoutCopy(arr, item) {
for(let i=arr.length;i>=0;i--){ if(arr[i]==item){ arr.splice(i,1); } } return arr; } 複製代碼
方法二:方法一的另一種寫法
在這裏要注意在刪除掉一個元素時,要 i–,即刪除這個元素後,其餘元素位置往前移。
function removeWithoutCopy(arr, item) {
for(let i = 0; i< arr.length; i++) { if(arr[i]===item) { arr.splice(i,1); i--; } } return arr; } 複製代碼
把第3題稍微變一下,看下一題
方法一:filter過濾
function remove(arr, item) {
return arr.filter(res =>{ return res != item; }) } 複製代碼
方法二:for循環+push
function remove(arr, item) {
let resArr = [] for(let i = 0;i<arr.length;i++){ if(arr[i]!== item){ resArr.push(arr[i]) } } return resArr } 複製代碼
方法三:forEach+push(效率高於for循環)
function remove(arr, item) {
let resArr=[]; arr.forEach(v=>{ if(v!==item){ resArr.push(v); } }) return resArr; } 複製代碼
方法四:for循環+splice
function remove(arr,item){
let resArr= arr.slice(0); for(let i=0;i<resArr.length;i++){ if(resArr[i] == item){ resArr.splice(i,1); i--; } } return resArr; } 複製代碼
方法一:普通for循環
function sum(arr) {
let res = 0 for(let i=0;i<=arr.length;i++){ res +=arr[i] } return res } 複製代碼
方法二:forEach循環
function sum(arr) {
let res = 0 arr.forEach((value,index,array)=>{ array[index] == value; //結果爲true res+=value; }); return res; }; 複製代碼
方法三:reduce
reduce() 方法接收一個函數做爲累加器,數組中的每一個值(從左到右)開始縮減,最終計算爲一個值,具體能夠看看es6相關知識。
function sum(arr) {
return arr.reduce((pre,cur)=>{ return pre+cur; }) } 複製代碼
方法四:eval
eval() 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。
function sum(arr) {
return eval(arr.join("+")); } 複製代碼
方法一:slice
function truncate(arr) {
return arr.slice(0,arr.length-1) } 複製代碼
方法二:concat/slice+pop
function truncate(arr) {
let resArr = arr.concat() // let resArr = arr.slice(0) resArr.pop() return resArr } 複製代碼
concat/slice/arr.join().split(',')+unshift
function prepend(arr, item) {
// let resArr = arr.slice(0); // let resArr = arr.concat() let resArr = arr.join().split(',') resArr.unshift(item); return resArr; } 複製代碼
與第7題大同小異,玩不出太多花樣,如你有其餘好玩的方法,歡迎留言
function curtail(arr) {
let resArr = arr.slice(0) resArr.shift() return resArr } 複製代碼
方法不少,歡迎大佬們留言評論
方法一:concat
function concat(arr1, arr2) {
let resArr = arr1.concat(arr2) return resArr } 複製代碼
方法二:...
擴展運算符
function concat(arr1, arr2) {
let resArr = [...arr1,...arr2] return resArr } 複製代碼
方法三:slice+push.apply
function concat(arr1, arr2) {
let resArr = arr1.slice(0); [].push.apply(resArr,arr2); return resArr; } 複製代碼
方法一:先複製前0~index個元素,將item元素插入以後,再拼接index以後的元素
function insert(arr, item, index) {
let resArr = arr.slice(0,index) resArr.push(item) resArr = resArr.concat(arr.slice(index)) return resArr } 複製代碼
方法二:使用splice方法插入(效率較高)
function insert(arr, item, index) {
let resArr = arr.slice(0);// resArr.splice(index,0,item); return resArr; } 複製代碼
方法三:push.apply+splice
function insert(arr, item, index) {
let resArr=[]; [].push.apply(resArr, arr); resArr.splice(index,0,item); return resArr; } 複製代碼
方法一:普通for循環
function count(arr, item) {
let reSCount = 0 for(let i = 0;i<=arr.length;i++){ if(arr[i] === item){ reSCount++ } } return reSCount } 複製代碼
方法二:forEach
function count(arr, item) {
let resCount=0; arr.forEach(v => { if(v==item){ resCount++; } }); return resCount; } 複製代碼
方法三:filter
function count(arr, item) {
let res = arr.filter(v => { return v === item }); return res.length; } 複製代碼
方法四:map(效率高於filter)
function count(arr, item) {
let resCount = 0 arr.map(v => { if(v === item){ resCount++ } }); return resCount; } 複製代碼
map函數和filter有點像,可是map是對數組中的全部元素進行復核函數條件的處理,最終獲得的是一個新數組,元素個數不變。
filter函數雖然也是返回一個新數組,可是元素的個數等於複覈函數條件的元素總和。
方法五:reduce
function count(arr, item) {
let res = arr.reduce( (init,curr)=> { //若是當前置等於item,該函數值加一 return curr === item ? init+1:init; },0) return res; } 複製代碼
方法一:for/for in/+sort 先進行排序,而後判斷排序以後的前一個數據是否等於後一個數據,若是是且結果數組沒有這個元素
//for 運行時間:1596ms 佔用內存:77772k
function duplicates(arr) { let resArr = []; arr.sort(); for(let i=0;i<arr.length;i++){ if(arr[i]==arr[i-1] && resArr.indexOf(arr[i])==-1){ resArr.push(arr[i]); } } return resArr; } //for in 運行時間:1132ms佔用內存:77868k function duplicates(arr) { let resArr = []; arr.sort(); for(i in arr){ if(arr[i]==arr[i-1] && resArr.indexOf(arr[i])==-1){ resArr.push(arr[i]); } } return resArr; } 複製代碼
方法二:forEach 利用索引判斷是否重複(使用了兩次)
// 運行時間:1184ms 佔用內存:77772k
function duplicates(arr) { var resArr=[]; arr.forEach(v => { //判斷原數組是否有重複數據 //判斷結果數組是否已經具備該數據 if(arr.indexOf(v) !=arr.lastIndexOf(v) && resArr.indexOf(v) == -1){ resArr.push(v); } }); return resArr; } 複製代碼
方法三:reduce 先判斷數組中元素出現的次數,若是大於1而且結果數組以前無此元素,則將這個元素放到結果數組中
// 運行時間:1129ms 佔用內存:77776k
function duplicates(arr) { let b = []; let resArr = []; for (let i= 0; i<arr.length; i++){ b[i] = arr.reduce( (init,curr)=> { //若是當前置等於item,該函數值加一 return curr === arr[i] ? init+1:init; },0) if (b[i] > 1 && resArr.indexOf(arr[i]) === -1){ resArr.push(arr[i]); } } return resArr; } 複製代碼
方法一:for/forEach
// 運行時間:1466ms 佔用內存:77772k
function square(arr) { var res = []; for(var i in arr){ res.push(arr[i]*arr[i]); } return res; } // forEach 運行時間:1130ms 佔用內存:77772k function square(arr) { var resArr = []; arr.forEach((e)=>{ resArr.push(e*e); }); return resArr; } 複製代碼
方法二:map
// 運行時間:1433ms 佔用內存:78004k
function square(arr) { //let resArr = arr.slice(0); let resArr = arr.map((e,index,array)=>{ return e*e; }); return resArr; } 複製代碼
方法一:for
//運行時間:1139ms 佔用內存:77772k
function findAllOccurrences(arr, target) { let resArr = []; for(let i=0;i < arr.length;i++){ if(arr[i] === target){ resArr.push(i); } } return resArr; } 複製代碼
方法二:forEach
// 運行時間:1135ms 佔用內存:77776k
function findAllOccurrences(arr, target) { let resArr = []; arr.forEach((v,index)=>{ if(v === target){ resArr.push(index) } }) return resArr; } 複製代碼
原代碼:
function globals() {
myObject = { name : 'Jory' }; return myObject; } 複製代碼
修復:
function globals() {
let myObject = { name : 'Jory' }; return myObject; } 複製代碼
原代碼:
function functions(flag) {
if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } } return getValue(); } 複製代碼
修復:else中的語句至關於將if中的function重寫,所以不管flag爲什麼值,返回的方法始終爲重寫後的方法。將方法賦值給一個變量,方法就不會被重寫,所以才能獲得正確的結果。而且只能用var聲明。
function functions(flag) {
if (flag) { var getValue = function () { return 'a'; } } else { var getValue = function () { return 'b'; } } return getValue(); } 複製代碼
原代碼:
function parse2Int(num) {
return parseInt(num); } 複製代碼
修復:parseInt(string, radix) 函數可解析一個字符串,並返回一個整數。參數 radix 表示要解析的數字的基數。該值介於 2 ~ 36 之間。 若是省略該參數或其值爲 0,parseInt() 會根據 string 來判斷數字的基數。 舉例,若是 string 以 「0x」 開頭,parseInt() 會把 string 的其他部分解析爲十六進制的整數。若是 string 以 0 開頭,那麼 ECMAScript v3 容許 parseInt() 的一個實現把其後的字符解析爲八進制或十六進制的數字。若是 string 以 1 ~ 9 的數字開頭,parseInt() 將把它解析爲十進制的整數。 而本題則是要求解析爲十進制的整數。
function parse2Int(num) {
return parseInt(num,10); } 複製代碼
注意:
1.只有字符串中的第一個數字會被返回。
2.若是字符串的第一個字符不能被轉換爲數字,那麼 parseFloat() 會返回 NaN。 3.若是參數 radix 小於 2 或者大於 36,則 parseInt() 將返回 NaN。
function identity(val1, val2) {
if(val1===val2) { return true; } else{ return false; } } 複製代碼
function count(start, end) {
//當即輸出第一個值 console.log(start++); var timer = setInterval( function() { if(start <= end){ console.log(start++); }else{ clearInterval(timer); } },100); //返回一個對象 return { cancel : function() { clearInterval(timer); } }; } 複製代碼
setInterval(code,millisec) 方法可按照指定的週期(以毫秒計)來調用函數或計算表達式。
code 是要調用的函數或要執行的代碼串,millisec 是週期性執行或調用 code 之間的時間間隔,以毫秒計。
setInterval() 方法會不停地調用 code 函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用做 clearInterval() 方法的參數。 clearInterval() 方法可取消由 setInterval() 設置的 timeout,其中的參數必須是由 setInterval() 返回的 ID 值。
function fizzBuzz(num) {
if(num%3==0 && num%5==0){ return 'fizzbuzz'; } else if(num%3==0){ return 'fizz'; } else if(num%5==0){ return 'buzz'; } else if(num==null || typeof num != 'number'){ return false; } else{ return num } } 複製代碼
方法一:apply/call
function argsAsArray(fn, arr) {
return fn(arr[0],arr[1],arr[2]); } 用apply function argsAsArray(fn, arr) { return fn.apply(fn, arr); } //或者 function argsAsArray(fn, arr) { return fn.apply(this, arr); } 用call function argsAsArray(fn, arr) { return fn.call(fn, arr[0],arr[1],arr[2]); } //或者 function argsAsArray(fn, arr) { return fn.call(this, arr[0],arr[1],arr[2]); } 複製代碼
function.apply(newObj[, argsArray]) 方法能夠修改指定函數的調用對象。function 是調用對象將被修改的函數,newObj 是函數的新調用對象,argsArray 是傳遞給function函數的參數,數組或者arguments對象。
apply 方法是將傳遞給函數的參數放入一個數組中,傳入參數數組便可。
function.call(newObj[, arg1[, arg2[, [,…argN]]]]) 方法的做用和 apply() 方法相似,只有一個區別,就是 call() 方法接受的是若干個參數的列表,而 apply() 方法接受的是一個包含多個參數的數組。
方法二:...
擴展運算符
function argsAsArray(fn, arr) {
return fn(...arr); } 複製代碼
這個題目考察的是改變this指向
//apply
function speak(fn, obj) { return fn.apply(obj); } //call function speak(fn, obj) { return fn.call(obj); } //bind function speak(fn, obj) { return fn.bind(obj)(); } 複製代碼
function functionFunction(str) {
return f = function (obj) { return str + ', ' + obj; } } 複製代碼
function makeClosures(arr, fn) {
let result = []; for (let i of arr) { result.push(()=>{ return fn(i) }); } return result; } // 也能夠換成forEach 複製代碼
由於沒有要求函數內部this指向和做用域,因此能夠不用 call 和 apply 方法。
function partial(fn, str1, str2) {
return result = function (str3) { return fn(str1, str2, str3) }; } 複製代碼
方法一:eval
function useArguments() {
let arr=Array.prototype.slice.call(arguments)//把arguments類數組轉化爲數組 return eval(arr.join("+"));//求和 } 複製代碼
方法二:reduce+call組合
function useArguments() {
let result = Array.prototype.reduce.call(arguments,function(a,b){return a+b;}); return result; } 複製代碼
21題已經講過,再也不贅述
function callIt(fn) {
return fn.apply(this, [].slice.call(arguments, 1)) } 複製代碼
注意與25題的要求區別。入門級別,很少說,是我的都會
function partialUsingArguments(fn) {
//先獲取p函數第一個參數以後的所有參數 var args = [].slice.call(arguments,1); //聲明result函數 return result = function(){ //使用concat合併兩個或多個數組中的元素 return fn.apply(this, args.concat( [].slice.call(arguments) )); }; } 複製代碼
柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。
function curryIt(fn) {
var args = []; var result = function(arg){ args.push(arg); if(args.length < fn.length){ return result; }else return fn.apply(this,args); } return result; } 複製代碼
function or(a, b) {
return (a || b); } 複製代碼
function and(a, b) {
return (a && b); } 複製代碼
function createModule(str1, str2) {
let obj = { greeting: str1, name: str2, sayIt: function(){ return obj.greeting+", "+obj.name; } }; return obj; } 複製代碼
function valueAtBit(num, bit) {
let res = num.toString(2); return sre[res.length - bit]; } 複製代碼
NumberObject.toString(radix) 方法可把一個 Number 對象轉換爲一個字符串,並返回數字的字符串表示。radix 表示數字的基數,爲 2 ~ 36 之間的整數。若省略該參數,則默認使用基數 10。例如,當 radix 爲 2 時,NumberObject 會被轉換爲二進制值表示的字符串。
當調用該方法的對象不是 Number 時拋出 TypeError 異常。
複製代碼
經過num.toString(2)能直接將num轉換爲2進制數格式的字符串,利用下標就能將對應值取出來。題目返回的數字是從右往左,所以下標爲倒數。
function base10(str) {
return parseInt(str,2); } 複製代碼
function convertToBinary(num) {
let res = num.toString(2); while(res.length<8){ res = '0'+res; } return res; } 複製代碼
本題要注意題目要求,咱們須要考慮精度,且保證以小數點後位數多的爲準。如下寫法是不能經過的
// 這種寫法是通不過的
function multiply(a, b) { return a*b; } 複製代碼
正解:
function multiply(a, b) {
// 先將數字轉換爲字符串 let str1 = a.toString(); let str2 = b.toString(); // 獲取兩個數的小數位數 let lenA = (str1.indexOf('.')==-1)?0:(str1.length-str1.indexOf(".")-1); let lenB = (str2.indexOf('.')==-1)?0:(str2.length-str2.indexOf(".")-1); // 比較兩數的精度/位數,精度大的做爲結果數精度 let len = Math.max(lenA,lenB); // 運算結果 let result = parseFloat(a*b).toFixed(len); return result } 複製代碼
toFixed()
方法可把 Number 四捨五入爲指定小數位數的數字; 參數num: 表明小數位數;
let num = 5.56789; num.toFixed(2); ==>5.57
複製代碼
parseFloat()
函數可解析一個字符串,並返回一個浮點數;參數 string 可爲數字可爲字符串,當參數爲字符串時,判斷個字符是不是數字,若是是,則對字符串進行解析,直到到達數字的末端爲止,而後以數字返回該數字,若是不是,返回NAN;
parseFloat("43ar4s2");==>43
parseFloat("qwar4s2");==>NAN 複製代碼
前面有講過,再也不贅述
function alterContext(fn, obj) {
//return fn.call(obj); //return fn.apply(obj); return fn.bind(obj)(); } 複製代碼
function alterObjects(constructor, greeting) {
constructor.prototype.greeting = greeting; } 複製代碼
prototype 屬性能夠向對象添加屬性和方法。 這是原型鏈的知識:當查找一個對象的方法或者是屬性時,首先會在該對象中尋找,若是找到則返回若是實例對象自身不存在該屬性,則沿着原型鏈往上一級查找,找到時則輸出,不存在時,則繼續沿着原型鏈往上一級查找,直至最頂級的原型對象Object.prototype,如仍是沒找到,則返回undefined
將 constructor 的全部實例的 greeting 屬性指向給定的 greeting 變量,只須要在constructor的原型上面添加greeting屬性,並指定值。 關於原型鏈能夠看看我以前的文章:「前端料包」深刻理解JavaScript原型和原型鏈
方法不少凡有遍歷功能的方法均可以
方法一:for in 循環
//運行時間:1148ms 佔用內存:77864k
function iterate(obj) { let result = []; for(let key in obj){ if(obj.hasOwnProperty(key)){ result.push(key+': '+obj[key]);//使用obj.key部分代碼不能經過 } } return result; } 複製代碼
全部繼承了 Object 的對象都會繼承到 hasOwnProperty()
方法。obj.hasOwnProperty(prop)
方法會返回一個布爾值,指示對象 obj 自身屬性中是否具備指定的屬性 prop 。這個方法能夠用來檢測一個對象是否含有特定的自身屬性,並忽略掉那些從原型鏈上繼承到的屬性。
方法二:map
//運行時間:1133ms 佔用內存:77828k
function iterate(obj) { return Object.getOwnPropertyNames(obj).map(key=>{ return key+": "+obj[key]; }); } 複製代碼
Object.getOwnPropertyNames()
方法返回一個由指定對象的全部自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值做爲名稱的屬性)組成的數組。 方法三:forEach
//運行時間:1173m 佔用內存:77872k
function iterate(obj) { let arr=Object.keys(obj); let resArr=[]; arr.forEach(item=>{ resArr.push(item+': '+obj[item]) }) return resArr } 複製代碼
最後5題大部分能夠用正則表達式實現,關於正則表達式能夠看看正則表達式不要背
方法一:正則test/match
function containsNumber(str) {
// return /\d/.test(str); return !!str.match(/\d/g); } 複製代碼
方法二:遍歷
function containsNumber(str) {
for(let i=0;i<10;i++){ if(str.indexOf(i)!=-1){ return true; } } return false; } 複製代碼
固然若是想折騰,還有純js判斷:
方法三:for循環+charCodeAt()
function containsNumber(str) {
let res = str.split('') for(let i = 0;i<res.length; i++){ let temp = res[i].charCodeAt(); if(temp>=48 &&temp<=57){ return true } } return false } 複製代碼
方法四:for循環+Number()
function containsNumber(str) {
let res = str.split('') for(let i = 0;i<res.length; i++){ let temp = Number(res[i]); if(temp){ return true } } return false } 複製代碼
function containsRepeatingLetter(str) {
return /([a-zA-Z])\1/.test(str); } 複製代碼
在正則表達式中,利用()進行分組,使用斜槓加數字表示引用,\1就是引用第一個分組,\2就是引用第二個分組。將[a-zA-Z]作爲一個分組,而後引用,就能夠判斷是否有連續重複的字母。
方法二:字符串方法
function containsRepeatingLetter(str) {
let reg = /[a-zA-Z]/; for(let i = 0;i < str.length;i++){ if(str.charAt(i)==str.charAt(i+1)&®.test(str[i])){ return true; } } return false; } 複製代碼
首先肯定元音集合[a,e,i,o,u]
,而後是以元音結尾,加上 $ ,最後通配大小寫,加上i。
function endsWithVowel(str) {
return /[a,e,i,o,u]$/i.test(str); //或者 // return /(a|o|e|i|u)$/gi.test(str); } 複製代碼
或者簡單粗暴:
function endsWithVowel(str) {
return str && ("aeiouAEIOU".indexOf(str[str.length-1]) > -1); } 複製代碼
function captureThreeNumbers(str) {
//聲明一個數組保存匹配的字符串結果 let arr = str.match(/\d{3}/); //若是arr存在目標結果,則返回第一個元素,即最先出現的目標結果 if(arr){ return arr[0]; } else{ return false; } } 複製代碼
function matchesPattern(str) {
return/^\d{3}-\d{3}-\d{4}$/.test(str); } 複製代碼
本題須要注意格式,開頭 ^ 和結尾 $ 必須加上來限定字符串,3個數可表示爲\d{3},4個數則爲\d{4},{n}表示前面內容出現的次數。正則表達式可寫做 /^ \d{3}-\d{3}-\d{4}$ / ,有相同部分\d{3}-,所以也可寫做 /^(\d{3}-){2}\d{4}$/ 。
複製代碼
function isUSD(str) {
return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str); } 複製代碼
? 匹配前面一個表達式0次或者1次。等價於 {0,1}。
例如,/e?le?/ 匹配 'angel' 中的 'el',和 'angle' 中的 'le' (注意第二個 ? 前面的匹配表達式是 e 而不是 le) 以及 'oslo' 中的'l'。 若是緊跟在任何量詞 *、 +、? 或 {} 的後面,將會使量詞變爲非貪婪的(匹配儘可能少的字符),和缺省 使用的貪婪模式(匹配儘量多的字符)正好相反。 例如,對 "123abc" 應用 /\d+/ 將會返回 "123",若是使用 /\d+?/,那麼就只會匹配到 "1"。 還能夠運用於向前斷言 正向確定查找x(?=y) 和 正向否認查找x(?!y) 。 * 匹配前一個表達式0次或屢次。等價於 {0,}。 例如,/bo*/會匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b', 可是在 "A goat grunted" 中將不會匹配任何東西。 . (小數點)匹配 除了換行符(\n)以外的任何單個字符。 例如, /.n/將會匹配"nay, an apple is on the tree"中的'an'和'on', 可是不會匹配 'nay'。 複製代碼
點擊——>收藏——>退出
一鼓作氣,但別忘了點贊🤭