JS基础

作者: 欢西西西 | 来源:发表于2023-01-21 22:18 被阅读0次

    1. var、let、const

    • var:有变量提升,无块级作用域
    • let:不能重复声明,有块级作用域
    • const:不能重复声明,有块级作用域,声明时必须设置初始值,并且之后不能修改
    image.png

    2. 数据类型

    - 基本数据类型 引用数据类型
    - String、Number、Boolean、null、undefined、Symbol、bigInt Object
    - 值存储在栈内存中 栈内存中存的指针,实际值存在堆内存中
    - - -

    2.1 堆和栈的区别

    • 栈为系统分配,获得的空间较小;堆为人为申请开辟,空间更大;
    • 栈是连续的空间,而堆是不连续的空间
    • 栈比堆运行速度快

    2.2 null和undefined

    • undefined ,字面意思是“未定义的值”,一般都来自于某个表达式最原始的状态值,不是人为操作的结果
    • null 的字面意思是:空值 。一个对象被人为的重置为空对象

    2.3 bigInt

    2.4 Symbol

    image.png
    • Object.keys()只能获取到key为String类型并且enumerable为true的属性,获取Symbol类型的key要用Object.getOwnPropertySymbols()

      image.png
    • 可以用来保护对象的一些属性,防止被随意修改,或者属性直接被覆盖。

    2.5

    image

    3. for-of 可以用来迭代哪些对象

    • 可迭代的对象,比如Array、arguments
    • const isIterable = obj => obj != null && typeof obj[Symbol.iterator] === 'function';来判断对象是否可迭代

    3.1 for-of 和 for-in的区别

    • 不能用for-of迭代普通对象,比如{ name: 'huhu' },因为普通对象的 [Symbol.iterator]是undefined
    • 日常开发就用for-of迭代数组,迭代出value,用for-in迭代普通对象,迭代出key

    4. 类数组与数组

    最本质的区别是:类数组是一个简单对象,和数组的原型关系不同,所以类数组无法调用数组的方法。要使用可以先Array.from(arrayLike)转换成数组

    简单对象.png

    5. 箭头函数和普通函数的比较

    • 箭头函数简化代码
    • 箭头函数没有自己的this和arguments。this指向的是定义时外层函数的this指向,而且无法被call方法修改。没有arguments可以使用扩展运算符来获取参数列表
    • 箭头函数不能用来做构造函数,因为没有this和原型prototype

    6. Set/WeakSet/Map/WeakMap

    • Set 是不重复的值的集合

    • WeakSet 只能是对象的集合
    • WeakSet 持弱引用: 如果一个变量引用一个对象,那这个对象不会被回收。但是如果这个对象的只剩下weakSet中在引用它,那么它会被当成垃圾回收。
    • WeakSet不能被遍历:因为垃圾回收节点是不确定的,回收前后的weakSet可能是不同的

    • Map 存放key-value结构的数据,跟对象的不同是:Map的key可以是任何类型,而对象的key只能是String或者Symbol

    • WeakMap的key只能是对象类型
    • WeakMap 持有的是每个key对象的“弱引用”

    使用场景

    • WeakSet存放dom元素

    • 在Vue3中的使用
      ① 做数据响应式时,proxyMap(WeakMap类型)存放原对象和它的代理对象:proxyMap = new WeakMap(); proxyMap.set(target, proxy)
      ② 为对象收集依赖时,将依赖收集到bucket(WeakMap类型)里:key为原对象,value是一个Map类型,它的key为对象的各属性名,value为Set类型,存属性对应的effect函数

      image.png
    • babel在编译class的私有属性时就使用了WeakMap,保存每个实例以及这个实例对应的私有属性值


      image.png

    7. js中的对象

    image.png

    8. 面向对象的3个特征

    封装:隐藏实现细节,使得代码模块化
    继承:扩展已经存在的类,目的:代码复用
    多态:同类事物,调用相同接口时的表现不同

    9. 数字每满千位加逗号

    • 方法1 toLocaleString()

      image.png
    • 方法2:整数部分使用正则:num.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,')

    10. 数据类型隐式转换

    10.1 加法

    一边有字符串.png 没有字符串.png

    10.2 加法之外的

    空数组的转换.png image.png

    10.3 ==

    image.png image.png

    10.4 > <

    image.png image.png

    11. 创建函数的几种方法

    function foo() {} // 函数声明
    const foo = function() {} // 函数表达式
    const foo = () => {} // 箭头函数
    const obj = {
      foo() {} // 作为对象的方法
    }
    

    12. typeof 和 instanceof 区别

    typeof 检查的是数据的基础类型

    • 返回值为string、number、boolean、undefined、object、symbol、bigInt、function 8种(跟js数据类型相比:少了null,多了funciton)
    • typeof null // 'object'

    instanceof 检测的是实例的原型链上是否包含某个构造函数的prototype

    • 返回的是一个布尔值
    • mycat instanceof Animal

    13. 数组扁平化除了用递归还能怎么做?

    • Array.prototype.flat方法,入参表示层级,不传默认为1,不确定的层级传Infinity

    14. 如何能拿到匿名函数的引用?

    arguments.callee

    function test() {
      console.log(arguments.callee === test) // true
    }
    

    相关文章

      网友评论

          本文标题:JS基础

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