JavaScript
延迟加载 js 的方法有哪些?
defer
(属性):HTML 全部解析完成,才会执行 JS 代码,并且是按顺序执行。async
(属性): HTML 解析和 JS 执行同时进行,不是按顺序执行(谁先加载完,谁先执行)。- 动态创建
script
标签,并插入页面。
var、let、const 的区别?
-
var
:- 声明的变量是全局变量。
- 可以跨函数访问。
- 存在变量提升(也就是变量声明会被提升到其所在作用域的顶部)。
- 可以在同一作用域内多次声明同一变量,后面的声明会覆盖前面的。
-
let
:- let 引入了块级作用域,这意味着它们声明的变量只在声明它们的代码块(例如,if 语句、for 循环等)内有效。
- let 不会发生变量提升,如果在声明前访问这些变量,会导致引用错误(ReferenceError)。
- let 在同一作用域内不允许重复声明变量。
-
const
:- const 声明的变量是只读的,不能重新赋值。
- const 声明的变量必须初始化,否则会报错。
暂时性死区
-
指的是使用
let
或const
声明变量的时候所产生的一个特殊区域,变量虽然已经声明但还没有被初始化,因此变量无法访问,此时访问的话会报引用错误。 -
简单来说就是在一个作用域内,从变量被声明的位置开始到生命变量的语句执行完毕之前的区域,就是暂时性死区。
-
注意:
- 在这个区域内,该变量既不能读取耶不行写入。
- 在这个区域内,变量会被提升,但不会被初始化。
JS 数据类型有哪些?
- 基本数据类型:
number
、string
、boolean
、null
、undefined
、symbol
、bigint
- 引用数据类型:
object
(Array、Function、Date、RegExp、Set、Map…)
JS 中的内置对象?
Date Array Boolean Number Map Set Math Promise RegExp Symbol
JS 判断数据类型的方法?
console.log(typeof null); // object
console.log(Object.prototype.toString.call("123")); // [object String]
console.log([1, 2, 3].constructor); // Array() { [native code] }
原始值类型和引用值类型有什么区别?
原始值类型:直接存储数据值,存于栈中,复制是值拷贝,修改一个不会影响另一个。
引用值类型:存储的是数据的地址,实际数据位于堆中,复制时共享同一地址,修改一个会影响所有引用该地址的变量。
null 和 undefined 的区别?
null
: 表示一个空对象指针,会被隐式转换成 0,不容易发现错误。undefined
: 表示一个未定义的值,转换为数值时为NaN
。
== 和 === 的区别?
==
:只比较值是否相等,不比较数据类型,会隐式的通过valueOf()
转换。===
:不仅比较值是否相等还会比较数据类型是否相等。
continue 和 break 的区别?
continue
:退出本次循环,一般用于排除或者跳过某一个选项的时候,可以使用 continue。break
:退出整个循环,一般用于结果已经得到,后续的循环不需要的时候可以使用。
数组去重的方式有哪些?
- Set()
let array = [1, 1, 2, 2, 3, 3, 4, 5, 6];
const arr = [...new Set(array)];
console.log(arr);
- for()循环
let array = [1, 1, 2, 2, 3, 3, 4, 5, 6];
for (let i = 0; i < array.length; i++) {
const index = array.indexOf(array[i], i + 1);
if (index !== -1) {
array.splice(index, 1);
i--;
}
}
console.log(array);
- indexOf()
let array = [1, 1, 2, 2, 3, 3, 4, 5, 6];
function removeDuplicate(arr) {
const newArr = [