原始类型
js原始类型有哪几种 , null是对象吗?
js有6种原始值:
boolean ,number ,null ,undefined ,string ,symbol
另外对于 null
来说,很多人会认为他是个对象类型,其实这是错误的。虽然 typeof null
会输出 object
,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000
开头代表是对象,然而 null
表示为全零,所以将它错误的判断为 object
。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
对象类型(引用类型):
对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?
在js中除了原始类型其他都是对象类型 , 原始类型储存的是值,对象类型储存的是地址(指针)
假设 var a = []
那么[]就是代表存储的地址
函数参数是对象的情况:
function test(person) {
person.age = 26
person = {
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
对于以上代码,你是否能正确的写出结果呢?接下来让我为你解析一番:
- 首先,函数传参是传递对象指针的副本
- 到函数内部修改参数的属性这步,我相信大家都知道,当前
p1
的值也被修改了 - 但是当我们重新为
person
分配了一个对象时就出现了分歧,请看下图
所以最后 person
拥有了一个新的地址(指针),也就和 p1
没有任何关系了,导致了最终两个变量的值是不相同的。
typeof vs instanceof
对于原始类型typeof,除了null以外都可以判断类型,如果我们想判断一个对象的正确类型可以用instanceof
类型转换
在js中只有三种类型转换分别为 :boolean , number , string
转Boolean
在条件判断时,除了 undefined
, null
, false
, NaN
, ''
, 0
, -0
,其他所有值都转为 true
,包括所有对象。
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]]
函数,对于该函数来说,算法逻辑一般来说如下:
- 如果已经是原始类型了,那就不需要转换了
- 调用
x.valueOf()
,如果转换为基础类型,就返回转换的值 - 调用
x.toString()
,如果转换为基础类型,就返回转换的值 - 如果都没有返回原始类型,就会报错
四则运算符
加法运算符不同于其他几个运算符,它有以下几个特点:
- 运算中其中一方为字符串,那么就会把另一方也转换为字符串
- 如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
比较运算符
- 如果是对象,就通过
toPrimitive
转换对象 - 如果是字符串,就通过
unicode
字符索引来比较
this
- 对于直接调用 来说,不管 函数被放在了什么地方,
this
一定是window
- 谁调用了函数,谁就是
this
,所以在这个场景下 函数中的this
就是 调用他的 对象 - 对于
new
的方式来说,this
被永远绑定在了上面,不会被任何方式改变this