1. 简单数据类型(值类型)
String Number Boolean undefined null
数据存储在
栈
中
2. 复杂数据类型(引用类型)
Object function Array Date RegExp Error ...
先在栈空间中开辟一块内存,将
数据保存到堆空间中
,然后将数据在栈空间中的存储
地址放到栈空间中
3.值类型 和 引用类型
(1)js类型:
-> 简单类型:字符串 string,数字 number,布尔 boolean
-> 复杂类型(复合类型):由简单类型组合而来 -- 对象 object,函数 function
-> 空类型:null,undefined
(2)特点:
-> 简单类型的特点就是变量本身存储的就是值本身
-> 复杂类型的特点就是变量不存储数据,数据由于非常的庞大,存储在单独的内存中,变量只存地址(引用)
值类型好比文件,文件拷贝一份,其内容也会被拷贝一份;
引用类型就好比快捷方式,数据存储在文件夹的各文件中,快捷方式拷贝一份,数据并没有被拷贝,两个快捷方式指向的是同一份数据。
由此可以解释以下二者的关系:
new Person().__proto__
Person.prototype
从不同的角度找到同一个对象,从实例和构造函数都能找到原型。
(3)函数参数传递时值类型与引用类型的特征:
例1的过程:
① 执行的第一句话就是给n1赋值123,所谓的赋值就是有一个容器,可以放置123这个数字;
② 第二句话调用函数
-> 将参数传入(将变量中的数据拷贝一份)
-> 跳转到函数体中(将拷贝的数据完成一次赋值,赋值给形参)
-> 执行函数体中的代码
-> 函数结束回到原来的函数调用的地方
-> 继续执行后面的代码
//例1:值类型作为参数
function foo(num){//这里的num在进来的时候就是123
num *= 2;//246
}
var n1 = 123;
foo(n1); //传参数时会将n1拷贝一份,即内存中有两个123,将拷贝的123传入到函数中赋值
console.log(n1);//123
结论1: 值类型在参数传递中,函数内与函数外是两个不同的变量,只是数据值相同而已,修改其中一个,另一个不影响
//例2:引用类型作为参数
function seeDoctor(per){//进入函数体前,拿到传入的数据,即地址
per.health = '健康';
}
var p = {
name:'jim',
health:'感冒'
};//有两个内存区域,一个存储数据,一个存储p(即地址)
seeDoctor(p);//传递参数时p会被拷贝一份,拷贝的是地址,数据没有被拷贝
console.log(p.health);//健康
//使用p找内存中的数据
//得到的就是'健康'
结论2: 引用类型在参数传递中,函数内与函数外是两个不同的变量,但是指向同一个对象,因此使用函数内的变量,去修改对象的数据,函数结束后,修改的结果会保留下来
//例3:特例
function seeDoctor(per){
per = {
name:'tom',
health:'健康'
};
}
var p = {
name:'tom',
health:'感冒'
};
seeDoctor(p);
console.log(p.health);//感冒
结论3:引用类型如果直接赋值,就和值类型一样
4. 字面量
固定的值,让你从“字面上”理解其含义。
var age=18; // 数值字面量,18为字面值
5. 因为精度丢失问题,所以不判断计算后的两个浮点数是否相等
6. 数值范围
由于内存的限制,ECMAScript 并不能保存世界上所有的数值
最小值:Number.MIN_VALUE,这个值为: 5e-324
最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
无穷大:Infinity
无穷小:-Infinity
7. NaN
a) NaN 非数值(Not a Number的简写)
console.log(“abc”/18); //结果是NaN
Undefined和任何数值计算为NaN;
NaN 与任何值都不相等,包括 NaN 本身
b) isNaN() :任何不能被转换为数值的值都会导致这个函数返回 true
(isNaN译为是否符合一个标准,什么标准呢?不是一个数字的标准,如果符合了那么就不是一个数字,不符合就是一个数字)
isNaN(NaN);// true
isNaN(“blue”); // true
isNaN(123); // false
8. 转义符:\
\t:制表符,四个空格
\n:换行
9. 字符串的不可变性
在内存中不会立刻消失,只能二次赋值,原有的字符在一定时间
内被
垃圾回收器回收。
10. undefined 和 null
null
和
undefined
有最大的相似性。看看
null == undefined
的结果
(true)
也就更加能说明这点。但是
null ===undefined
的结果
(false)
。不过相似归相似,还是有区别的,就是和数字运算时,
10 + null
结果为:
10
;
10 + undefined
结果为:
NaN
。
任何数据类型和
undefined
运算都是
NaN;
任何值和
null
运算,
null
可看做
0
运算。
11. Booblean
Boolean
类型有两个字面量:
true
和
false
,区分大小写。(大写不对)
虽然
Boolean
类型的字面值只有两个,但
ECMAScript
中所有类型的值都有与这两个
Boolean
值等价的值
true
、除
0
数字、“
something
”、
Object(
任何对象
)
为
true
false
、
0
、“”、
undefined
、
null
为
false
if判断时会把括号内的值强行转换成
boolean
类型。