javascript基础系列之JS数据类型/内存

940 阅读3分钟

在ES5中,JS有5中基础类型字符串型,数字型,布尔型,null和undefined;1中复杂类型:Object 在ES6中,引入了Symbol类型。

利用typeof操作符(非函数)

typeof的迷之行为:typeof null 会返回“object”,null被认为是一个空的引用对象。Safari5,chrome7之前,对正则表达式会返回“function”而其他浏览器会返回“object”

注意:对于基础类型而言,typeof很好用,但是对于引用类型,我们更想知道其到底是什么类型的实例,因此会使用 instanceof。

undefined类型

在变量被声明但没有复制的是,会隐式赋值undefined

var message
console.log(typeof message)//undefined

null类型

空指针对象

var car = null
console.log(typeof call)// object
注意:console.log(null == undefined) //true

布尔值

true:非空字符串,非0数值(含无穷大),任何对象,n/a(not applicable) false: 空字符串,0,NAN,null, undefined

数字类型

  1. 浮点类型,浮点的最高精度是17位小数,在进行算数计算时,其精确度远不如整数。如0.1 + 0.2 不是0.3而是0.30000000000000004。
let a =0.1
let b = 0.2
if(a + b == 0.3){
    console.log('0.3')
}

2.数字范围:js中并不能保存所有的数值,如果超出了js的范围会用Infinity表示

var result = Number.MAX_VALUE + Number.MAX_VALUE
console.log(isFinite(result))

3.NaN, js中任何数值除以非数值都会返回一个NaN

console.log(NaN == NaN) //false

4.数值转换

  1. Number()
  2. ParseInt(),第二个参数可以指定基数
  3. ParseFloat(),只有第一个小数点是有效的

数值类型

  1. 字符字面量:转义字符
  2. 特点:ECMAScript中,字符串一旦创建就不会改变,要改变某个字符串变量,会先销毁原先字符串,再创建新的
  3. 转换为字符串:1) toString(),null/undefined不能调用toString(),数值类型可以传参数(进制); 2)String(),可以传入null,undefined

Object类型

与上述类型不同,Object类型是引用类型。引用类的值是保存在内存中的对象,为对象添加属性的时候操作的是实际对象,复制的时候复制的是引用。

栈内存/堆内存

在JS中,栈内存用于存储基础类型,变量对象的名称为变量名称,变量对象的值为真实的值; 栈内存用于存储引用类型,变量对象的名称为变量名称,变量对象的值为内存地址

具体内容参考:juejin.cn/post/1 栈内存的空间是固定的,每次产生一个基础类型就向栈内存申请了一块固定大小的空间。而堆内存的空间是不固定的,每申请一个堆内存空间,就把变量名和内存地址压入栈内存栈中。

参数传递

在ECMAScript中,所有的函数的参数都是按值传递的。

这里的按值传递的值其实是栈内存中,变量对象的值。对于基础类型,其实就是复制一份真正的值,对于引用类型而已,复制的是内存地址。 下面看两个例子,第一个例子很好理解,第二个例子恰好说明了传递的是内存地址,如果不是内存地址,那么person.name会变成Gerg。obj = new Object,只是给obj一个新的内存地址,原理的对象依然存在。

//例1
function setName(obj){
    obj.name = 'Nicholas'
}
var person = new Object()
setName(person)
console.log(person.name) // Nicholas

//例2
function setName(obj){
    obj.name = 'Nicholas'
    obj = new Object()
    obj.name ="Greg"
}

var person = new Object()
setName(person)
console.log(person.name) // Nicholas

内存管理

下面文章写的很清楚,就不多赘述。 juejin.cn/post/684490… juejin.cn/post/684490…