Javascript

181 阅读7分钟
  • JS 数据类型有哪些?分别是如何存储的?

    • JS 共有 8 种数据类型
      1. 7 种基本数据类型:undefined、null、booblean、number、string、symbol(es6新增)、bigint(es10新增)
      2. 1 种引用数据类型:object,包括:function、object、array
    • 如何存储
      1. 基本数据类型存储在栈中,占用空间小,大小固定
      2. 引用数据类型存储在栈和堆中,占用空间大,大小不固定。引用数据类型在栈中存储指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获取实体。
  • ES5 中如何实现继承?有哪些继承的实现方式?

  • 基本数据类型和引用数据类型有何区别?

    • 基本数据类型,是按值访问的,变量之间拷贝后,修改其中一个不影响其他变量存储的值;

    • 引用数据类型,是保存在堆中的对象。与其他语言不同,不能直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈中的引用地址。

    • 区别

      1. 声明变量时分配的内存空间不同;
      2. 访问机制不同
      3. 复制变量时不同,引用类型只是将变量在栈中的地址指针进行了复制,在堆中共用同一份实体,可以理解为复制变量就多了一份栈内指针的实体引用;
      4. 参数传递不同:首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。对于引用类型变量而言,函数传参时传递的是该变量在栈中存储的实体引用。
  • 原型链是什么?

  • 谈谈作用域?

  • 谈谈对 this 指向的了解?

  • JS 中对象遍历的方法有哪些?

    1. for...in 循环遍历对象自身的和继承的可枚举属性(循环遍历对象自身的和继承的可枚举属性(不含Symbol属性).).
    2. Object.keys()遍历 (返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).).
    3. Object.getOwnPropertyNames(obj),返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).
    4. Reflect.ownKeys(obj)遍历返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.
    5. Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性
  • JS 中数组遍历的方法有哪些?

    1. for 循环
    2. foreach 循环,注意有三个参数
    3. map 循环,注意有三个参数
    4. forof遍历可以正确响应break、continue和return语句
    5. filter遍历不会改变原始数组,返回新数组
    6. every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。
    7. some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。
    8. reduce接受一个函数,函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组
    9. reduceRight()方法的功能和reduce()功能是一样的,不同的是reduceRight()从数组的末尾向前将数组中的数组项做累加。
    10. find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined
    11. 对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1。findIndex 不会改变数组对象。
    12. ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
  • JS 数组常用的方法有哪些?

    1. push,数组尾部添加一个新元素
    2. pop,删除数组尾部一个元素,并返回该元素
    3. shift,删除数组头部第一个元素,并返回该元素
    4. unshift,数组首部添加一个元素,并返回数组
    5. concat,数组拼接
    6. join,数组元素转为字符串,并以参数作为分隔
    7. toString, 数组元素转为字符串
    8. split,
    9. reverse,数组倒序
    10. sort,数组排序
    11. slice(start,end),返回数组指定元素
    12. splice(index,howmany,item1,.....,itemX),删除元素并添加新元素
  • 谈谈变量提升?

  • JS 精度丢失问题?

    • JS 精度丢失的典型问题

      1. 浮点数相加
      0.1 + 0.2 != 0.3 // true
      
      1. 大整数运算
      9999999999999999 == 10000000000000001 // true
      
      1. toFixed 不会四舍五入
      1.335.toFixed(2) // 1.33
      
    • JS 精度丢失的原因 计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。

    • 精度丢失的解决方案 zhuanlan.zhihu.com/p/100353781

  • JS 中如何处理二进制数据?(蓝牙通讯等涉及)

  • 重点!!!谈谈 JS 异步编程解决方案?

  • 重点!!!谈谈对 Promise 的理解?如何实现一个 Promise?如何实现 Promise.all 方法?

  • co 库的执行原理?

  • 什么是严格模式?与普通模式有何差别?

    • 使得Javascript在更严格的条件下运行。
    • 严格模式对Javascript的语法和行为,都做了一些改变
      1. 全局变量显式声明

        在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

      2. 静态绑定

        (1)禁止使用with语句

        (2)创设eval作用域

      3. 增强的安全措施

        (1)禁止this关键字指向全局对象

        ```
        function f(){
             return !this;
         } 
         // 返回false,因为"this"指向全局对象,"!this"就是false
         function f(){ 
             "use strict";
             return !this;
         } 
         // 返回true,因为严格模式下,this的值为undefined,所以"!this"true

        (2)禁止在函数内部遍历调用栈

      4. 禁止删除变量

        严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除

      5. 显式报错

        正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。

        严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

        严格模式下,对禁止扩展的对象添加新属性,会报错。

        严格模式下,删除一个不可删除的属性,会报错。

      6. 重名错误

        (1)对象不能有重名的属性

        (2)函数不能有重名的参数

      7. 禁止八进制表示法

      8. arguments对象的限制

      9. 函数必须声明在顶层

      10. 增加了一批保留字

  • string 和 array 有哪些常用方法?

  • 使用过闭包吗?谈谈闭包的使用场景?如何正确的使用闭包?

  • 使用过扩展运算符吗?

  • 有使用过 Proxy 和 Reflect 吗?

  • 谈谈对 Generator 函数的理解?

  • 有用过 ES6 的 Class 吗?和 ES5 实现的继承有何区别?

  • ES6 对 ES5 做了哪些扩展?(函数、数组、对象、运算符)

    • 箭头函数
    • 模板字符串
    • 块级作用域
    • 默认参数
    • 类定义与继承
    • for...of 运算符
    • 展开操作符
    • Promise
    • 模块导出和导入
  • IIFE 是立即调用函数表达式

  • symbol 使用场景?

  • 在 ES6 中使用展开(spread)语法有什么好处? 它与剩余(rest)语法有什么不同?

  • call、apply、bind 区别?

  • 变量提升和函数提升是什么?

  • 临时死区?

  • Map 和 weakMap 区别?

  • 了解函数柯里化吗?

  • JS 对象的浅拷贝和深拷贝?