基本数据类型
基本数据类型的数据都存放在栈区,是值不可变的,当我们改变一个基本类型的数据时,只是创建了一个新的数据,并移动了指针而已,原来的数据仍然存在,由垃圾回收机制回收。
用A变量给B变量赋值时,只是复制了一份给B变量,A变量并没有改变,因此改变B变量并不影响A变量。(涉及深拷贝浅拷贝的问题)
- Number
不区分整数还是浮点型,但是一般不会判断两个浮点数是否相等。可以是十进制(0-9)、八进制(0 0-7)、十六进制(0x 0-9 A-F)。
Number()方法:
尽可能将输入的值转化为数字。
var a = "123";
var b = true;
var c = null;
var d = function kkk(){
alter("d");
}
var e = new Date();
console.log(Number(a));
console.log(Number(b));
console.log(Number(c));
console.log(Number(d));
console.log(Number(e));
运行结果如下:
当字符串内容为全是数字时,能正常转换,但是,如“100px”这种情况就会转化成NaN。这类转换使用parseInt():将字符串转化为整数,那么“100px”会被转化为100。还有parseFloat():与parseInt一样,但是会保留第1个小数点后面的数字。
非空字符串、函数、json、undefined(未定义)和其他对象会变成NaN(not a number)。
- String
用双引号或单引号括起来的部分,“+”可以用来做字符串的拼接。但是在拼接时,如果一方不是字符串则会发生隐式转换。
如:var a = "100"; console.log(100+a);
运行结果为 “100100”
String()方法:
可以将其他数据类型强制转化为字符串类型,和toString()不一样的是在强制转化null和undefined时可以正确转化成字符串。
三种值类型(字符串、数组和布尔值)都具有toString()方法,可以将自身转换为字符串。 - Boolean
布尔值只有true和false两种。
Boolean()方法:
可以把其他数据类型转化为布尔型。
当要转换的值是至少有一个字符的字符串,非0数字或对象时,Boolean()函数将反回true,如果该值是空字符串,数字0或null,它将返回false。
>和<可以让字符串和数字之间的比较显示正确,但是两个字符串比较不可以,如:‘10’>9和’10’>‘9’,前者为true后者为false,因为字符串之间的比较是从左向右一位一位的比较unicode编码大小。
==比较的是数值的相等,判断前将两边转化为数字。
===比较的是类型的相等,要值和类型都相等才为true。 - Undefined
未定义,一般是非人为的因素导致的。
出现的情景:
1.定义了一个变量未初始化。
2.对一个没声明的变量调用typeof
3.当函数无明确返回值时,返回值也是undefiend - Null
空对象,可以人为设置某个变量为null。
表示尚未存在的对象,如果函数要返回对象,那么找不到该对象时,返回的值通常是null。 - Symbol
es6新增,表示独一无二的值。
引用数据类型
- Obiect
- Function
- Array
这类数据类型的值是可变的,存储在堆区,当新建一个引用数据时,指针 存放在栈区,该指针指向存放在堆区的数据。当A对象的值赋给B的时候,是把A指针的指向给了B,也就是此时A、B的指针指向同一个数据,所以不管是对A还是B进行操作,另一个的值也会改变。
如何判断数据类型
var a = "123";
var b = true;
var c = null;
var d = function kkk(){
alter("d");
}
var e = new Date();
var f = new Array(7);
console.log(typeof(a));
console.log(typeof(b));
console.log(typeof(c));
console.log(typeof(d));
console.log(typeof(e));
console.log(typeof(f));
运行结果如下:
使用typeof判断时,除了function被正确判断外,其他的函数都被判断为了object,包括null。
万能的办法:
Object.prototype.toString.call()
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。