js的数据类型
1.分类:
js中数据类型 分为:基本数据类型和引用数据类型
A:基本数据类型(值类型):
字符串(String)
字符串可以由单引号或者双引号表示 但注意左右引号必须匹配
数字(Number) -javascript中所有的数字都是浮点数,没有整数
布尔(Boolean) false或true
1.true不一定等于1 false不一定等于0
2.这两个值区分大小写,True和False不是Boolean值,只是标识符
对空(Null) -用typeof检验数据类型时为Object,但他不是对象,这是js的一个bug 在判断null==object时反true
值得一提的是,由于undefined值是派生自null,所以在两者之间的相等操作符总是返回true值。例子如下:
未定义(Undefined)
undefined类型只有一个值,呢就是–undefined 当使用var声明变量但没有对它进行初始化时,该变量得值为undefined 例如:
(Symbol)(Symbol是ES6引入了一种新的原始数据类型,表示独一无二的值。)
a.基本数据类型存放在栈内存
b. 基本数据类型是简单的数据段
c.
B:引用数据类型:对象(Object)数组(Array)函数(Function)
a.引用数据类型存放在堆内存
b.引用数据类型指的是多个值构成的对象
c.与其它语言不同 你不可以直接访问堆内存空间中的位置和操作堆内存空间, 只能操作对象在栈内存得引用地址
所以,引用数据类型在栈内存中保存的实际上是对象在堆内存中的引用地址,通过这个引用地址可以快速查找到保存在堆内存中的对象
javascript的引用数据类型是保存在堆内存中的对象。
重点
总结基本数据类型和引用数据类型的区别
A:声明变量时不同的内存分配
1)原始值:存储在栈(stack)中的简单数据段,也就是说 他们的值直接储存储在变量访问的位置
这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域–栈中,这样存储便于迅速查寻变量位置
2)引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址
这是因为:引用值的大小会改变,所以不能把它放在栈里,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址
地址的大小是固定的,所以把它存储在栈中对变量的性能无任何负面影响
b. 不同的内存分配机制也带来了不同的访问机制
1)在js中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时 首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问
2)而原始类型的值则是可以直接访问到的。
c. 复制变量时的不同
1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已
2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量
也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个做出改变都会反映在另一个身上
(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针
d 参数传递的不同(把实参复制给形参的过程)
首先我们应该明确一点:js中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响
2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
判断数据类型的几种方法
1.typeof
2.instanceof
3.constructor
4.使用Object.prototype.toString.call
5.使用jquery的
.
t
y
p
e
其
实
.type 其实
.type其实.type是基于ES5的Object.prototype.toString.call进一步封装.可以检测出所有的变量类型.
undefind和null的区别
目前,null和undefined基本是同义的,只有一些细微的差别。
1.null表示“没有对象”,即该处不应该有值。典型用法是:
1)作为函数的参数,表示该函数的参数不是对象
2)作为对象原型链的终点
image.png
2.undefined表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
1)变量被声明了,但没有赋值时,就等于undefined。
2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
image.png
我的理解就是: undefined是访问一个未初始化的变量时返回的值,而null是访问一个尚未存在的对象时所返回的值。因此,可以把undefined看作是空的变量,而null看作是空的对象。