面试之JS包装类和隐式转换和类型识别

62 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

🎉 前言

在JS中一切皆对象,除了原始值中的null和undifined,我们在JS中输入一些字符串, 数字等东西的时候,JS会对该输入进行包装, 其中的主要方法有:

  1. String()
  2. Boolean()
  3. Number()

🎉 案例

var a = 'abc'
var b = a.substring(2)
console.log(a)
console.log(b)
  • 当我在输入一个字符串后JS会先进行String()的操作
  • 在进行substring的 操作
  • 最后在删除这个实例
var s1 = new String('abc')
var b = s1.substring(2)
s1 = null

🎉 深入剖析

如果我们只是一个单纯的输入一个字符串,那么我我们不能再上边添加任何的属性,但是当使用了String的构造函数之后,就可以添加属性, 这是由于new关键字创造出来的是一个对象。

var s1 = 'abc'
s1.color = 'red'
console.log(s1.color) // undefined

但是人如果我是用了new关键字和String的构造函数就可以!

var s1 = new String('abc')
s1.color = 'red'
console.log(s1.color) // 'red'

但是如果不使用new关键字的化,他就会变成一个方法而已,也不会产生对象。

var s1 = String('abc')
s1.color = 'red'
console.log(s1.color) //  undefined

我们来验证以下这三个东西的真实的机理:

var s1 = 'abc'
var s2 = String('abc')
var s3 = new String('abc')
console.log(s1 == s2)//true
console.log(s1 === s2)//true
console.log(s2 == s3)//true 这里经过了隐式转换
console.log(s2 === s3)//false
console.log(s1 === s3)//false

==符号是会进行隐式转换的,而===号是不进行转换的并且还会对类型进行判断。

🎉 拓展知识--隐士转换

🎇1.原始值转化为原始值

(1)特例


Number(undefined)//NaN
Number(null)//0
Number(Infinity)//Infinity无穷大

(2)false虚值: false 0 NaN undefined null ''


Boolean(undefined)//false
Boolean(null)//false
Boolean(0)//false
Boolean(NaN)//false
Boolean('')//false
Boolean(' ')//true  在JS中如果是存在一个空格,会被认为是有值的

🎇2.对象转化为原始值

(1)Boolean 只要里边不是空的返回的就是true否则为false

Boolean([])//true
Boolean({})//true
Boolean(/d/)//true
Boolean(new Error())//true
Boolean(Symbol())//true

(2)对象转换为Number 先调用其中的valueOf方法如果返回的是原始值,那么Number就会返回初始值返回的值,如果不是就再去调用toString方法,如果返回的原始值,那么Number就会返回初始值的值,但是如果返回的不是初始值,就会报错。

image.png
var obj = {
   toSting(){
     return 1
   },
   valueOf(){
     return {}
   }
}
Number(obj)//1
  var obj = {
   toSting(){
     return 1
   },
   valueOf(){
     return 2
   }
}
Number(obj)//2

  var obj = {
      valueOf(){
     return ()
   }
}
Number(obj)//NaN

🎉 拓展知识--类型识别

  1. typeof用在基本数据类型和函数时,返回其对应类型的描述,对于引用类型都返回为object.
  2. instanceof无法判断基本数据类型,对于引用类型数据,返回其其对应类型。
  3. Object.prototype.toString无论基本数据类型还是引用类型返回其对应类型。 image.png