前端高频面试题---js篇(一)

102 阅读6分钟

1. javascript的数据类型有哪些?

在 JavaScript 中,数据类型主要分为两种:基本类型和对象类型。

基本类型(原始类型)有:

  1. Number:任何数值,包括整数和浮点数。
  2. String:一系列字符的集合,用于表示文本。
  3. Boolean:逻辑实体,可以是 true 或 false。
  4. Null:表示缺乏值或没有值。
  5. Undefined:在声明后未被初始化的变量的类型是 Undefined。
  6. BigInt:可以表示任意大的整数。
  7. Symbol:是一个唯一且不可变的数据类型,经常被用作对象的键值。

对象类型主要是:

Object:对象是一种复合数据类型,它将很多值(无论是基本类型还是复合类型)聚合在一起。对象通过属性名访问其值。除了普通的对象之外,JavaScript 还有特殊的对象类型,如函数(Function),日期(Date),以及各种数据结构如数组(Array)、Map、Set等。

注意,JavaScript 是一种动态类型语言,这意味着你可以将一个变量从一个类型更改为另一个类型,而无需明确的类型转换。

2. javascript 有哪些引用类型?

在 JavaScript 中,所有的对象都是引用类型。这意味着它们不是存储值的地方,而是存储引用到值的位置。当你将一个对象赋值给另一个变量时,你实际上只是复制了引用,而不是对象本身。

以下是一些常见的 JavaScript 引用类型:

  1. 数组:可以存储多个值在一个连续的内存空间内,并使用数字索引来访问它们。
  2. 函数:可以执行一段 JavaScript 代码,并可能返回一个值。函数在 JavaScript 中是第一类对象。
  3. 日期:用于存储日期和时间信息。
  4. RegExp:用于匹配正则表达式,可以存储模式和标志。
  5. Error:用于处理错误条件,如 TypeError、ReferenceError 等。
  6. Object:所有其他引用类型的基类。你可以创建自定义对象,以存储和组织你需要的属性和方法。
  7. Promise:用于异步编程,表示一个可能在未来可用的值。
  8. Map, Set, WeakMap, WeakSet:这些是 ES6 中新增的数据结构。Map 类似于 Object,但是键的类型可以是任何类型,而 Set 类似于数组,但是其元素是唯一的。WeakMap 和 WeakSet 与 Map 和 Set 类似,但是它们只能包含弱引用(即不会阻止 JavaScript 的垃圾收集器从回收其包含的对象)。

以上这些都是 JavaScript 的引用类型,但请注意,基本类型(如 Number、String、Boolean、Null、Undefined 和 Symbol)不是对象,因此不是引用类型。

3. 如何判断javascript的数据类型?

在JavaScript中,有几种方法可以用来判断数据类型。

  1. typeof 运算符:typeof 是一个运算符,可以返回其操作数的数据类型。例如:
console.log(typeof "hello"); // 输出 "string"
console.log(typeof 123); // 输出 "number"
console.log(typeof true); // 输出 "boolean"
console.log(typeof null); // 输出 "object"
console.log(typeof undefined); // 输出 "undefined"

注意,typeof 运算符对于数组和函数会返回 "object",因此如果你需要更精确地检测这些类型,可能需要使用其他方法。 2. instanceof 运算符:instanceof 运算符可以用来检测一个对象是否是一个类的实例。例如:

let myArray = [1, 2, 3];
console.log(myArray instanceof Array); // 输出 "true"
  1. Array.isArray() 方法:这个方法可以用来检测一个对象是否是数组。例如:
let myArray = [1, 2, 3];
console.log(Array.isArray(myArray)); // 输出 "true"
  1. Object.prototype.toString.call() 方法:这个方法可以返回一个对象的 [object Type] 格式的字符串,其中 Type 是对象的类型。例如:
console.log(Object.prototype.toString.call("hello")); // 输出 "[object String]"
console.log(Object.prototype.toString.call(123)); // 输出 "[object Number]"

这种方法对于检测自定义对象的类型非常有用,因为 typeof 运算符对于自定义对象会返回 "object"。

4. javascript中怎么判断两个对象相等?如何判断空对象?

在JavaScript中,判断两个对象是否相等是一个比较复杂的过程。因为JavaScript中的对象是引用类型,所以如果只是简单地使用 ===== 运算符来比较两个对象,实际上是判断它们是否指向内存中的同一个地址,而不是比较它们的内容是否相等。

要判断两个对象的内容是否相等,可以使用 JSON.stringify() 方法将对象转换为字符串,然后比较这两个字符串是否相等。例如:

let obj1 = {a: 1, b: 2};
let obj2 = {a: 1, b: 2};

if (JSON.stringify(obj1) === JSON.stringify(obj2)) {
    console.log("两个对象相等");
} else {
    console.log("两个对象不相等");
}

判断一个对象是否为空也是比较复杂的。因为JavaScript中的对象是键值对的集合,所以一个空对象没有任何键值对,但是它仍然是一个对象。要判断一个对象是否为空,可以检查它是否有任何键值对。例如:

let obj = {};  // 空对象

if (Object.keys(obj).length === 0) {
    console.log("对象是空的");
} else {
    console.log("对象不是空的");
}

这段代码使用 Object.keys() 方法获取对象的所有键名,然后检查它们的数量是否为0。如果数量为0,那么对象就是空的。

5. javascript中强制类型转换、隐式类型转换分别是什么。

在JavaScript中,强制类型转换和隐式类型转换是两种不同的数据类型转换方式。

  1. 隐式类型转换(Implicit Type Coercion): 隐式类型转换是JavaScript自动进行的类型转换,你不需要做任何操作。这种类型转换在执行运算或函数调用时自动发生,通常是为了使操作或函数能够正常执行。例如,当你试图将一个字符串添加到数字时,JavaScript会隐式地将数字转换为字符串

示例:

let sum = 5 + "10"; // 输出:'510',因为JavaScript隐式地将数字5转换为字符串'5'
  1. 强制类型转换(Explicit Type Coercion): 强制类型转换是一种明确要求JavaScript将一个值转换为指定类型的操作。这通常是通过使用特定的语法实现的。例如,使用parseFloat()parseInt()函数将字符串转换为数字。

示例:

let str = "123";
let num = parseInt(str); // num现在是数字123

在这个例子中,我们使用parseInt()函数明确地将字符串"123"转换为整数。这被称为强制类型转换。

总的来说,强制类型转换和隐式类型转换的主要区别在于你是否明确地要求进行类型转换。强制类型转换是你明确要求的,而隐式类型转换是JavaScript自动进行的。