注:难易程度和重要程度综合起来用 * 标记
Java和JavaScript有什么关系吗?*
答:理论上讲,其实并没有什么关系,也不是一个公司出的。当时开发js的时候正是java热的时候,所以高层希望能跟java沾些关系,所以才取名javaScript。两者内容也是不一样的。
js是一个解释性语言,它可以边解释边执行,而java需要先编译再执行。
整体来说java比js的语法要严格,功能也要多很多。
js中深拷贝和浅拷贝的区别?***
对于简单的数据类型,比如number,string
当我设置一个a = 1时,我再将 a 赋值给b, 对b改变的时候不会给a有任何影响。
但是当我设置一个对象类型或者数组类型 a = [1,2,3],这时我如果将a赋值给b,b接收到的其实只是a的地址,所以我操作b的数组,比如删除最后一个元素使得b = [1,2],同时a也会变化,因为b只是一个a的地址,操作b实际上还是在操作a。
所以直接将a赋值给b的操作就是浅拷贝,但如果只是拷贝了值,地址发生了变化,改变b时,a并没有改变,那么它就是深拷贝。
答:浅拷贝只是拷贝了对象或数组的地址,深拷贝 是改变了原对象的地址,只将值赋值进去,就算改变其数值,也不会影响原先的数据。
一般数组我会重新创建一个空数组遍历赋值进行深拷贝。
对象的话我会采用JSON.parse(JSON.stringify(obj))的方法将其深拷贝。
JSON.stringify(obj)是将obj对象转化为一个json字符串,JSON.parse()是将括号里的json字符串转化为对象,所以这个功能就是将其转化为一个json字符串,再转化回来,达成一个深拷贝的效果,上面那句话口述可以说成:
对象的话,我会采用JSON.stringify转化为json字符串,再将json字符串parse出来成为一个对象,就达成了深拷贝的效果。
箭头函数和普通函数的区别 ***
什么是箭头函数?
箭头函数就是指以下这个结构的函数
() => {}
其中小括号中的是这个函数的参数,花括号代表这个函数的执行内容。比如我实现一个打印收到的值的函数:
(value)=>{ console.log(value); }
为什么要用箭头函数?
因为箭头函数有时候可以替代简单的函数类型,简化了一些代码,有些地方需要接收一个函数,但是这个函数功能又不复杂,可能就一两句话,可以用一个箭头函数表示,箭头函数是匿名函数,也不能重复使用。
比如最经常使用的定时器功能,定时器setTimeout最基础的用法有两个参数,第一个参数是接收一个函数,第二个参数是一个时间,他可以在接收的规定时间之后,运行接收到的函数。通常我们可以在这里使用箭头函数,比如实现一个三秒后打印一句话的功能:
setTimeout(()=>{ console.log('一句话...'); },3000)
答:箭头函数没有自己的this指向, 他的this指向永远都是自己的作用域,而普通的函数this是可以改变的,也就是谁调用它,它的this指向就是谁。
箭头函数是一个匿名函数,它不能复用,也没有原型链
怎么理解原型链 ****
原型链通俗易懂的理解就是可以把它想象成一个链条,互相连接构成一整串链子!
而原型链中就是实例和原型之间的链接。每个函数都有一个prototype属性,这个prototype属性就是我们的原型对象,我们拿这个函数通过new构造函数创建出来的实例对象,这个实例对象自己会有一个指针(_proto_)指向他的构造函数的原型对象!这样构造函数和实例对象之间就通过( _proto_ )连接在一起形成了一条链子。
你平时在浏览器中,输入url访问网站的一瞬间,都发生了什么事情? *****
1.你输入的网址/域名被发送到了DNS服务器,通过DNS服务器获取到对应的IP地址
dns是一个域名服务,可以理解为一个公共的数据库。
平时想访问一个网站需要访问IP,也就是类似于192.168.0.1
而我们输入的网址就是通过DNS来访问数据库,来查找这个网址对应的IP到底是多少。
2.拿到IP后,我们开始对目标IP发起TCP连接 (三次握手)
TCP相关知识正在施工,还没写完
3.确认TCP成功后,浏览器开始正式的发送一个页面的请求
4.服务器收到请求后,发送页面给浏览器
5.浏览器通过收到的页面(html这些)开始构建DOM树,也就是把这个页面渲染出来
6.如果要关闭的话,再对服务器进行TCP关闭连接(四次挥手)