1.javascript的数据类型
基本数据类型:number、string、boolean、null、underfined、bigint、symbol
引用数据类型:object、array、date、function、regExp
2.判断变量的类型
typeof
instanceof及原理
Object.toString().call()及原理
3.数据类型转换
相等==和全等===(==判断值是否相等 ===判断值得类型是否相等)
强制转换和隐式转换
包装类型
4.原型和原型链
①所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
②所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
③所有引用类型的__proto__属性指向它构造函数的prototype
var a = [1,2,3];
a.__proto__ === Array.prototype; // true
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
5.闭包及优缺点
闭包就是获取其他函数内部变量的函数,是链接内部函数与外部函数的桥梁
6.call/apply/bind
用于改变this的指向
bind返回一个新函数 必须重新调用
call和bind传参用逗号隔开
apply传参为数组形式
7.dom事件流和事件委托
捕获、冒泡
事件委托及好处
8.cookie和storage
cookie的构成:
name:cookie 的名称
value:cookie 对应的值,动态生成的
domain:服务器域名
expiry:Cookie 有效终止日期
path:Path 属性定义了 Web 服务器上哪些路径下的页面可获取服务器设置的 Cookie
httpOnly:防脚本攻击
secure:在 Cookie 中标记该变量,表明只有当浏览器和 Web Server 之间的通信协议为加密 认证协议时, 浏览器才向服务器提交相应的 Cookie。当前这种协议只有一种,即为 HTTPS。
localStorage和sessionStorage
9.数组和对象的常见方法
Array:slice、splice、concat、filter、map、reduce
splice(start deletecount end)改变原数组
slice(start end)不改变原数组 end不包括
filter 过滤 (item data )
Object:keys、assign
举例:改变原数组的方法
10.new内部做了什么
(1)创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
(3) 执行构造函数中的代码(为这个新对象添加属性) ;
(4) 返回新对象。
11.防抖节流
输入一次执行一次
防抖:用户多次触发事件,在用户一直触发事件中,事件不会执行,只有在用户停止触发事件一段时间之后再执行这个事件一次。
节流:用户多次触发事件,在用户一直触发事件过程中事件会每间隔一段时间执行一次,会执行多次。
应用场景:监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断
search搜索联想,用户在不断输入值时,用防抖来节约请求资源。
12.this指向
对于定时器函数,this指向windows 。
对于构造函数,this指向实例对象。
对于普通函数,this指向windows。
对于对象函数来说,this指向该方法所属的对象。
13.什么是函数
函数是由function定义,可以重复执行的代码块
14.作用域链
函数内部有变量就打印函数内部的,函数内部没有就打印函数外部,从内到外逐级查找
15.let/const/var区别
var存在变量提升、定义全局变量、值允许修改、可以声明多次
let值允许修改、只能声明一次
const、let不存在变量提升、定义在代码块中
const 定义常量、定义的值不允许修改
16.es6异步编程:promise和async、await
promise解决回调地狱,让请求接口按照顺序执行
async、await比promise更好地解决毁回调地狱
17.箭头函数
箭头函数是es6新增的,可以替换到 function 和return
如果只有一条语句,则省略大括号和return
18.javascript运行机制
同步,同步程序执行完成之后执行异步程序
异步,setTimeOut,setInterval
process.nextTick()在同步之后,异步之前执行
setImmediate()在异步之后执行,如果第一次没进入任务队列的事件则会放到setImmediate之后执行
同步放在运行栈中
异步放在任务队列中
异步分为宏任务和微任务
newpromise里的是同步
宏任务:计时器、ajax、读取文件
微任务:promise.then
执行顺序:
1.同步
2.process.nextTick(在同步之后,异步之前执行)
3.微任务(promise.then)
4.宏任务(计时器、ajax、读取文件)
5.setImmediate
19.实现继承的几种方式
es5 的 property继承
es6 的 super();
20.垃圾回收
找出不再使用的变量,然后释放其占用的内存
局部变量在函数执行结束之后,就没有存在的必要了,可以释放其内存
哪些变量有用,哪些变量没用
1.标记清除(标记出需要回收的对象,回收所标记的对象所占用的空间)
2.引用计数(对象引用一次就+1,释放一次就-1,为0的时候就表示可以清除了)
3.什么时候触发垃圾回收机制
21.深拷贝和浅拷贝
浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。
1.使用递归的方式实现深拷贝
2.使用json对象实现深拷贝
var obj1 = {
name: 'li',
hobit: ['摄影', '羽毛球']
}
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.hobit.push('游泳');
console.log(obj1); //{ name: 'li', hobit: [ '摄影', '羽毛球' ] }
console.log(obj2); //{ name: 'li', hobit: [ '摄影', '羽毛球', '游泳' ] }
3.通过jquery的extend实现深拷贝
$.extend( [deep ], target, object1 [, objectN ] )
deep :表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
target: Object类型 目标对象,其他对象的成员属性将被附加到该对象上
object1… objectN : Object类型 第一个以及第N个被合并的对象。
4.通过object.assign实现浅拷贝
var obj1 = {a: 1, b: 2};
var obj2 = Object.assign({}, obj1);
5.通过解构赋值实现浅拷贝
var obj1 = {a: 1, b: 2};
var obj2 = {...obj1};
22.什么是跨域
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
所谓同源是指,域名,协议,端口均相同,只要有一个不同,就是跨域。
23.组件data为什么是一个函数
当某一处复用的地方组件内data数据被改变时,其他复用地方组件的data数据不受影响
24.js判断变量是不是数组
var str = [1,2,3]
console.log(Array.isArray(str))
console.log(Array.prototype.isPrototypeOf(str))
25.堆栈
栈 存储基本数据类型 由操作系统自动分配 用完立即释放
堆 存放引用类型 存放了引用地址 由程序员自动分配和释放 没有手动释放则由垃圾回收算法自动释放
26.foreach和map的区别
forEach()会修改原来的数组。而map()方法会得到一个新的数组并返回。map执行速度快一些
27.object.keys
let person = {name:"张三",age:25,address:"深圳",getName:function(){}}
Object.keys(person).map((key)=>{
person[key] // 获取到属性对应的值,做一些处理
})
28.请求
get:申请获取资源
post:客户端向服务器发送请求
put:上传某个资源
delete:删除某个资源
29.双等==和全等===的区别
==判断的是值相等
===判断值得类型是否相同
30.js有哪些内置对象
js中的内置对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。
31.js拖拽功能的实现
拖拽包括mousedown、mousemove、mouseup(鼠标按下、鼠标按下保持不变移动、鼠标抬起),在mousedown时设置一个按下的状态,在鼠标抬起的时候清除这个状态、当鼠标按下的时候先判断是否为拖拽元素,如果是则设置状态并保存鼠标按下的坐标、在mousemove事件中判断现在位置和以前位置的相对移动,确定拖拽元素在移动中的坐标、然后在mouseup事件中清除状态和结束拖拽事件
32.要求写出 区号+8位数字,或者区号+特殊号码: 10010/110,中间用短横线隔开的正则验证。 区号就是三位数字开头。 例如010-12345678
let reg ='/^\d{3}-(\d{8}|10010|110)/g'
console.log(reg)
33.不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好
let arr = [1,2,3,4,5]
let arrs = [1,2,3,4,5]
delete arrs[2]
console.log(arr.splice(2,1))
console.log(arrs)