1、let、const、var 的区别
1.是否存在变量提升?
var声明的变量存在变量提升(将变量提升到当前作用域的顶部)。即变量可以在声明之前调用,值为undefined
let和const不存在变量提升。即它们所声明的变量一定要在声明后使用,否则报ReferenceError错
2.是否存在暂时性死区?
let和const存在暂时性死区。即只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
3.是否允许重复声明变量?
var允许重复声明变量。
let和const在同一作用域不允许重复声明变量。
2、BOM、DOM有什么区别?
(1)DOM文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在HTML中使用扩展的HTML。DOM将整个页面抽象为一组分层节点。
DOM通过创建表示文档的树,让开发者可以随心所欲的控制网页的内容和结构。使用DOM API可以轻松地删除、添加、替换、修改节点。
对浏览器而言,DOM就是使用ECMAScript实现的,如今已经成为JavaScript语言的一大组成部分。
言而言之,DOM提供与网页内容交互的方法和接口。
(2)BOM IE3和Netscape Navigator3提供了浏览器对象模型(BOM)API,用于支持访问和操作浏览器的窗口。使用BOM,开发者可以操控浏览器显示页面之外的部分。
3、JavaScript中代码后加不加分号;有什么区别?
- 加分号有助于防止省略造成的问题
- 避免输入内容不完整
- 便于开发者通过删除空行来压缩代码(如果没有结尾的分号,只删除空行,则会导致语法错误)
- 加分号有助于提升性性能,因为解析器会尝试在合适的位置补上分号以纠正语法错误。
4、数据类型
- 空值(null):用于未知的值 —— 只有一个 null 值的独立类型。
- 未定义(undefined): 用于未定义的值 —— 只有一个 undefined 值的独立类型。
- 布尔值(boolean):用于 true 和 false。
- 数字(number):用于任何类型的数字:整数或浮点数,在 ±(253-1) 范围内的整数。
- 字符串(string):用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
- 符号(symbol):用于唯一的标识符。
- BigInt:一种数字类型,可以表示任意精度格式的整数
引用类型(复杂数据类型):引用类型的值是保存在内存中的对象。
- 对象(Object)
数组对象(Array)
函数对象(Function)
布尔对象(Boolean)
数字对象(Number)
字符串对象(String)
日期对象(Date)
正则对象(RegExp)
错误对象(Error)
5、原始值和引用值有什么区别?
- 原始值大小固定,保存在栈内存中
- 从一个变量到另一个变量复制原始值,会创建该值得第二个副本
- typeof操作费可以确定值的原始类型,instanceof操作符用于确保值得引用类型
- 引用值是对象,存储在堆内存中
- 从一个变量到另一个变量复制引用值,只会复制指针,因此结果是两个变量都指向同一个对象
6、检测数据类型的常用方法
- typeof
- instanceof
- constructor
- Object.prototype.toString.call()
6.1 typeof
console.log(
typeof 100, //"number"
typeof undefined, //"undefined"
typeof null, //"object"
typeof function () {
console.log("aaa");
}, //"function"
typeof new Number(100), //'object'
typeof new String("abc"), // 'string'
typeof new Boolean(true) //'boolean'
);
typeof 可以正常检测出:number、boolean、string、object、function、undefined、symbol、bigint…
6.2 instanceof
基本数据类型中:Number,String,Boolean。字面量值不可以用 instanceof 检测,但是构造函数创建的值可以
注意:null 和 undefined 都返回了 false,这是因为它们的类型就是自己本身,并不是 Object 创建出来它们,所以返回了 false。
console.log(
100 instanceof Number, //false
undefined instanceof Object, //false
[1, 2, 3] instanceof Array, //true
new Error() instanceof Error //true
);
6.3 constructor
constructor 是 prototype 对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用 constructor 属性的。可以检测出字面量方式创建的对象类型.
console.log(new Number(123).constructor);
//ƒ Number() { [native code] }
6.4 Object.prototype.toString.call()检测对象类型
const toString = Object.prototype.toString;
toString.call(123); //"[object Number]"
toString.call(undefined); //"[object Undefined]"
toString.call(null); //"[object Null]"
toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]"
toString.call(new Error()); //"[object Error]"