携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
🎉 前言
在JS中一切皆对象,除了原始值中的null和undifined,我们在JS中输入一些字符串, 数字等东西的时候,JS会对该输入进行包装, 其中的主要方法有:
- String()
- Boolean()
- 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就会返回初始值的值,但是如果返回的不是初始值,就会报错。
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
🎉 拓展知识--类型识别
- typeof用在基本数据类型和函数时,返回其对应类型的描述,对于引用类型都返回为object.
- instanceof无法判断基本数据类型,对于引用类型数据,返回其其对应类型。
- Object.prototype.toString无论基本数据类型还是引用类型返回其对应类型。