补充知识漏洞

const的值为什么不能变?有变的情况吗?

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。

但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

对象类型 引用类型 Object Function 引用地址,保存的只是一个指向实际数据的指针

基本类型 Number Boolean String undefined null ​ 地址固定,值就保存在变量指向的那个内存地址

也就是说,const声明引用类型的对象的话,值是能被改动的 const声明基本类型的值就不能改动

const定义引用数据类,不能修改指针指向新的对象 ,但可以修改它指向的数据。

  1. arguments?

    是JS所有函数都可以使用的类数组对象,包含传递给函数的所有参数

    类数组:类似类数组,不是真正真正数组,有length属性,没有数组方法

    函数作用域:arugments只在函数体内有效,不能再全局作用域或者函数外部使用

    动态性:即使函数定义了参数,arguments对象会包含所有参数(也包含定义列表中没有的)

    访

    问arugments对象:

            function add() {
      let sum = 0;
      for (let i = 0; i < arguments.length; i++) {
        sum += arguments[i];
      }
      return sum;
    }
    ​
    console.log(add(1, 2, 3, 4)); // 输出: 10

    不适用于箭头函数:arguments 对象在箭头函数中不可用。箭头函数不会创建自己的 arguments 对象,而是继承自父作用域的 arguments

  2. Set结构的api?

    初始化

    增删改查

    基本API

    const s = new Set(); 1 如果想在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象,其中需要包含插入到新集合实例中的元素(Set 可以包含任何 JavaScript 数据类型作为值):

    const s = new Set(["val1", 1, true, {}, undefined, function fun() {}]); 1 注意:Set结构不会添加重复的值 经常用Set解决数组去重问题

    const s = new Set();
    s.add(1).add(2).add(3);
    Array.from(s); // [1, 2, 3]
    s.clear();
    Array.from(s); // []
    ​
    const s = new Set();
    s.add(1).add(2).add(3);
    Array.from(s); // [1, 2, 3]
    s.clear();
    Array.from(s); // []

    for-of:

    const s = new Set();
    s.add(1).add(2).add(3);
    for (const i of s) {
        console.log(i);
    }
    

    forEach

    const s =new Set();
    s.add(1).add(2).add(3);
    s.forEach((value,key)=>console.log(key+':'+value));
    //1:1
    //2:2
    //3:3
    1. 创建Set实例 使用 new 关键字和 Set 构造函数可以创建一个空集合:

    2. Set实例转数组

      const s = new Set([1, 2, 3]);
      Array.from(s); // [1, 2, 3]
    3. size属性 size: 获取Set实例的元素个数:

    4. add() add(): 添加元素:

    5. has() has(): 查询Set实例是否存在某元素(返回布尔值):

    6. delete() delete(): 删除Set实例中某个元素(返回布尔值):

    7. clear() clear(): 清空Set实例:

    8. 迭代 keys():返回键名; values(): 返回键值; entries(): 返回键值对; 键名=键值

  3. 判断数据类型的方法?

    1. instanceof

    2. typeof

    3. constructor

  4. js的数据类型?

    1. 引用数据类型

      对象、数组、函数、正则表达式、Date()、map、set

  5. 事件类型?

    1. 类型:点击事件(click)、鼠标事件(mouseover、mouseout)、键盘事件(keydown、keyup)、提交事件(submit)、表单事件、焦点事件、窗口事件

  6. 对象新增方法?

    1. object.assign()合并

    2. Object.keys()

      返回自身的(不含继承的)所有可遍历(enumerable)属性的键名的数组

    3. Object.values()

      返回自身的(不含继承的)所有可遍历(enumerable)属性的键对应值的数组

    4. Object.entries()

      返回一个对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对的数组

    5. Object.is()

      严格判断两个值是否相等,与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身

  7. 事件捕获、事件冒泡、事件委托?

    1. 事件捕获、

    2. 事件冒泡

    3. 事件委托

  8. this指向,改变this指向的三个方法?

    1. call

    2. bind

  9. 阻止默认事件

    1. return false

    2. preventDefault()

    3. returnValue

补充考核知识点

setInterval

setTimeOut

