- 基本数据类型(值类型): Number、String、Boolean、Undefined、Null、Symbol(es6新增独一无二的值)
- 引用数据类型: Object。包含Object、Array、 function、Date、
备注: 基本数据类型,又称值类型。
基本数据类型都存储在栈里,且基本数据类型都是深拷贝。
值类型栈存储: 主要针对(Number、String、Boolean)三种数据。直接存储在栈(stack)中,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
例如:
当我们执行下方代码时栈内存中的变化:
var a=100;
var b=100;
a=200;
引用类型堆栈存储:存储在堆栈中的唯一变量是函数的局部变量。对于引用类型,引用存储在堆栈中,而引用的对象存储在堆上。对于值类型,对象本身存储在堆栈中。请注意,可以从本地函数中转义的局部变量(例如通过闭包)存储在堆上的单独数据结构中,包括可能包含的任何值类型。 换句话说,由于引用类型总是存储在堆上,因此它们包含的任何内容(甚至值类型)也都存储在堆上。
引用数据类型都存储在堆里,在栈中有一个id指向堆中的数据。
备注:
引用类型存储把值存储在堆内存中,堆内存是从下往上存储。生成唯一内存地址。然后在栈内存中把地址赋值给变量。栈内存是从上往下存储的。之所以如此划分内存主要考虑到特别大的对象进行值传递时的效率问题。
注意:当拷贝引用对象时,拷贝的只是栈中的id,并没有形成新的数据,当我们改变任意一个变量中的属性时,那么在堆里面的数据会被修改
变量计算-类型转换
1. 字符串拼接
var s1 = "abc" , s2 = "def";
console.log(s1 + s2); //返回字符串“abcdef”
连接字符串最简便的方法是使用加号运算符。
2. ==与===
总结:
===
三等表示全等,判断左右两边对象或值是否类型相同且值相等。==
二等表示值相等。判断操作符两边对象或值是否相等类型可以不同,类型不同时,使用Number()
转换成Number
类型在进行判断。类型转换规则:1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。
2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
注意:NaN==NaN //返回false,NaN和所有值包括自己都不相等。