方案一:javascript
function fn(n){ var num1 = 1, num2= 1, num3 = 0; for(var i=0;i<n-2;i++){ num3 = num1+num2; num1 = num2; num2 = num3; } return num3; } console.log(fn(7)) //13
方案二:java
function fn(n){ if(n<=2){ return 1; } return fn(n-1)+fn(n-2); } console.log(fn(7)) //13
實現:
a、雙重for循環 b、指定比較的輪數和每輪比較的次數 c、若是符合條件就交換位置
流程:
a、比較相鄰的元素,若是第一個比第二個大,就交換他們兩個的位置。從開始第一對比較到最後一對,最後的元素是最大的元素。
b、從頭至尾再比較一次,每進行一輪最後的都是最大的了,所以後一輪比前一輪少一次比較。算法
function maopao(arr){ var temp=0; for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } var s=[15,32,12,5,7,6]; var result=maopao(s); console.log(result);
//雙重for循環實現 function insertSort(arr){ var temp = 0; for(var i=1;i<arr.length;i++){ var temp = arr[i]; for(var j=i-1;j>=0;j--){ if(arr[j]>temp){ arr[j+1]=arr[j]; }else{ break; } } arr[j+1]=temp; } return arr; } //for+while實現 function insertSort2(arr){ var temp = 0; for(var i=1;i<arr.length;i++){ var temp = arr[i]; var j = i-1; while(j>=0 && arr[j]>temp){ arr[j+1]=arr[j]; j--; } arr[j+1]=temp; } return arr; } var arr = [32,6,12,9,23,5,8,1,23]; var arr2 = [32,6,12,9,23,5,8,1,23]; console.log('for:'+insertSort(arr)); console.log('while:'+insertSort2(arr2));
二分查找的前提是有序數組
實現:將要查找的值每次與中間值比較,大於中間值,則在右邊進行相同的查找,小於中間值則在左邊進行比較查找,找到返回索引值,沒找到返回-1。數組
function binarySearch(target,arr){ var start = 0; var end = arr.length-1; while(start <= end){ var mid = parseInt((start+end)/2); if(target == arr[mid]){ return mid }else if(target > arr[mid]){ start = mid + 1; }else if(target < arr[mid]){ end = mid - 1; }else{ return -1; } } } var arr = [1,2,4,6,8,9,11,34,67]; console.log(binarySearch(11,arr));
function binarySearch(arr,target,start,end){ var start = start || 0; var end = end || arr.length-1; var mid = parseInt((start+end)/2); if(target == arr[mid]){ return mid }else if(target > arr[mid]){ start = mid + 1; return binarySearch(arr,target,start,end); }else if(target < arr[mid]){ end = mid - 1; return binarySearch(arr,target,start,end); }else{ return -1; } } var arr = [1,2,4,6,8,9,11,34,67]; console.log(binarySearch(arr,11));
方案一:函數
function fn(arr){ var obj = {}; var newArr = []; for(var i=0;i<arr.length;i++){ if(!obj[arr[i]]){ obj[arr[i]] = 1; newArr.push(arr[i]); } } return newArr; } var arr = [2,4,7,3,5,2,8,7]; console.log(fn(arr));
方案二:測試
var arr = [2,4,7,3,5,2,8,7]; var setArr = new Set(arr); var newArr = Array.from(setArr); console.log(newArr);
方案三:this
var arr =[1,2,2,4,5,4,11,6]; function fn(arr){ var a=arr; for(var i=0;i<a.length;i++){ for(var j=a.length-1;j>i;j--){ if(a[i]==a[j]){ a.splice(j,1); } } } return a; } var s=fn(arr); console.log(s);
var arr = [10,23,45,70,10]; var num1 =0; //方案一 arr.forEach((item)=>{ num1 += item; }) console.log(num1); //方案二 var num2 =0; arr.some((item)=>{ num2 += item; }) console.log(num2); //方案三 var num3 =0; arr.filter((item)=>{ num3 += item; }) console.log(num3); //方案四 var num4 =0; arr.map((item)=>{ num4 += item; }) console.log(num4); //方案五 var num5 =0; num5 = arr.reduce((num,now)=>{ return num+now; }) console.log(num5);
A. if('21'<'15'){alert(1)} B. if(15-15){alert(1)} C. if('21'<15){alert(1)} D. if('5'+0){alert(1)}
選D,解析:
1)'21'<'15' 字符串之間的比較,是按照從左到右的順序,逐位進行比較,按照unicode碼的大小
charCodeAt(index)用於獲取指定索引值位置的unicode
2)'5'+0 =》 '50' => true
+做用: 字符串拼接:左右兩側只要有一側是字符串,那麼就是字符串拼接prototype
var i=0,j=0;
for(;j<6,i<10;i++,j++){
k = i+j;
}
console.log(k);//18
解析:
逗號運算符,返回最後一位code
console.log((!+[]+[]+!+[]).length); //8
解析:
(!+[]+[]+!+[]) //truetrue
首先是這裏的第一個加號表明的是正號
!+[] 結果爲布爾值true
!+[]+[]結果爲字符串trueblog
console.log(2000['toString']['length']); //1
解析:
2000['toString']返回一個函數,function.length這裏返回函數的參數個數。
var f = function g(){return 23;};
console.log(typeof g()); // g is not defined
解析:
外部訪問不到g()函數
方法一:
function change(str){ var s1 = str.split(""); for(var i=0;i<s1.length;i++){ if(s1[i] == '-'){ s1[i+1] = s1[i+1].toUpperCase(); } } return s1.join("").replace(/-/g,''); } var str = "border-bottom-color"; console.log(change(str));
方法二:
function change(str){ var s1 = str.split("-"); for(var i=1;i<s1.length;i++){ s1[i] = s1[i].charAt(0).toUpperCase() + s1[i].substring(1); } return s1.join(""); } var str = "border-bottom-color"; console.log(change(str));
方法三:
function change(str){ var reg = /-(\w)/g; return str.replace(reg,function(s1,s2){ return s2.toUpperCase(); }) } var str = "border-bottom-color"; console.log(change(str));
方法一:
function query(str){ var obj = {}; var s1 = str.split(""); for(var i=0;i<s1.length;i++ ){ if(!obj[s1[i]]){ obj[s1[i]] = 1; }else{ obj[s1[i]]++; } } var maxChar = ''; var maxNum = 0; for(var key in obj){ if(obj[key]>maxNum){ maxNum = obj[key]; maxChar = key; } } console.log(maxChar,maxNum); } var str = "sdfejdmdjskijfdheeehehehsss"; query(str);
方法二:
function query(str){ var obj = {}; var num = 0; var value = 0; for(var i=0;i<str.length;i++){ if(!obj[str[i]]){ obj[str[i]] = []; } obj[str[i]].push(str[i]); } for(var attr in obj){ if(num < obj[attr].length){ num = obj[attr].length; value = obj[attr][0]; } } console.log(value,num); } var str = "sdfejdmdjskijfdheeehehehsss"; query(str);
方法三:
function query(str){ var arr = str.split(""); arr.sort(); str = arr.join(""); var num = 0; var value = ''; var re = /(\w)\1+/g; str.replace(re,function(param1,param2){ if(num<param1.length){ num = param1.length; value = param2; } }); console.log(value,num); } var str = "sdfejdmdjskijfdheeehehehsss"; query(str);
方案一:
function fn(str){ var arr = []; var num = str.length%3; if(num){ arr.push(str.slice(0,num)); str = str.substring(num); } var count = 0; var temp = ''; for(var i=0;i<str.length;i++){ count++; temp += str[i]; if(count ==3 && temp){ arr.push(temp); temp = ''; count = 0; } } var newStr = arr.join(','); console.log(newStr); } var str = '3323245678651456'; fn(str);
方案二:
function fn(str){ var arr = []; var num = str.length%3; if(num){ arr.push(str.slice(0,num)); } var count = 3; for(var i = num;i<str.length;i++){ count --; if(count == 2){ arr.push(str.slice(i,i+3)); }else if(count == 0){ count = 3; } } var newStr = arr.join(','); console.log(newStr); } var str = '3323245678651456'; fn(str);
方案三:
function fn(str){ // ?1\b表明不屬於獨立部分,開始、結束、有空格 var re = /(?=(?!\b)(\d{3})+$)/g; console.log(str.replace(re,',')); } var str = '3323245678651456'; fn(str);
方案一:
function fn(str){ var arr = []; var temp = ''; for(var i=0;i<str.length;i++){ if(!isNaN(str[i])){ temp += str[i]; } if(isNaN(str[i]) || (i== str.length-1 && !isNaN(str[i]))){ if(temp){ arr.push(temp); temp = ''; } } } console.log(arr); } var str = 'js123ldka78sdassdfd653ssss3'; fn(str);
方案二:
function fn(str){ var re = /[0-9]+/g; var arr = []; str.replace(re,function($0,$1){ arr.push($0); }); console.log(arr); } var str = 'js123ldka78sdassdfd653ssss3'; fn(str);
方案一:
var a = 10,var b = 20; [a,b] = [b,a]; console.log(a,b);
方案二:
var a = 10,b = 20; a = [b,b=a][0]; console.log(a,b);
解析:
b=a 是賦值表達式、能夠像普通的表達式同樣用於任何表達式中,也包括在數組中使用。
a=[b,b=a][0]的執行順序是:
第一步把b的值放入數組的0下標中;
第二步執行b=a賦值表達式,對b從新賦值,並把這個值放入數組的1下標,這個數組的1下標是沒有用的,b=a寫這裏是爲了讓它在第三步以前執行。
第三步把數組的0下標賦值給a。
function fn(n){ var arr = []; return (function(){ arr.unshift(n); n--; if(n!=0){ arguments.callee(n); } return arr; })(); } console.log(fn(5));
方案一:
function fn(n){ return n<100?n:100; } console.log(fn(102));
方案二:
function fn(n){ return Math.min(n,100); } console.log(fn(99));
方案三:
function fn(n){ switch(n<100){ case true: return n; break; case false: return 100; break; } } console.log(fn(99));
方案四:
var n = 104; var arr = [n,100]; arr.sort(function(n1,n2){ return n1-n2; }) console.log(arr[0]);
方案一:for循環
var arr = []; for(var i=0;i<funs.length;i++){ arr.push(funs[i]); } console.log(arr);
方案二:
var arr = Array.prototype.slice.call(funs); //或 var arr = [].slice.call(funs);
var i=0; alert(++i == i++); //true
解析:
等式是從左往右執行,先是執行了++i ,而後進行比較,最後執行i++
function Fn(){ this.name = 'miaov'; this.adress = '北京'; return {} } var fn = new Fn(); console.log(fn.name); //undefined