localStorage积分排行榜存储积分或者游戏进度
  • 存储:localStorage.setItem(‘key’, value)

    将要存储的数据转换为字符串,再进行存储JSON.stringify(xxx))

  • 读取:localStorage.getItem(‘key’)

    • setItem 方法接受两个参数:第一个参数是键(key),用于标识存储的数据;第二个参数是值(value),即要存储的数据本身。

  • 获取:获取后的数据是字符串,所以可以对字符串的数组进行数组转换 JSON.parse(xxx)

  • 删除:

    • 删除部分:localStorage.removeItem(‘key’)

    • 全部删除:localStoerage.clear()

  • 优点

    • localStorage 拓展了 cookie 的 4K 限制。

    • localStorage 会可以将第一次请求的数据直接存储到本地,这个相当于一个 5M 大小的针对于前端页面的数据库,相比于 cookie 可以节约带宽,但是这个却是只有在高版本的浏览器中才支持的。

  • 缺点

    • 浏览器的大小不统一,并且在 IE8 以上的 IE 版本才支持 localStorage 这个属性。 目前所有的浏览器中都会把localStorage的值类型限定为string类型,这个在对我们日常比较常见的JSON对象类型需要一些转换。 localStorage在浏览器的隐私模式下面是不可读取的。 localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。 localStorage不能被爬虫抓取到。 localStorage 与 sessionStorage 的唯一一点区别就是 localStorage 属于永久性存储,而 sessionStorage 属于当会话结束的时候,sessionStorage 中的键值对会被清空。

    逻辑运算符

    js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。

    当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下:

    1.&&

    1.1两边条件都为true时,结果才为true; 1.2如果有一个为false,结果就为false; 1.3当第一个条件为false时,就不再判断后面的条件

    注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值。

    2.||

    2.1只要有一个条件为true时,结果就为true; 2.2当两个条件都为false时,结果才为false; 2.3当一个条件为true时,后面的条件不再判断

    注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;

    3.!

    3.1当条件为false时,结果为true;

    toFixed()四舍五入

    toFixed() 是 JavaScript 中数字类型(Number)的一个方法,用来将数字转换为指定小数位数的字符串表示形式。

    使用方式和示例: let num = 123.45678; let fixedNum = num.toFixed(2); console.log(fixedNum); // 输出 "123.46"

    解释: toFixed() 方法:

    toFixed() 方法接受一个参数,表示希望保留的小数位数。它返回一个表示当前数字固定小数位数的字符串。如果当前数字本身的小数位数少于指定的小数位数,则会用零来补足。 参数:

    参数是一个整数,表示要保留的小数位数,范围是 0 到 100。超出这个范围的值将被截断为 0 或 100。 返回值:

    toFixed() 方法返回一个字符串,该字符串表示了数字固定小数位数后的形式。需要注意的是,返回的结果是一个字符串而不是一个数字,所以需要根据需要进行类型转换或者直接使用字符串。 小数处理:

    toFixed() 方法对于四舍五入的处理是基于当前小数的情况的。例如,如果原数字是 123.456,使用 toFixed(2) 将会得到 "123.46",因为它会四舍五入到指定的小数位数。

    实现JS异步加载的三种方法

    一、为什么要写异步加载:

    ①js加载本身是属于同步加载的,加载js文件会阻塞文档,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。但是有些工具方法需要按需加载,有一些工具js文件它是不会改变页面的,用到再加载,不用不加载。

    ②但是实际开发中我们只需要把script标签放在页面的最下面。完全没有必要写赘余代码,但是按需加载一定是面试的重中之重!!!

    二、JS异步加载的三种方案:

    ①defer

    script标签中增加defer属性,异步加载

    1.但要等dom文档全部解析完(dom树生成)才会被执行。

    2.只有IE能用;

    ②async

    script标签中增加async属性,异步加载

    1.加载完就执行;async只能加载外部脚本

    2.不能把js写在script标签里。

    3.w3c标准,IE9以下不支持

    ③封装一个函数兼容性的异步加载js文件并且可以按需执行该文件里面的函数(按需加载)

    <script> function loadScript(url,callback){ //url是按需加载的js文件 //callback是按需加载的js文件中某个函数

            // 1. 创建一个script标签
            var script = document.createElement('script');    
            // 处理ie的兼容
            if(script.readyState){
                script.onreadystatechange = function(){
                    // 如果script已经下载完成
                    if(script.readyState == 'complete' || script.readyState == 'loaded'){
                        callback();
                    }
                }
            }else{
                // 监听script的下载的状态 当状态变为下载完成后 再执行callback
                script.onload = function(){
                    callback();
                }
            }
            //在后面引入的目的是如果在IE上如果下载太快(比读程序还快)
            //IE的readystatechange 事件检测状态码的时候,它早已经从loading变成complete或者loaded(以极快的速度加载完了文件,你还没来得及检测)
            // 那你再检测它就不会变了,它一直都是complete或者loaded
            //这个时候就是马后炮了,检测也没用了。
            // 2. 给script标签添加src 引入一个js文件
            script.src = url;
            // 3. 追加到body
            document.body.appendChild(script);
        }
    </script>

    三、最后补充: document三个状态

    ①loading 加载中状态,dom树正在绘制中

    ②interactive 活跃状态,dom树绘制完成

    ③complete 完成状态(老版本的浏览器可能是loaded),dom树绘制完成并且所有的资源下载完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值