JS数据类型---概念篇

180 阅读3分钟

JS数据类型和对象数据类型

基本数据类型(值类型)

  • 数字类型(Number)
  • 布尔类型(Boolean)
  • Undefined
  • 字符串(String)
  • null

引用数据类型

对象数据类型(object)

  • 普通对象
  • 数组对象
  • 正则对象
  • 日期对象
  • ···

函数(function)

下面代码的运行结果和原因

function test(person) {
  person.age = 26
  person = {
    name: 'hzj',
    age: 18
  }
  return person
}
const p1 = {
  name: 'fyq',
  age: 19
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?

结果:

p1: {age: 26, name: "fyq"}

p2: {age: 18, name: "hzj"}

原因

由于const修饰对象p1,保证指向这个对象的指针是固定的,在test函数中.参数传递的是p1对象的指针,这个指针是无法被修改的,但是可以修改对象里面的数据,因而p1的结果中,age的值被修改,然而name没有被修改

而test(p1)的结果不是p1,p2接收的是test函数中的对象

null是对象嘛?为什么?

Null从逻辑角度看是对象

Null是只有一个值的数据类型,这个特殊值是null,null可以理解为表示一个空对象指针。因此,用typeof操作符检测null时,会得到object

然鹅!!事情并没有那么简单!

在 JavaScript 中,typeof 操作符返回一个对象,表示未经计算的操作数的类型。 null 有时会被当作一种对象类型,但是这其实只是语言本身的一个 bug,即对 null 执行 typeof null 时会返回字符串 "object"。实际上,null 本身是基本类型(从前面的分类也可以看出这一点)

结论

在某种程度上理解为null实为object类型的一个特殊值,null准备用来在将来保存对象。所以,可以认为null还是一个基本类型而不是对象。

'1'.toString()为什么可以调用?

首先,'1'实际上是string类型

作为string类型调用toString()得到 "1"

写到这里我突发奇想,如果 1.toString() 会产生什么呢?

没错!这里报错了,那为什么会报错呢?在百度翻译的帮助下我明白了这里的语法错误。

在JS中,点操作符意味着调用object的属性或者一个浮点数

.跟在一个数字后面意味着这个数字是一个浮点数,所以这里会出现报错

当然这里和本题就没什么关系了hhh

0.1+0.2为什么不等于0.3?

看到这个题目我愣了一下,不等于0.3那等于什么呢?


果然是我才疏学浅,在Javascript中,二进制的0.1和0.2并不是很精确

因为每一个变量的存储空间是有限的。整数通常是2个字节,浮点数最大8个字节。那么它能表示的数字大小也是有限的。

尤其是对于浮点数来讲,小数点后的位数是可以无穷尽的。当表示一个小数时,计算机会由于空间有限而对二进制的数据进行部分的舍弃。

这样就导致了误差的出现。

这里有个来自百度知道的一个详细计算