浅析javaScript中的数据类型

102 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

前言

从"Hello word!"说起

console.log('Hello word!')
  • 弱类型的javascript

JavaScript 声明变量的时候并没有预先确定的类型,变量的类型就是其值的类型,也就是说变量当前的类型由其值所决定,夸张点说上一秒种的 String,下一秒可能就是个 Number 类型了,这个过程可能就进行了某些操作发生了强制类型转换。

let a = 'Hello word!';

console.log('===================>',a);

a = ['h','e','l','l','o'];

console.log('===================>',a);
  • 忘掉var 记住 let & const
const b = 'Hello word!';

console.log('===================>',b);

b = ['h','e','l','l','o'];

console.log('===================>',b);

数据类型

js 数据分为两种类型:原始数据类型引用数据类型

  • 原始数据类型:Number,String,Null,Boolean,Undefined
    • ES6:Symbol、BigInt

Symbol 和 BigInt 是Es6后开始支持

  • 引用数据类型:Object、Array 、Function、Date、RegExp 等。

基本数据类型的特点

  1. 基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值;
  2. 基本数据类型的值是不可变的,任何方法都无法改变一个基本数据类型的值
let name = 'javascript';
name.substr();
console.log(name) // javascript

let name2 = 'es6';
name2.toUpperCase()
console.log(name2) // es6

substr()和 toUpperCase()方法后返回的是一个新的字符串,跟原来定义的变量 name 并没有什么关系。

  1. 基本数据类型不可以添加属性和方法
let user = 'javascript';
user.type = 6;
user.es = function() {
    console.log('123456');
}
console.log(user.type) // undefined
console.log(user.es) // undefined
  1. 基本数据类型的赋值是简单的赋值(不影响原变量的值)
let a = 18;
let b = a;
a++;
console.log(a) // 19
console.log(b) // 18
  1. 基本数据类型的比较是值的比较

  2. 基本类型的值在内存中占据固定大小的空间,被保存在栈内存中

总结

引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存。

let obj1 = new Object();
let boj2 = obj1;
obje2.name = 'i have name';

console.log(obj1.name) // i have name

这两个引用数据类型指向了同一个堆内存对象。

“obj1“赋值给“obj2”,

实际上这个堆内存对象在栈内存的引用地址复制了一份给obj2,

但是实际上他们共同指向了同一个堆内存对象。

实际上改变的是堆内存对象。

image.png

image.png