美文网首页
JS 中可能被你忽视的高频面试题

JS 中可能被你忽视的高频面试题

作者: 酷酷的凯先生 | 来源:发表于2021-02-27 18:25 被阅读0次

# 说说 JS 预编译/处理

JS解释性 语言,就是从上到下从左到右逐行解析,逐行执行。
预编译JS 在真正被解析之前,JS 引擎先把整个文件进行预处理并消除一些歧义的过程。

全局 / 局部 预编译过程大致如下:

  1. 产生全局对象 window
  2. 查找所有变量,并把查找到的变量作为 window 的属性,值为 undefined
  3. 查找所有函数,并把查找到的函数作为 window 的属性,值为 function
  4. 全局预编译结束,代码从上到下从左到右依次执行。

当执行到调用函数时,开始了局部预编译:

  1. 代用函数时,产生了函数的活动对象 AO
  2. 查找函数内部变量并作为 AO 的属性,值为 undefined
  3. 这时函数如果有传参的话,把传过来的参数赋值给形参。
  4. 查找函数内部函数并作为 AO 的属性,值为 function
  5. 局部预编译结束,开始从上到下从左到右依次执行代码。

有的地方说,函数优先级比变量高,所以在变量提升和函数提升时,变量会被同名函数覆盖,其实原理还是预处理的过程是先变量后函数。
优先级为:函数 > 实参 >局部变量

# 说说全局对象/变量/函数

全局对象(Global Object)
在浏览器环境中,JS 引擎会整合所有 <script>标签的内容,产生 window 这个全局对象。
node 环境中会产生 global 对象
在所有 <script> 标签里内容执行完后销毁

全局变量
<script> 标签中声明的 变量,会作为 window的属性 存在

全局函数
<script> 标签中声明的 函数,会作为 window的方法 存在

# 说说活动对象/局部变量/函数

活动/激活对象(Activation Object)
在函数调用时产生,用来保存当前函数内部的执行环境,也叫 执行期上下文
在函数调用结束时销毁

局部变量
在函数内部声明的 变量,作为 AO 对象的 属性 存在

局部函数
在函数内部声明的 函数,作为 AO 对象的 方法 存在

# 给出下面的思路和答案

let a = ?
if(a==1&&a==2&&a==3){
    console.log('123');
}
描述:a 等于什么值时,可以使表达式成立

其实这道题想考察的,就是我们对 取值 的理解 和 隐式转换的理解。
比如 [10] == 10 ==> true
其实是 [10] 隐式转换了字符串即 Number([10].toString()) == 10
这里 == 比较值时有这么几个规律:

  1. 对象 == 字符串对象.toString()转换为字符串
  2. nullundefined 相等,和其他值不相等
  3. NaN 和任何值都不相等包括自己
  4. 其余的都转换为数字

解题思路大致分为两大类:toStringdefineProperty

法一:toString 重写

let a = {
    i: 0,
    toString(){
        return ++this.i;
    }
}
if(a==1 && a==2 && a==3){
    console.log('条件成立');
}

或者

var a = [1,2,3];
a.toString = a.shift;
if(a==1 && a==2 && a==3){
    console.log('条件成立');
}

法二:defineProperty 数据劫持

var i = 0;
Object.defineProperty(window,'a',{
    get(){
        return ++i;
    }
})

if(a==1 && a==2 && a==3){
    console.log('条件成立');
}

# 一个青蛙一次可跳一个或者两个台阶,求 n 个台阶有多少种跳法

实际上就是斐波那契数列,递归实现

function JumpFloor( n){
    if(n<=0){
        return -1;
    }
    if(n==1 || n==2){
        return n;
    }
    else{
        return cal(n-1)+cal(n-2);
    }
}

# 说说 var let const

  1. ·var· 声明的变量有声明提前
    可以声明不赋值
    可以声明相同的变量名,后边会覆盖前面的
  2. let 声明的变量没有声明提前
    可以声明不赋值
    同一个作用域下不能重复定义同一个名称,会报错
    有严格的函数和块级作用域
  3. const 声明的变量没有声明提前
    不可以声明不赋值,会报错
    声明的常量是只读的,不可以修改
    声明的对象和数组,可修改其元素,但引用地址不可修改

# 实现一个页面滚动,图片懒加载的js库(快速滑动/滚动,img经过可视区时,不加载图片)

# 实现小球落地的过程

image.png

相关文章

  • JS 中可能被你忽视的高频面试题

    # 说说 JS 预编译/处理 JS 是 解释性 语言,就是从上到下从左到右逐行解析,逐行执行。预编译:JS 在真正...

  • 2021 web高频面试题新人可看

    当日目标 1 常见面试题分布情况? 2 高频面试题 1 常见面试题分布情况 公司面试题一般分为js,vue,小程序...

  • Java并发高频面试题

    前面整理了Java基础、Mysql、Spring的高频面试题,今天为大家带来Java并发方面的高频面试题,因为并发...

  • js 高频面试题(最新)

    1、深浅拷贝 (1) 定义 浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引...

  • JS 高频面试题汇总

    # 说一下JS 中的数据类型有哪些 JS 数据类型包括 基本 / 引用 / 特殊 数据类型: 基本数据类型:Str...

  • 深拷贝实践

    前言:js如何实现一个深拷贝 这是一个老生常谈的问题,也是在求职过程中的高频面试题,考察的知识点十分丰富,本文将对...

  • Android 高频面试题汇总 ------- 无答案

    高频面试题 架构 项目框架模式 模块化/组件化 面向对象思想构建项目 设计模式 高频面试题 Handler原理及问...

  • JS中可能被你忽略的几个知识点

    String.raw() String.raw() 是一个模板字符串[https://developer.mozi...

  • 2021-02-21 大厂面试必问之SpringBoot核心原理

    解决几个高频的面试题 SpringBoot中常用的注解有哪些 SpringBoot中什么是自动装配 SpringB...

  • 被你忽视的细节

    今天下午参加一个会议,关于耕地质量土壤地球化学的一个研讨会。早上收到会议方案,科室领导下乡,马上电话联系汇报。

网友评论

      本文标题:JS 中可能被你忽视的高频面试题

      本文链接:https://www.haomeiwen.com/subject/fcpegktx.html