怎麼判斷兩個對象相等?
JSON.stringify(obj) === JSON.stringify(obj)
實現數組去重?
let arr = [1,1,'true','true',true,true,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
-
使用ES6的Set方法
console.log(Array.from(new Set(arr)) console.log([...new Set(arr)])
不能去重對象
- hasOwnProperty
function unique(arr) {
var obj = {};
return arr.filter(function(item, index, arr){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
console.log(unique(arr))
綜合考慮是最好的方法
-
indexOf
function unique(arr) { if (!Array.isArray(arr)) { console.log('type error!') return } var array = []; for (var i = 0; i < arr.length; i++) { if (array .indexOf(arr[i]) === -1) { array .push(arr[i]) } } return array; } console.log(unique(arr))
-
includes
function unique(arr) { if (!Array.isArray(arr)) { console.log('type error!') return } var array =[]; for(var i = 0; i < arr.length; i++) { if( !array.includes( arr[i]) ) {//includes 檢測數組是否有某個值 array.push(arr[i]); } } return array } console.log(unique(arr))
-
雙層for循環
function unique(arr){
for(var i=0; i < arr.length; i++){
for(var j=i+1; j < arr.length; j++){
if(arr[i]==arr[j]){
arr.splice(j,1);
j--;
}
}
}
return arr;
}
實現深拷貝的方法?
let obj = {a: undefined, b: 1.7976931348623157E+10308, c: -1.7976931348623157E+10308, d: new Date(), e: new RegExp('\\w+'), f: function() {console.log(1)}}
-
第一種:
JSON.parse(JSON.stringify())
弊端如下
- 如果obj裏面有時間對象,時間將只是字符串的形式。而不是時間對象;
- 如果obj裏有RegExp、Error對象,則序列化的結果將只得到空對象
- 如果obj裏有函數,undefined,則序列化的結果會把函數或 undefined丟失;
- 如果obj裏有NaN、Infinity(正無窮大)和-Infinity(負無窮大),則序列化的結果會變成null
- 如果obj中的對象是有構造函數生成的,會丟棄對象的constructor;
-
第二種:手寫迭代
function deepClone(obj){ let newObj = Array.isArray(obj)?[]:{} if(obj && typeof obj === 'object'){ for(let key in obj){ if(obj.hasOwnProperty){ newObj[key] = (obj && typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key] } } } return newObj }
console.log(deepClone(obj))
實現冒泡排序算法?
let array = [5, 4, 3, 2, 1];
let temp = 0;
for (let i = 0; i <array.length; i++){
for (let j = 0; j <array.length - i; j++){
if (array[j] > array[j + 1]){
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
實現降維數組?
let arr = [[1,2],[3,4]]
function Jw(arr){
return Array.prototype.concat.apply([], obj)
}
console.log(Jw(arr)) // [1,2,3,4]
實現取數組的最大值
Math.max.apply(null, [213, 4, 43, 141])
Math.max(...[213, 4, 43, 141])
如何阻止冒泡事件
function stopBubble(e){
if(e && e.stopPropagation){
// 非IE瀏覽器
e.stopPropagation();
}else{
//IE瀏覽器
window.event.cancelBubble=true;
}
}
如何阻止瀏覽器默認事件
function stopDefault(e){
//標準瀏覽器
if(e && e.preventDefault){
e.preventDefault();
}
//個別IE
else{
window.event.returnValue=fale;
return false;
}
}
獲取非行間樣式
function getCss(curEle,attr){
var val = null;
try{
val = window.getComputedStyle(curEle,null)[attr];
}catch(e){
val = curEle.currentStyle[attr];
}
return val;
}
getCss(div,'width')