【js基础面试 简单问题】

好久好久没有写博客了,发完这篇也会去改之前的文章,更完善一下~
我的笔记放在了gitee上,之后会搬家到github (ps:超级详细,不断扩大)
github https://github.com/thesecondlight
https://github.com/thesecondlight/learnHouse

  1. new关键字做了什么
1.创建一个新对象
2.新对象的proto 指向构造函数的prototype
3.newObj.call(obj)改变this指向构造函数的实例
4.没有人为指定类型就返回对象,否则直接返回那个对象类型
  1. 根据时间和type(时间相同,type为A在前)排序 localeCompare
const arr = [
 {id: 1, value : "value1", date: "2022-08-08", type: "B"},
 {id: 2, value : "value2", date: "2022-08-08", type: "A"},
 {id: 3, value : "value3", date: "2018-08-10", type: "A"},
 {id: 4, value : "value4", date: "2018-08-10", type: "B"},
 {id: 5, value : "value5", date: "2018-08-10", type: "B"},
 {id: 6, value : "value6", date: "2018-08-10", type: "B"},
 {id: 7, value : "value7", date: "2018-08-10", type: "B"},
 {id: 8, value : "value8", date: "2018-08-11", type: "B"}
];

arr.sort((a, b) => a.date.localeCompare(b.date) || a.type.localeCompare(b.type));

  1. js循环怎么中断
break continute
return
forEach的return只能停止本次执行, 不影响整个循环
map没有跳出概念, 只是停了本次执行, 返回一个新数组
for循环 用break跳出整个循环, continue跳出本次
  1. 线程进程
线程
   js线程,浏览器线程
    js单线程   为什么是单线程,
    js作为浏览器的脚本语言,主要是实现用户和浏览器的交互,操作dom,决定了他只能是单线程,避免带来复杂的同步问题
---既然js是单线程,那setTimeout,回调,onClick是怎么实现的,是由浏览器多线程辅助实现
-->
   浏览器多线程
   (
   GUI渲染线程 定时器触发线程(setTimeout) eventLoop轮询处理线程 浏览器事件线程(onClick) JS引擎线程
   异步http请求线程
   ) 
    GUI渲染线程 渲染界面,布局绘制 重绘回流时该线程会执行
    js引擎 处理解析js脚本
   GUI和js引擎互斥 js引擎执行时,GUI被挂起
   GUI图形用户界面
   

   --进程和线程
   进程是指系统分配的内存(进程是cpu资源分配的最小单位),
   进程之间相互独立(可以通信,代价大),
   多个线程在其中协作工作,一个进程由1-n个线程组成,同意进程下的线程共享程序的内存空间

   --浏览器多进程
   brower进程 主进程(管理,调控) only one 
       界面显示,用户交互【前进,后退】
       各个页面的管理
       网络资源的管理下载
   第三方插件进程
   GPU进程 only one 3d绘制
   浏览器渲染进程 
  1. BigInt

BigInt  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
为了防止损失精度 当值大于2的53次方时,使用BigInt,并且不在Number和BigInt之间相互转化
由于对 BigInt 的操作不是常数时间的,因而 BigInt 不适合用于密码学。【密码学 比较时间,攻击?】
对任何 BigInt 值使用 JSON.stringify() 都会引发 TypeError,因为默认情况下 BigInt 值不会在 JSON 中序列化。但是,如果需要,可以实现 toJSON 方法:
BigInt.prototype.toJSON = function() { return this.toString(); }
JSON.Stringify(BigInt(1))
const bigNumber=BigInt(9007199254740992);  //2**53-1=9007199254740992
const bigNumber=9007199254740992n;
使用typeof检测时
typeof 1n === 'bigint' //true
typeof BigInt("1") === 'bigint' //true
使用object包装后,会认为是一个Object
typeof Object('1n') === 'object' //true
typeof Object('1n') === 'bigint' //false
用Object.prototype.toString.call(Object(1n)) =>'[Object BigInt]'
  1. setTimeout 默认几秒
1.HTML5 标准规定了setTimeout()的第二个参数的最小值,即最短间隔,不得低于4毫秒。如果低于这个值,就会自动增加。在此之前,老版本的浏览器都将最短间隔设为10毫秒。
2.队列中没有其他消息等待执行,才执行setTimeout 
3.time仅代表最小延迟时间,不是确切的等待时间  setTimeout并不能保证执行时间,是否及时取决于js线程是否拥挤
  1. 事件循环
    我的脑子就是,先同步,后异步,异步里有宏任务微任务
    同步执行完了,执行微任务,最后宏任务,记一下微任务宏任务分别有什么
定义:事件循环是node.js处理非阻塞i/o操作的机制,当其中一个操作完成后,内核通知node.js把适合的回调函数添加到轮询执行队列中,等待时机执行
执行顺序:
    同步
    process.nextTick(属于微任务)
    微任务  .then
    宏任务 script 定时器 ajax 读取文件
    setImmediate (执行不一定比宏任务快或者慢 放入一个 I/O 循环内调用,setImmediate 总是被优先调用)
做题:
setTimeout(function () {
    console.log('1')
});

new Promise(function (resolve) {
    console.log('2');
    resolve();
}).then(function () {
    console.log('3')
});

