javascript 基础知识

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容