const的值为什么不能变?有变的情况吗?
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
对象类型 引用类型 Object Function 引用地址,保存的只是一个指向实际数据的指针
基本类型 Number Boolean String undefined null 地址固定,值就保存在变量指向的那个内存地址
也就是说,const声明引用类型的对象的话,值是能被改动的 const声明基本类型的值就不能改动
const定义引用数据类,不能修改指针指向新的对象 ,但可以修改它指向的数据。
-
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
。 -
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
-
创建Set实例 使用 new 关键字和 Set 构造函数可以创建一个空集合:
-
Set实例转数组
const s = new Set([1, 2, 3]); Array.from(s); // [1, 2, 3]
-
size属性 size: 获取Set实例的元素个数:
-
add() add(): 添加元素:
-
has() has(): 查询Set实例是否存在某元素(返回布尔值):
-
delete() delete(): 删除Set实例中某个元素(返回布尔值):
-
clear() clear(): 清空Set实例:
-
迭代 keys():返回键名; values(): 返回键值; entries(): 返回键值对; 键名=键值
-
-
判断数据类型的方法?
-
instanceof
-
typeof
-
constructor
-
-
js的数据类型?
-
引用数据类型
对象、数组、函数、正则表达式、Date()、map、set
-
-
事件类型?
-
类型:点击事件(click)、鼠标事件(mouseover、mouseout)、键盘事件(keydown、keyup)、提交事件(submit)、表单事件、焦点事件、窗口事件
-
-
对象新增方法?
-
object.assign()合并
-
Object.keys()
返回自身的(不含继承的)所有可遍历(enumerable)属性的键名的数组
-
Object.values()
返回自身的(不含继承的)所有可遍历(enumerable)属性的键对应值的数组
-
Object.entries()
返回一个对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对的数组
-
Object.is()
严格判断两个值是否相等,与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是
+0
不等于-0
,二是NaN
等于自身
-
-
事件捕获、事件冒泡、事件委托?
-
事件捕获、
-
事件冒泡
-
事件委托
-
-
this指向,改变this指向的三个方法?
-
call
-
bind
-
-
阻止默认事件
-
return false
-
preventDefault()
-
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树绘制完成并且所有的资源下载完成
-