JavaScript常见面试题(一)

1. JavaScript有哪些数据类型,它们的区别?

分为简单数据类型和引用数据类型

  • 简单数据类型有:Numer,String,Boolean,Null,Undefined。
  • 引用数据类型:对象,数组,函数。
  • ES6新增Symbol(独一无二且不可变的数据类型),BigInt(表示任意精度格式的整数)。
  • 简单数据类型存储在栈中,引用数据类型存储在堆中。

2.数据类型检测的方式有哪些

  • typeof console.log(typeof ‘str’);
  • instanceof(只能正确判断引用数据类型) console.log(2 instanceof Number);
  • constructor console.log((2).constructor === Number);
  • Object.prototype.toString.call()

3. 判断数组的方式有哪些

  • isArray(Array.isArray(arr) //true)
  • proto (arr.proto === Array.prototype //true)
  • constructor属性(arr.constructor === Array //true)
  • instanceof(arr instanceof Array //true)
  • toString(Object.prototype.toString.call(obj).slice(8, -1) === “Array” //true)
  • isPrototypeof(判断当前对象是否是另一个对象的原型) Array.prototype.isPrototypeOf(obj)

4.null和undefined区别

undefined 代表的含义是变量声明了未定义(未赋值),null 代表的含义是空对象。

  1. null转换为数值为0,undefined转化为数值为NAN。
  2. null通过typeof判断数据类型的输出结果为object,undefined为undefined。
  3. 访问不存在的dom节点,原型链上查找到顶端返回null,给函数传参没有传,访问对象中没有的属性返回undefined

5.typeof null 的结果是什么,为什么?

历史遗留问题,保留了下来。

6.intanceof 操作符的实现原理及实现

  1. 原理:获取对象的_proto__属性,然后沿着对象的原型链向上查找,看构造函数的prototype对象是否出现在对象的原型链上。

7.为什么0.1+0.2 ! == 0.3,如何让其相等

因为 JavaScript 使用 IEEE 754 双精度浮点数来表示数字,这种表示方式无法精确地存储某些十进制小数,从而导致精度问题。
使用 toFixed 或 toPrecision 将浮点数格式化为固定的小数位数,然后再进行比较。

8.isNaN 和 Number.isNaN 函数的区别?

  1. 函数 isNaN 接收参数后,会尝试将这个参数转换为数值,某些非数值的值可以直接转换成数值。任何不能转换为数值的值都会导致这个函数返回true。
    在这里插入图片描述

  2. 函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN。不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。
    在这里插入图片描述

9.==操作符的强制类型转换规则

  1. 如果两个操作数的类型相同(例如都是字符串、数字或布尔值),则直接进行比较。
  2. 如果一个操作数是对象,另一个不是,会尝试将对象转换为原始类型的值,然后再进行比较。
  3. 如果一个操作数是字符串,另一个是数字,则尝试将字符串转换成数字,然后进行比较。
  4. 如果一个操作数是布尔值,另一个是非布尔值,则将布尔值转换成数字(true 转换为 1,false 转换为 0),然后进行比较。
  5. 如果其中一个操作数是 null,另一个是 undefined,则它们相等。
  6. 如果其中一个操作数是 NaN,则返回 false,因为 NaN 不等于任何值,包括它本身。

10.其他值到字符串的转换规则?

  1. Null 和 Undefined 类型 ,null 转换为 “null”,undefined 转换为 “undefined”,
  2. Boolean 类型,true 转换为 “true”,false 转换为 “false”。
  3. Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。

11.其他值到数字值的转换规则?

  1. Undefined 类型的值转换为 NaN。
  2. Null 类型的值转换为 0。
  3. Boolean 类型的值,true 转换为 1,false 转换为 0。
  4. String 类型的值转换如同使用 Number() 函数进行转换,如果包含非数字值则转换为 NaN,空字符串为 0。
  5. 对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。

12.其他值到布尔类型的值的转换规则?

以下这些是假值: • undefined • null • false • +0、-0 和 NaN • “”
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。

13.Object.is() 与比较操作符 "=" “” 的区别?

  • 使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较。
  • 使用三等号(===)进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直接返回 false。
  • 使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。

14.JavaScript 中如何进行隐式类型转换?

  • +操作符的两边有至少一个string类型变量时,两边的变量都会被隐式转换为字符串;其他情况下两边的变量都会被转换为数字。
  • ==操作符两边的值都尽量转成number
  • <和>比较符,如果两边都是字符串,则比较字母表顺序,其他情况下,转换为数字再比较。

15.let、const、var的区别

  • 块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。
  • var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。
  • var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let和const不会。
  • var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。
  • 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。
    在这里插入图片描述

16.const对象的属性可以修改吗

  • const是用来定义常量的,而且定义的时候必须初始化,且定义后不可以修改。
  • const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动。对于基本类型的数据(数值、字符串、布尔值),其值就保存在变量指向的那个内存地址,对于引用类型的数据(主要是对象和数组)来说,变量指向数据的内存地址,保存的只是一个指针,const只能保证这个指针是固定不变的,至于它指向的数据结构是不是可变的,就完全不能控制了。

17.如果new一个箭头函数的会怎么样

箭头函数是ES6中的提出来的,它没有prototype,也没有自己的this指向,更不可以使用arguments参数,所以不能New一个箭头函数。

18.箭头函数与普通函数的区别

  1. 箭头函数比普通函数更加简洁(如果没有参数,就直接写一个空括号即可,如果只有一个参数,可以省去参数的括号,如果函数体的返回值只有一句,可以省略大括号)
  2. 箭头函数没有自己的this,它只会在自己作用域的上一层继承this
  3. 箭头函数继承来的this指向永远不会改变
  4. call()、apply()、bind()等方法不能改变箭头函数中this的指向
  5. 箭头函数不能作为构造函数使用(不能New)
  6. 箭头函数没有自己的arguments
  7. 箭头函数没有prototype(__proto__是当前对象的原型对象(隐式原型),而prototype是当前构造函数的原型对象(显式原型))

19.箭头函数的this指向哪⾥?

箭头函数不同于传统函数,它其实没有属于⾃⼰的 this,
它所谓的 this 是, 捕获其外层 上下⽂的 this 值作为⾃⼰的 this 值。

20.对 rest 参数的理解

rest参数是一种在函数定义中使用的特殊语法,它允许函数接受任意数量的参数,并将它们收集到一个数组中。

  • 在函数定义中,可以使用…语法来声明rest参数。
  • 通过使用rest参数,我们可以编写更灵活的函数,能够处理不确定数量的参数。

21.ES6中模板语法与字符串处理

  • ES6中的模板语法是一种更方便的字符串处理方式,它允许我们在字符串中插入变量,并且可以跨行书写。通过使用模板语法,我们可以更简洁地拼接字符串并提高代码的可读性。
  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值