1英遭、查找數(shù)組中重復(fù)元素
方法1:創(chuàng)建一個新的臨時數(shù)組來保存數(shù)組中已有的元素
function duplicates(arr) {
//聲明兩個數(shù)組吁伺,a數(shù)組用來存放結(jié)果超凳,b數(shù)組用來存放arr中每個元素的個數(shù)
var a = [],b = [];
//遍歷arr,如果以arr中元素為下標(biāo)的的b元素已存在耕皮,則該b元素加1仑濒,否則設(shè)置為1
for(var i = 0; i < arr.length; i++){
if(!b[arr[i]]){
b[arr[i]] = 1;
continue;
}
b[arr[i]]++;
}
//遍歷b數(shù)組,將其中元素值大于1的元素下標(biāo)存入a數(shù)組中
for(var i = 0; i < b.length; i++){
if(b[i] > 1){
a.push(i);
}
}
return a;
}
方法2: 使用indexOf判斷數(shù)組元素第一次出現(xiàn)的位置是否為當(dāng)前位置
Array.prototype.unique3 = function(){
var n = [this[0]];
for(var i=1; i<this.length; i++) //從第二項開始遍歷
{
//如果當(dāng)前數(shù)組元素在數(shù)組中出現(xiàn)的第一次的位置不是i
//說明是重復(fù)元素
if(this.indexOf(this[i]) == i){
n.push(this[i]);
}
}
return n;
}
方法3:先排序再去重
Array.prototype.unique4 = function(){
this.sort(function(a, b){ return a - b;});
var n = [this[0]];
for(var i=1; i<this.length; i++){
if(this[i] != this[i-1]){
n.push(this[i]);
}
}
return n;
}
2朝墩、求數(shù)組二次方
為數(shù)組 arr 中的每個元素求二次方茧跋。不要直接修改數(shù)組 arr矛辕,結(jié)果返回新的數(shù)組
function square(arr) {
//聲明一個新的數(shù)組存放結(jié)果
var a = [];
arr.forEach(function(e){
//將arr中的每一個元素求平方后罚拟,加入到a數(shù)組中
a.push(e*e);
});
return a;
}
3、查找數(shù)組元素位置
在數(shù)組 arr 中愤兵,查找值與 item 相等的元素出現(xiàn)的所有位置
function findAllOccurrences(arr, target) {
var a=[];
for(var i=0;i<arr.length;i++){
if(arr[i]===target){
a.push(i);
}
}
return a;
}
4、正確使用parseInt()
parseInt(string, radix)
當(dāng)參數(shù) radix 的值為 0排吴,或沒有設(shè)置該參數(shù)時秆乳,parseInt() 會根據(jù) string 來判斷數(shù)字的基數(shù)。
舉例钻哩,如果 string 以 "0x" 開頭屹堰,parseInt() 會把 string 的其余部分解析為十六進制的整數(shù)。如果 string 以 0 開頭街氢,那么 ECMAScript v3 允許 parseInt() 的一個實現(xiàn)把其后的字符解析為八進制或十六進制的數(shù)字双藕。如果 string 以 1 ~ 9 的數(shù)字開頭,parseInt() 將把它解析為十進制的整數(shù)阳仔。
function parse2Int(num)
{
return parseInt(num,10);
}
5、實現(xiàn)對象的深克隆
因為js中數(shù)據(jù)類型分為基本數(shù)據(jù)類型(number, string, boolean, null, undefined)和引用類型值(對象, 數(shù)組, 函數(shù)). 這兩類對象在復(fù)制克隆的時候是有很大區(qū)別的. 原始類型存儲的是對象的實際數(shù)據(jù), 而對象類型存儲的是對象的引用地址(對象的實際內(nèi)容單獨存放, 為了減少數(shù)據(jù)開銷通常放在內(nèi)存中). 此外, 對象的原型也是引用對象, 它把原型的屬性和方法放在內(nèi)存中, 通過原型鏈的方式來指向這個內(nèi)存地址.
于是克隆也會分為兩類:
- 淺度克隆: 原始類型為值傳遞, 對象類型仍為引用傳遞
- 深度克隆: 所有元素或?qū)傩跃耆珡?fù)制, 與原對象完全脫離, 也就是說所有對于新對象的修改都不會反映到原對象中
function clone(obj){
if(typeof(obj)== 'object'){
var result = obj instanceof Array ? [] : {};
for(var i in obj){
var attr = obj[i];
result[i] = arguments.callee(attr);
}
return result;
} else {
return obj;
}
};
6扣泊、回文判斷
方法1:
function isPalindrome(line) {
line += "";
return line === line.split("").reverse().join("");
}
方法2:從字符串頭部和尾部近范,逐次向中間檢測
function isPalindrome(line) {
line += "";
for(var i=0,j=line.length-1;i<j;i++,j--){
if(line.charAt(i) !== line.charAt(j)){
return false;
}
}
return true;
}
7、計時器
實現(xiàn)一個打點計時器延蟹,要求
1)從 start 到 end(包含 start 和 end)评矩,每隔 100 毫秒 console.log 一個數(shù)字,每次數(shù)字增幅為 1
2)返回的對象中需要包含一個 cancel 方法阱飘,用于停止定時操作
3)第一個數(shù)需要立即輸出
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);
}
};
}
8斥杜、流程控制
實現(xiàn) fizzBuzz 函數(shù),參數(shù) num 與返回值的關(guān)系如下:
1沥匈、如果 num 能同時被 3 和 5 整除,返回字符串 fizzbuzz
2高帖、如果 num 能被 3 整除缰儿,返回字符串 fizz
3、如果 num 能被 5 整除散址,返回字符串 buzz
4乖阵、如果參數(shù)為空或者不是 Number 類型,返回 false
5预麸、其余情況瞪浸,返回參數(shù) num
function fizzBuzz(num) {
var a = num % 3;
var b = num % 5;
if (a == 0 && b == 0) {
return 'fizzbuzz';
} else if (a == 0) {
return 'fizz'
} else if (b == 0) {
return 'buzz'
} else if (num == 'null' || typeof (num) != 'number') {
return false
} else {
return num
}
}