原生数据类型

Javascript的原生数据类型有 String, Number, Boolean, null, undefined, symbol, bigint 从它们的名字中就可以直接的了解到它们的意思,但要注意的是

  • Javascript中没有int/float/double的概念因此不管是什么数字都是Number
  • 如果直接用像是let z这样来定义个变量的话那就是undefined
  • undefined:系统默认的“缺少值”(没赋值、没返回、没传参数)。null:人为指定的“空值”,表示“这里应该有东西,但我故意留空”。也就是说我们通常不会主动让一个变量变成undefined。只会遇到出现一个函数返回undefined的情况,然后对它进行特殊处理
  • bigint从名字也可以看出它是用来表示一个很大/很小(负数)情况下的整形数值。普通的number的范围为(-2^53)~(2^53-1)。而bigint理论上无穷大,只受限于内存。平时用的不多想了解的可以点击bigint对应的超链接。
const username = "Kayn";
const age = 17;
const GPA = 4.99;
const male = true;
const x = null;
const y = undefined;
let z;

动态类型

Javascript的数据类型是动态的,举个例子

let x = 10; // x 是 number
x = "hello"; // 现在 x 变成 string
x = true; // 现在 x 变成 boolean

优缺点

这样的好处在于有些地方我们就不需要转来转去了

比如说

let x = "5";
console.log(x * 2); // 输出地结果将会是10

如果在像是Java这样的静态类型语言,我们可能就需要

Integer.parseInt("5") * 2

但这样有时也会出现问题,出现我们不想要的结果 比如

let x = "5";
console.log(10 + x); // 结果为"105"

而在Java中要是搞相似的操作不管是ide还是编译都直接报错了

实经情况中我们宁可多绕路也能犯错留下后患,尤其是在一个多人合作项目中。就像沟通中我们不能为了减少沟通时间就不把话说完一样。所以为了让Javascript更工程化,就有了Typescript

获取变量的数据类型

既然Javascript的变量是实时变动的,那么自然也就会有获取它的数据类型的需求。 这时候就会用到typeof这一运算符

typeof 123; // "number"
typeof "hello"; // "string"
typeof undefined; // "undefined"

但比较有意思的是

typeof null; //"object"

这可以理解为是javascript的历史遗留问题。具体的原因如下

  • JavaScript 在最初设计时,值在内存中是以一种叫 tagged union 的方式存储的,每个值有一个类型标签(type tag)。
  • 对象的 type tag 是 0。
  • 当时 null 的 type tag 也被误标为 0(和对象一样)。
  • 因此 typeof null 会返回 "object"。 所以实际应用场景中要想判断一个变量是不是null得用下面这种方法
let x = null;
console.log(x === null); // true