面试题

124 阅读4分钟

juejin.cn/post/684490… juejin.cn/post/684490… juejin.cn/post/696122…

JS有哪几种数据类型:
原始数据类型:7种。UndefinedNullBooleanNumberStringSymbol(ES6)
、BigInt(ES10)。

引用数据类型:Object
prototype和_proto_

github.com/mqyqingfeng…

prototype:是函数和类上面的属性
_proto_:是每一个JS对象都有的一个属性
Person.prototype === person.__proto__

68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f6d717971696e6766656e672f426c6f672f496d616765732f70726f746f74797065352e706e67.png

JS种的this
当函数独自调用的时候,严格模式下,this指向undefind,非严格模式下,this指向window
当用户在浏览器输入地址,按下回车,进行了那几步?
1DNS域名解析,将域名解析为IP地址。
2、建立TCP链接,服务器和浏览器的桥梁(3次握手,关闭连接)
3TCP链接建立成功,浏览器向服务器发送请求,服务器响应
4、关闭TCP链接,浏览器渲染
JS浮点数运算的精度问题
JS在计算0.1+0.2:首先十进制会转换成二进制,但由于浮点数用二进制表达时是无穷的;
0.1 -> 0.0001100110011001……
0.2 -> 0.00011001100110011……
两个相加得 0.01001100110011001100110011
再换成十进制就成了0.30000000004
numObj.toFixed(digits);
parseFloat((2.22 + 0.1).toFixed(10)) ===2.23 
vue组件通信
1、props和$emit
2、$parent和$children
3、$refs
4、vuex
5、provide和inject(祖孙)
    reload是父组件的方法
   父组件:provide(){
       return{
           parentValue:"我是父组件的值啊"
       }
   }
   子组件:inject:{
     parentValue: { // 健名
        from'parentValue'// 来源
        default'parentValue'// 默认值
    }
  }
或者inject:['parentValue']
6、$attrs 和$listener(祖孙)

知识点
基础知识:1、原型、原型链
         2、作用域、闭包
         3、异步、单线程
JS API1DOM操作
        2Ajax
        3、事件绑定
开发环境:1、版本管理
         2、模块化
         3、打包工具
运行环境:1、页面渲染
         2、性能优化
typeof
typeof只能判断基础类型,对于引用类型,没作用。
JS中内置函数
ObjectArrayBooleanNumberStringFunctionDateRegExpError
JSONMath一样是对象
原型和原型链
所有的引用类型(数组、对象、函数),都有一个__proto__属性,属性值是一个普通对象
所有的函数,都有一个prototype属性,属性值也是一普通对象
所有的引用类型(数组、对象、函数),__proto__属性值指向它的构造函数的“prototype”属性值(指向就是===)
obj.__proto__===Object.prototype
当试图得到一个对象的某个属性时,如果这个对象没有这个属性,那么就会去它的__proto__(即它的构造函数的prototype)中寻找。
//构造函数:
function Foo(name,age){
    this.name = name;
}
Foo.prototype.alertName = function(){
    alert(this.name)
}
//创建实例
var f = new Foo('张三');
f.printName = function(){
    console.log(this.name)
}
//测试
f.printName()
f.alertName()

1641885792.png 面试中实际用到的实例:

function Elem(id){
 this.elem = document.getElementById(id);
}
Elem.prototype.html = function(val){
    var elem = this.elem
    if(val){
        elem.innerHTML = val;
        return this
    }else{
        return elem.innerHTML
    }
}
var div1 = new Elem('div1');

instanceof
用于判断引用类型属于哪个构造函数的方法
arr instanceof Array ->true
this
this是函数在哪里调用,this指向哪个对象。
var a = {
    name:'A',
    fn:function(){
        console.log(this.name)
    }
}
a.fn() //this === a
a.fn.call({name:'B'}) //this === {name:'B'}
var fn1 = a.fn();
fn1() //this === window
作用域链
作用域是函数定义的时候,所在的作用域不是调用的时候
闭包
闭包使用场景
1、函数作为返回值
2、函数作为参数传递
异步使用场景
1、定时任务:setTimeoutsetInterval
2、网络请求:promise
3、事件绑定
同步执行完,在解封异步。(单线程)
数组的API
forEarch 遍历所有元素
every判断所有元素是否都满足条件
some判断是否至少有一个元素符合条件
sort排序
map对元素重新组装,生成新数组
JSONP
加载一个不同源的JS文件,服务器动态生成JSON数据并执行callback函数(数据当参数返回),返回给我们,我们通过定义callback函数获取。
window.callback = function(data){
}
<script src="http://coding.immoc.com/api.js"></script>
存储
cookie、sessionStorage、localStorahe区别
cookie:1、本身用于客户端和服务器端通信
        2、但它本身有存储功能,于是被借用
        3document.cookie=
        4、存储太小,只有4kb
        5、所有http请求带着,影响性能
localStory、sessionStory
        1HTML5,5M
Git
git add .
git checkout xxx
git commit -m '注释'
git push
git pull
页面加载
//浏览器访问资源过程
1、浏览器根据DNS服务器得到域名IP地址
2、浏览器向这个IP的机器发送http请求
3、服务器受到、处理并返回http请求
4、浏览器得到返回内容
//浏览器渲染页面过程
1、根据HTML机构生成DOM Tree
2、根据CSS生成CSSOM
3、将DOMCSSOM整合形成RenderTree
4、根据RenderTree渲染和展示
5、遇到<script>时,会执行并阻塞渲染
性能优化
//加载资源优化
1、静态资源的压缩合并
2、静态资源缓存
3、使用CDN让资源加载更快
4、使用SSR后端渲染,数据直接输出到HTML//渲染优化
1、css放前面,JS放后面
2、懒加载
3、减少DOM查询、减少操作
4、事件节流
模块化