一.分类
1,五种简单数据类型(基本数据类型):number,string,boolean,null,undefined,symbol(ES6)
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问。
1)undefined:声明的变量但没有对齐初始化时,该变量的值就是undefined
var a; console.log(a == undefined,undefined==undefined); //true true a声明了但未定义 console.log(typeof b); //undefined b未声明 console.log(typeof a); //undefined console.log(b == undefiend); //报错
2)null:null值表示一个空对象指针,使用typeof时,返回‘object’
undefiend的值是派生自null
console.log(null == undefined,1==‘1‘,1===‘1‘);//true true false ‘==‘:会类型转换 console.log(null === undefined);//false
3)boolean:该类型只有两个值true,false
其他类型可以使用Boolean()函数转换为boolean 类型
console.log(‘iii‘ == true, ‘iii‘ === true, ‘‘ == true, ‘‘ === true);//false false false false console.log(Boolean(‘iii‘), Boolean(‘‘));//true false if (‘iii‘) { console.log(true); } //true console.log(1 == true, 1 === true, 0 == true, 0 === true);//true false false false 注意1==true是true console.log(Boolean(1), Boolean(0));//true false if (1) { console.log(true); } //true var a = { i: 1 } console.log(a == true, {} == true);//false false console.log(Boolean(a), Boolean({}), Boolean(null));//true true false if (a) { console.log(true); } //true console.log(Boolean(undefined));//false
4)number类型:
console.log(NaN == NaN, NaN === NaN);//false false console.log(isNaN(NaN), isNaN(10), isNaN(‘10‘));//true false false console.log(isNaN(‘ooo‘), isNaN(true));//true false //不能转化为数值就是true
数值转换:
//boolean console.log(Number(true), Number(false)); // 1 0 //null console.log(Number(null)); //0 //undefined console.log(Number(undefined)); //NaN //字符串: console.log(Number(‘111‘), Number(‘00222‘), Number(‘0.1‘), Number(‘000.222‘));//111 222 0.1 0.222 console.log(Number(‘0xf‘), Number(‘‘), Number(‘ppp‘),Number(‘ppp123‘));//15 0 NaN NaN
//对象
var a = { value: 2 } var b = { value: 2, valueOf: function () { return 5 } } console.log(Number(a), Number(b));//NaN 5 调用对象valueOf
2.复杂数据类型(引用数据类型):存放在堆内存中的对象,每个空间大小不一样,要根据情况进行特定的配置
引用类型的值是保存在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存。
引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象
二.检测给定变量的数据类型——typeof
1.对一个值使用typeof操作符可能返回下列某个字符串:
‘undefined’:如果这个值未定义(未初始化);//未声明的变量执行typeof也会返回‘undefined’ 本质上无论对于那种变量都不能进行任何操作
‘boolean’:如果这个值是布尔值;
‘string’:如果这个值是字符串;
‘number’:如果这个值是数值;
‘object’:如果这个值是对象,数组或者null;
‘function‘:如果这个值是函数
注意:对于正则表达式使用typeof :safari5之前,chrome7及之前,返回‘function’,后面的版本返回‘object’
三,两种类型的区别:
1、声明变量时内存分配不同
*原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,这样便于迅速查询变量的值
*引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址。
这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性 能无任何负面影响
2.不同的内存分配带来不同的访问机制
在js中是不允许直接访问保存在堆内存中的对象的,所有在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后通过地址获取该对象的值,即按引用访问
而基础数据类型是直接访问到的
3,复制变量时的不同
1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本复制给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已
2)引用值:在将一个保存着对象内存地址的变量复制给另外一个变量时,会将这个内存地址复制给新变量身上
也就是说这两个变量都指向了堆内存中的同一对象,他们中任何一个做出改变都会反映到另一个身上。
(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针
4.参数传递的不同(把实参复制给形参的过程)
ECMAScript中所有函数的参数都是按值来传递的。为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
原文:https://www.cnblogs.com/ckafter/p/10628473.html