昨天參加了字節(jié)跳動(dòng)的筆試依鸥,總共4道編程題。哎悼沈!一言難盡贱迟,算法渣渣姐扮,4道編程題全軍覆沒。
經(jīng)過反思總結(jié)关筒,我覺得自己的算法已經(jīng)到了無藥可救的地步溶握,繼續(xù)下去只是浪費(fèi)時(shí)間。遂放棄算法那一塊知識(shí)蒸播,專攻前端基礎(chǔ),就算算法不行萍肆,我希望我能用掌握好基礎(chǔ)知識(shí)袍榆,感動(dòng)面試官們!繼續(xù)學(xué)習(xí)算法塘揣,我怕我到時(shí)候算法沒學(xué)好包雀,基礎(chǔ)也沒打牢固,面試官左右都不滿意亲铡!
一才写、 將數(shù)組轉(zhuǎn)為字符串
涉及到的方法有 toString(),join([parameter])
(一) toString()
toString()方法奖蔓,所有的對(duì)象都有這個(gè)方法赞草。
- 參數(shù):無
- 返回值:數(shù)組值(逗號(hào)分隔)的字符串
- 是否改變?cè)瓟?shù)據(jù):否
- 原理:
分隔符為 逗號(hào)
Boolean 的數(shù)組值 返回 字符串類型的 true 或者 false
Number 的數(shù)組值 返回 字符串類型的對(duì)應(yīng)數(shù)字
null和undefined 的數(shù)組值 返回 空串
Object 的數(shù)組值 返回 字符串[Object Object]
var arr = [1,3,"45", {id: "23"}, null, undefined, true,[1,2,3]];
console.log(arr.toString());
console.log(arr);
JS中各種數(shù)據(jù)類型調(diào)用toString():
- Boolean類型的 toString() 返回 字符串類型的 true 或者 false
- Number 類型的 toString() 兩種模式,即默認(rèn)模式和基模式(此時(shí)吆鹤,toString()可以傳入一個(gè)參數(shù)表示數(shù)值的進(jìn)制)
- null和undefined沒有toString()厨疙,調(diào)用時(shí)會(huì)報(bào)錯(cuò)。
undefined 實(shí)際上是從值 null 派生來疑务,null常用于表示一個(gè)為空的對(duì)象
typeof null 返回 object ?? typeof undefined 返回 undefined
(二)join()
join([param1])
- 參數(shù):String類型沾凄,可選參數(shù)
- 返回值:
有param1:數(shù)組值(param1分隔)的字符串
無param1:數(shù)組值(逗號(hào)分隔)的字符串 - 是否改變?cè)瓟?shù)據(jù):否
- 原理:
分隔符為 param1 或者 逗號(hào)
Boolean 的數(shù)組值 返回 字符串類型的 true 或者 false
Number 的數(shù)組值 返回 字符串類型的對(duì)應(yīng)數(shù)字
null和undefined 的數(shù)組值 返回 空串
Object 的數(shù)組值 返回 字符串[Object Object]
二、數(shù)組的基本操作
主要指增刪查改
(一)通過索引號(hào)
可實(shí)現(xiàn)增刪查改所有操作
(二)push()知允,pop()
實(shí)現(xiàn) 類似于棧的 出棧撒蟀,入棧 操作
在數(shù)組的尾部
進(jìn)行 添加 或者 刪除 操作。
push([param1], [param2],......,[param n])
在數(shù)組尾部添加多個(gè)元素(0……n)
- 參數(shù):可選參數(shù)温鸽,任意類型
- 返回值:返回操作完之后保屯,數(shù)組的length屬性值
- 是否改變?cè)瓟?shù)據(jù):是,就是在原數(shù)據(jù)上操作
- 原理:
pop()
刪除最后一個(gè)元素
- 參數(shù):無
- 返回值:返回刪除的元素值
- 是否改變?cè)瓟?shù)據(jù):是
- 原理:
例子:
var arr = [1,3,4];
console.log(arr.pop());
console.log("arr", arr);
console.log(arr.push(2,5,0));
console.log("arr", arr);
(三)shift()嗤朴,unshift()
實(shí)現(xiàn)類似于隊(duì)列的入隊(duì)配椭,出隊(duì)操作
在數(shù)組的頭部
進(jìn)行 刪除 或者 添加 操作
unshift([param1], [param2],......,[param n])
在數(shù)組頭部添加多個(gè)新元素(0……n),并“反向位移”舊元素
- 參數(shù):可選參數(shù)雹姊,任意類型
- 返回值:返回操作完之后股缸,數(shù)組的length屬性值
- 是否改變?cè)瓟?shù)據(jù):是
- 原理:
shift()
刪除數(shù)組的第一個(gè)元素,并“位移”其他元素
- 參數(shù):無
- 返回值:返回操作完之后吱雏,數(shù)組的length屬性值
- 是否改變?cè)瓟?shù)據(jù):是
- 原理:
例子
var arr = [1,3,4];
console.log("arr", arr);
console.log(arr.shift());
console.log("arr", arr);
console.log(arr.unshift(2,5,0));
console.log("arr", arr);
(四)splice()
splice(index敦姻,count瘾境,[param1],[param2],……,[param n])
拼接數(shù)組镰惦,可能位移其他元素迷守。
可實(shí)現(xiàn)數(shù)組的增刪改
- 參數(shù):
index:>= 0,表示新元素應(yīng)該被添加(接入)的索引值,
count:>= 0旺入,表示應(yīng)刪除多少元素
可選參數(shù):任意類型兑凿,表示要添加的新元素 - 返回值:已刪除項(xiàng)組成的數(shù)組
- 是否改變?cè)瓟?shù)據(jù):是
splice實(shí)現(xiàn)增刪改
增:count = 0,定義要添加的新元素
splice(index, , param1茵瘾,param2,……,param n)
刪:count > 0礼华,不定義要添加的新元素
splice(index, ),刪除count個(gè)元素
改:count > 0拗秘,定義要添加的新元素
splice(index, )
var arr = [1,3,4,5,6,7];
console.log("arr", arr);
var deleteArr = [];
arr.splice(2,0,"we","our"); // 從索引值 2 開始圣絮,刪除0位元素,拼接新元素
console.log("增", arr);
arr.splice(0,2); // 從索引值 0 開始雕旨,刪除兩位元素
console.log("刪", arr);
deleteArr = arr.splice(2,1,"edit");
console.log("改", arr);
console.log("刪除的數(shù)據(jù)項(xiàng)", deleteArr);
(五)delete 運(yùn)算符
將任一索引處的元素扮匠,改為 undefined,會(huì)在數(shù)組留下未定義的空洞凡涩,不推薦使用
不涉及位移
三棒搜、數(shù)組的其他操作
主要指 合并,裁剪 等操作突照。
(一)concat()
concat(param1, param2, ……, paramn)
合并(連接)數(shù)組帮非,區(qū)別于 拼接
- 參數(shù):數(shù)組類型
- 返回值:返回操作完之后,新的數(shù)組
- 是否改變?cè)瓟?shù)據(jù):否
var arr = [1,3,4,5,6,7];
var arr2 = [8,9,10,11];
var concatArr = arr.concat(arr2);
console.log("arr", arr);
console.log("arr2", arr2);
console.log("concatArr", concatArr);
(二) slice()
slice( start末盔,end ) : 裁剪數(shù)組
從start開始,直到end(不包括)為止
- 參數(shù): >= 0
- 返回值:返回裁剪出來的數(shù)組
- 是否改變?cè)瓟?shù)據(jù):否
var arr = [1,3,4,5,6,7];
var sliceArr = arr.slice(2,10);
console.log("arr", arr);
console.log("sliceArr", sliceArr);
四座慰、數(shù)組的排序類操作
主要指 排序陨舱,反轉(zhuǎn),查找最大版仔,查找最小 等操作
(一)sort()
首先明確游盲,排序指的是對(duì) 數(shù)字 或者是 字符 排序
sort([sortby])
- 參數(shù):
sortby:比較函數(shù) ,規(guī)定排序順序
無參數(shù):按照字符編碼的順序進(jìn)行排序蛮粮。先把數(shù)組的元素都轉(zhuǎn)換成字符串(如有必要)益缎,再比較。 - 返回值:數(shù)組的引用
- 是否改變?cè)瓟?shù)據(jù):是
比較函數(shù):
該函數(shù)要比較兩個(gè)值然想,然后返回一個(gè)用于說明這兩個(gè)值的相對(duì)順序的數(shù)字莺奔。
比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
??1.若 a 小于 b变泄,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前令哟,則返回一個(gè)小于 0 的值恼琼。
??2. 若 a 等于 b,則返回 0屏富。
??3.若 a 大于 b晴竞,則返回一個(gè)大于 0 的值。
數(shù)組排序
var arr = [11,3,14,5,6,7];
console.log("arr", arr);
arr.sort();
console.log("未規(guī)定按數(shù)值從小到大排序", arr);
arr.sort(sortNumber);
console.log("規(guī)定按數(shù)值從小到大排序", arr);
function sortNumber(a, b){
return a - b;
}
對(duì)象數(shù)組排序
JavaScript 數(shù)組狠半,經(jīng)常會(huì)包含對(duì)象噩死,對(duì)象擁有不同數(shù)據(jù)類型的屬性,sort() 方法怎么對(duì)對(duì)象數(shù)組排序呢神年?——通過比較函數(shù)對(duì)比(數(shù)字甜滨,字符串)屬性的屬性值,從而排序
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
//比較數(shù)值屬性
cars.sort(function(a, b){return a.year - b.year});
//比較字符串屬性
cars.sort(function(a, b){
var x = a.type.toLowerCase();
var y = b.type.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
(二)reverse()
反轉(zhuǎn)數(shù)組
- 參數(shù):無參數(shù)
- 返回值:數(shù)組的引用
- 是否改變?cè)瓟?shù)據(jù):是
(三) 查找最值
JavaScript 數(shù)組 沒有 查找最高和最低值的 內(nèi)建函數(shù)瘤袖。
通過排序函數(shù)
可通過對(duì)數(shù)組進(jìn)行排序,然后使用索引來獲得最高或最低值昂验。
Math.max() 捂敌, Math.min()
var arr = [11,2,3];
var max = Math.max.apply(null,arr); // 11
var min = Math.min.apply(null,[11,2,3]); // 2
var max2 = Math.max.apply(arr); // -Infinity
自己定義函數(shù)
略……
五、數(shù)組的迭代類操作
主要指 數(shù)組迭代既琴,過濾占婉,按條件查找 等操作
- 除非特別說明,此類函數(shù)的 是一個(gè) 甫恩,回調(diào)函數(shù)的參數(shù)是
(一) forEach()
遍歷
數(shù)組全部元素逆济,利用回調(diào)函數(shù)對(duì)數(shù)組進(jìn)行操作
自動(dòng)遍歷整個(gè)數(shù)組,且無法break中途跳出循環(huán)體
不支持 return 操作輸出 和 結(jié)束函數(shù)磺箕,return只用于結(jié)束本輪循環(huán)奖慌。
- 返回值:無(函數(shù)無返回值時(shí),返回值為 undefined)
- 是否改變?cè)瓟?shù)據(jù):否
注意區(qū)別松靡,我們可以在回調(diào)函數(shù)內(nèi)部通過索引值修改數(shù)組元素简僧,但是forEach函數(shù)不會(huì)修改原數(shù)組。 - 應(yīng)用:
主要用于需要循環(huán)遍歷每一項(xiàng)數(shù)組元素的時(shí)候雕欺,或者岛马,需要對(duì)每一個(gè)元素進(jìn)行相同的操作的時(shí)候。
var arr = [1,2,3,4,5];
var res = arr.forEach(function (item,index,array) {
console.log("sss", item);
array[index] = item + 1; // 通過數(shù)組索引改變了原數(shù)組屠列;
return 1; //這里加上這句之后啦逆,跳出當(dāng)前循環(huán),不會(huì)跳出函數(shù)
array[index] = item * 10; // 不會(huì)執(zhí)行這句
});
console.log(res);//undefined;
console.log(arr);//[2,3,4,5,6]
var arr = [1,2,3,4,5];
var res = arr.forEach(function (item,index,array) {
item --;
console.log("sss", item);
// array[index] = item + 1; // 通過數(shù)組索引改變了原數(shù)組笛洛;
// return 1; //這里加上這句之后夏志,跳出當(dāng)前循環(huán)
// array[index] = item * 10; // 不會(huì)執(zhí)行這句
});
console.log(res);//undefined;
console.log(arr);//[1,2,3,4,5]
(二)map()
按照原始數(shù)組元素順序依次操作元素
return 語句 結(jié)束本輪循環(huán)侥袜,并將 return語句后面的表達(dá)式結(jié)果,保存到一個(gè)新數(shù)組里邊
- 返回值:新數(shù)組溉贿,與原數(shù)組等長(zhǎng)
- 是否改變?cè)瓟?shù)據(jù):否
- 應(yīng)用
var arr = [1,2,3,4,5];
var resArr = arr.map(function (item) {
return -- item;
console.log("sss", item); // 不會(huì)執(zhí)行這一步
});
console.log("resArr", resArr);//[0,1,2,3,4];
console.log("arr", arr);//[1,2,3,4,5]
(三)filter()
filter()方法篩選
符合條件的元素枫吧,以數(shù)組形式輸出。
- 返回值:包含通過測(cè)試的數(shù)組元素的新數(shù)組
- 是否改變?cè)瓟?shù)組:否
- 應(yīng)用:搜索功能宇色,數(shù)組去重
(四)reduce()
(五)every()
檢測(cè)
是否所有元素都
符合條件的九杂,return false結(jié)束函數(shù)。每一輪循環(huán)默認(rèn)return false
- 返回值:
false:默認(rèn)返回值
true: - 是否改變了原數(shù)據(jù):否
- 應(yīng)用:
var arr = [1,2,3,4,5,6,7,8];
var everyFlag = arr.every(function(item,index){
console.log("index2",index);
});
(六)some()
檢測(cè)
是否所有元素中有
符合條件,return true 結(jié)束函數(shù)抢蚀。每一輪循環(huán)默認(rèn)return false
- 返回值:
true:
false:默認(rèn)返回值 - 是否改變了原數(shù)據(jù):否
- 應(yīng)用:
var someFlag = arr.some(function(item,index){
console.log("index1",index);
});
(七)indexOf()皿曲,lastIndexOf()
(八)findIndex()唱逢,find()
find() 返回符合條件的第一個(gè)元素
兼容性差