//数组去重
//方法一
var arr = [0,2,3,4,4,0,2];
var obj={}
var arrs=[]
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]]=1;
arrs.push(arr[i])
}
}
console.log(arrs)
//方法二
var arr = [0,2,3,4,4,0,2];
var arrs=[];
for(var i=0;i<arr.length;i++){
if(arrs.indexOf(arr[i]) < 0){
arrs.push(arr[i])
}
}
console.log(arrs);
//
//
//方法三
var arr = [0,2,3,4,4,0,2];
var arrs=arr.filter(function(currentValue,index,arr){
return arr.indexOf(currentValue) === index
})
console.log(arrs)
请用es5与es6分别封装一个数组去重的方法
/* es5去重 */
var arr =[5,"5",5,2,"2",1,3];
function unique(arr){
var brr = [];
var obj = {};
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]]=true;
brr.push(arr[i]);
}
}
return brr;
}
console.log(unique(arr));
/* es6去重 */
用new Set()去重,缺点是不同类型的不能去重
var set =new Set(arr);
consol.log(set)
封装一个对象深拷贝的方法
浅拷贝:拷贝的是对象的属性,缺点是一个改变相互影响;
深拷贝:拷贝的是原对象,一个改变互相不影响;
function copy(oldObj,deep){
let newObj = {};
if (oldObj instanceof Array){
newObj = [];
}
for (let key in oldObj){
let value = oldObj[key];
if (!!deep && typeof value === "object" && value !== null){
newObj[key] = copy(value,deep);
} else{
newObj[key] = value;
}
}
return newObj;
}
let obj1 = {a:1,b:{c:2}};
let obj2 = copy(obj1,true); //深拷贝
let obj3 = copy(obj1,false); //浅拷贝
obj1.b.c = 3;
console.log(obj2); //{a:1,b:{c:2}}
console.log(obj3); //{a:1,b:{c:3}}
用正则表达式写一个身份证验证
var reg1 = /^\d{17}[x\d]$/;
var str1 = '421123200009067621';
console.log(reg1.test(str1)) //结果为true
封装一个函数,判断是否为数组
var arr=[1,2,3,4];
function isArray(arr){
if(arr instanceof array){
return '数组'
}
}
console,log(isArray(arr))
分别解释数组的方法:pop(),push(),unshift(),shift()
pop() 删除数组末尾,返回删除的内容
push() 向数组末尾添加内容,返回的是数组长度
unshift() 向数组第一位添加内容,返回的是数组长度
shift() 删除数组第一位,返回删除的内容
dom操作——怎样添加、移除、移动、复制、创建和查找子节点
添加:appendChild
移除:removeChild
移动: replaceChild
复制: clone
创建: createElemnet
查找子节点: getElemntById
如何阻止事件冒泡和默认事件
阻止事件冒泡:出现的场景通常是两个盒子都有触发事件,e.stopPropagation()和e.cancelBubble = true
默认事件:e.preventDefault和e.returnValue = false
new操作符具体干了什么呢?
- 创建一个空对象: 并且this变量引入该对象,同时还继承了函数的原型
var obj=new Object();
- 设置原型链 空对象指向构造函数的原型对象
obj.__proto__= Func.prototype;
- 执行函数体 修改构造函数this指针指向空对象,并执行函数体
var result =Func.call(obj);
- 判断返回值 返回对象就用该对象,没有的话就创建一个对象
if (typeof(result) == "object"){ func=result; } else{ func=obj;; }
JS延迟加载的几种方式有哪些?
- defer 属性
- async 属性
- 动态创建DOM方式
- 使用jQuery的getScript方法
- 使用setTimeout延迟方法
- 让JS最后加载
什么是“use scrict”使用它的好处和坏处分别是什么?
use scrict是严格模式,解决一些js的怪癖行为的
好处:
-
提高编译器效率,增加运行速度;
-
消除代码运行的一些不安全之处,保证代码运行的安全;
-
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
-
为未来新版本的Javascript做好铺垫。
-
检测代码的,压缩的节约文件大小
坏处:
阻塞后面代码的运行,压缩出现错误
现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。