console.log('4');
//2 4 3 1
还有一个复杂的,但是也不难,理解了就好了
async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
    console.log('async2');
}
console.log('script start');
setTimeout(function() {
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');

  1. position
position: absolute relative fixed static
absolute 绝对定位 相对于static定位以外的第一个父元素定位
relative 相对定位 相对于元素的位置定位
fixed 相对于浏览器窗口定位
static 默认值,没有定位,出现在正常流中 (忽略上下左右,z-index)
inherit 从父元素继承position属性的值
  1. http缓存机制
http缓存机制  (浏览器和服务器之前通信就是通过http协议,http协议就是客户端发送请求,服务器回送响应)
强缓存(强制缓存),协商缓存
强缓存: 缓存数据未失效,不需要再和服务器进行交互 response中的cache control max-age=*s 命中强缓存 nocache未命中
协商缓存:需要进行比较判断是否可以使用缓存
两类缓存可以同事存在,强缓存优先级高于协商缓存,就是缓存生效的情况下,不再执行协商缓存规则
  1. http和https
http 超文本传输协议 目的是保证客户端和服务器之间的通信,工作方式是客户端和服务器之间的请求-应答协议
 传输数据,未加密的,明文 端口 80 
https ssl加密传输协议 是http的安全版,在http下加入ssl层,安全基础就是ssl,加密需要ssl 端口443
如何加密:ssl加密  
数字证书加密
对称加密
非对称加密
  1. promise和async区别联系
 promise 介绍:
 * 异步编程的一种解决方案,比传统的解决方案 回调函数 更合理 
 * es6将其写进了语言标准,统一了用法,原生提供了promise对象
 * 简单来说就是是个容器,里面放着未来发生的事件结果 
 * 有三种状态 pending fulfilled  rejected  进行中 已成功 已失败
 * promise缺点: 
 *  无法取消Promise,一旦新建它就会立即执行,无法中途取消。
    如果不设置回调函数,promise内部抛出的错误,不会反应到外部。
    当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

 * 一些补充:
 *  es6新增的引用类型,可以通过new来实例化对象
 *  为了解决回调地狱{{{}}} 多层嵌套
 * 
 * promise 就会 .then() .then() .then() 链式调用似的代码更直观
 *  回调
    promise.all() 并行,都有了返回,才有返回
    promise.race()  有一个有返回(最先解决或者拒绝)就返回 
    await返回一个promise对象
    使用await可以用try catch处理JSON.parse错误

和async的区别 
async使异步操作更方便,更好的语义化 async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
await后面 可以是promise或者原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)
返回值是promise
try...catch...

async函数可以看成多个异步操作,包装成的一个promise对象,而await就是then的语法糖
  1. 手写promise
    要不,你看我仓库?或者找个视频看看,我贴个简单的
class Promise{
    constructor(executor){
      // 初始化state为等待态
      this.state = 'pending';
      // 成功的值
      this.value = undefined;
      // 失败的原因
      this.reason = undefined;
      let resolve = value => {
         console.log(value);
        if (this.state === 'pending') {
          // resolve调用后,state转化为成功态
          console.log('fulfilled 状态被执行');
          this.state = 'fulfilled';
          // 储存成功的值
          this.value = value;
        }
      };
      let reject = reason => {
         console.log(reason);
        if (this.state === 'pending') {
          // reject调用后,state转化为失败态
          console.log('rejected 状态被执行');
          this.state = 'rejected';
          // 储存失败的原因
          this.reason = reason;
        }
      };
      // 如果 执行器函数 执行报错,直接执行reject
      try{
        executor(resolve, reject);
      } catch (err) {
        reject(err);
      }
    }
  }
  1. 闭包
定义 当一个函数的参数或者私有变量被内部函数使用,就形成了闭包
优劣 
好处:延长了生命周期 私有变量
坏处,占用内存 处理速度变慢
应用场景 需要维护内部变量  封装模块
  1. let const var
var 声明提升 变量覆盖 没有块级作用域 作用域是他声明的上下文 或者在函数外就是全局
let 块级作用域
const 声明之后必须赋值 定义常量 不能修改(基本数据类型不能修改,也就是不能改地址,但是object可以改,set,push) 块级作用域
const 定义的东西,可以改变属性,不能改变指向

  1. 防抖节流
防抖节流
防抖  触发结束后n秒后执行,如果再次触发,就重新计算时间
节流  n秒后执行一次,n秒的失效时间
注意 fun.apply(obj,arguments) obj替代fun的this
call 接收的是参数列表
apply 接收参数‘数组’ []
bind 返回的是函数
都是改变this指向

防抖 多次触发,触发结束的最后一次,n秒后执行
节流 n秒后执行一次,记录执行时间,lasttime,看触发的时候过没过lasttime+time
    在触发看在不在失效时间内

具体实现看仓库,我贴个节流

function _throttle(fun, time = 2000) {
    let lasttime, timer;
    return () => {
        let now = new Date();
        if (lasttime && now < lasttime + time) {
            clearTimeout(timer);
            timer = setTimeout(() => {
                lasttime = now; //last12 下一次now16 >1+2 进入else
            }, time);
        } else {
            lasttime = now;
            fun.apply(this, arguments);
        }
    }
}
  1. 适配
media媒体查询
flex
rem
viewport 移动端适配,设置宽度,缩放值什么的

eg:media 根据不同的屏幕尺寸设置不同的样式
@media:screen and (max-width:300px){
    body{
        width:300px;
        background-color:grey;
    }

}

rem: documentElement.style.fontSize = 100 * (documentElement.clientWidth / 750) + "px"
  1. MVVM
定义:MVVM 软件架构设计模式 mvc的改进版
    M:数据访问层
    VM:公共属性和命令
    V:视图层  结构布局外观

    小结:将结构布局和业务逻辑分开,通过vm在结构布局和业务逻辑之间进行通信

    优势:
    1.低耦合 视图层和数据层分开,耦合度降低
    2.可重用性高
    3.分层开发,便于维护   (样式在一起,逻辑在一起,分开的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值