js数据类型详解
一、js数据类型分类
(1)原始数据类型(值类型)
null 空类型,变量声明了并赋值为null。转化为数字是0
undefined 未定义,变量声明了但未赋值。转化为数字为NaN
boolean 布尔类型
string 字符串
number 数值
(2)对象数据类型(引用类型)
Object Array Date Function RegExp
特殊引用类型:String Boolean Number (包装类型)
(3)装箱和拆箱
问题:字符串是值类型,为什么还可以使用方法
原因:js代码执行分2个过程:预解析,执行。
基本包装类型:本身是基本类型,但在代码的执行过程中,调用了属性或方法,JS解析引擎会自动对其进行包装,此时这个变量就是基本包装类型的对象。
//装箱
var name = "xiaoming"; //先变量提升,声明name变量:在栈区分配一块空间,name指向这个地址。再执行代码,name变量赋值,遇到“”,判断为字符串类型。xiaoming存储在分配的栈区中 console.log(name.toString); //遇到toString方法,JS解析引擎创建name的对象(即String对象),调用其方法,这行代码执行结束,销毁String对象。
//拆箱
var num =new Number("123");
console.log(num); //Number{},num是一个对象 console.log(num -1); //122,是一个整数。在做减法运算时,系统自动调用了num.valueOf方法,返回对象的原始值
二、js数据在内存的存储位置
不同的编程语言,其变量的存储形式不同:js是解释性脚本语言,变量存在栈区和堆区
栈区:存储值类型数据(原始数据类型)
特点:1. 存储的值大小固定,不可更改里面的数据。
2. 空间较小,有限制,超过则报stack overflow
3. 可以直接操作其保存的变量值,运行效率高
4. 由系统自动分配存储空间。在声明变量时就分配好了内存空间
此类数据变量名指向的地址中存储的就是数据
var name = "aa"; name += "bb"; //重新分配了一块空间存储aabb,并将name指向新值。(并没有改变原来name空间的值)
堆区:存储引用类型数据(对象)
特点:1. 存储的值大小不定,可动态调整
2. 空间较大,运行效率低
3. 无法直接操作其内部存储,使用引用地址读取
4. 通过代码进行分配空间(代码执行到创建对象位置)
此类数据变量名指向的地址中存储的还是一个地址
C语言变量在内存里面的存储:
1.栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
2.堆区(heap) — 一般由程序员分配释放, 用来存储数组,结构体,对象等。若程序员不释放,程序结束时可能由OS回收。
3.全局区(静态区)(static)— 存放全局变量、静态数据、常量。程序结束后由系统释放。
4.文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。
5.程序代码区 — 存放函数体(类成员函数和全局函数)的二进制代码。
三、JS中参数传递
js中参数传递全部为值传递
四、JS数据类型转换
1. 自动转化规则:(隐式转化)