在JavaScript中,数据类型分为两类,即原始值和引用值。
原始值
是存储在栈中的简单数据段,它值直接存储在变量访问的位置。
原始值类型:Number、String、Boolean、undefined、null
-
undefined
当变量 声明了但没有初始化 时候,该变量的默认值即为undefined
没有声明 的变量,值虽然不是undefined,但是数据类型还是undefinedvar test ; console.log(test); //undefined
当函数无明确返回值时,默认返回值为nullvar test ; console.log(typeof (test)); //undefined console.log(typeof (myTest)); //undefined
function test(){} console.log(test());
-
null
与undefined的区别是,undefined表示未定义,但是null有值,只不过这个值是空。
当函数返回一个对象,找不到这个对象时候,返回值为nullvar demo = null; console.log(demo); // null var test; console.log(test); //undefined
-
String
在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。JavaScript打破了这一传统。
引用值
存储在堆中的对象,在变量处的值是一个指针,指向存储对象的内存处。
主要有数组array、对象object、函数function。
这两种类型到底有什么区别?我们来举个例子
var test = 111;
newTest = test;
Test = 222;
console.log(test); //111
console.log(newTest); //222
test值的改变对newTest没有影响。
test是原始值,他的值存在栈里,执行newTest = test
,栈内开辟新空间,保存newTest的值,此后test再怎么改变与newTest无关。
var arr = [1,2,3];
newArr = arr;
arr.push(4);
console.log(arr);//[1, 2, 3, 4]
console.log(newArr);//[1, 2, 3, 4]
arr是引用值,他的变量名存在栈里,但值存在堆里,变量名指向的堆空间,执行newArr = arr
,变量名newArr与arr指向相同的堆空间,所以arr的值改变,就导致newArr的值也改变。
var arr = [1,2,3];
newArr = arr;
arr = [1,2,3,4,5,6]
console.log(arr);// [1, 2, 3, 4, 5, 6]
console.log(newArr);//[1, 2, 3]
JavaScript类型转换
显式类型转换
typeof
可以检验数据类型
只能返回 numner、string、boolean、undefined、object、function,并且typeof
返回结果是string类型
NaN属于number类型
console.log( typeof(typeof(123))); // string
转换为数字字符串允许开头结尾有空格,但是只要有非空格字符,字符串转换为数字的结果就是NaN。
- Number( ) 把其他类型的数据转换成数字类型的数据。
var demo = Number('123');
console.log(demo) // number123
demo = Number(true)
console.log(demo) // 1
demo = Number(NaN)
console.log(demo) // NaN
demo = Number(undefined)
console.log(demo) // NaN
var demo = Number("ooo");
console.log(demo) //NaN
var demo = Number(function(){});
console.log(demo) //NaN
-
parseInt(string, radix) 解析一个字符串,并返回一个整数
string
表示要被解析的字符串。
radix
表示要将字符串转化的进制。
值介于 2 ~ 36 之间。 该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
当参数string里面既包括数字字符串又包括其他字符串的时候,它会将看到其他字符串就停止了,不会继续转换后面的数字型字符串了。
parseInt('123abc345') // 123
parseInt('abc123') // NaN
parseInt('123') // 123
parseInt('abc') // NaN
parseInt(true) // NaN
parseFloat( )将字符串转换成浮点类型的数字
识别第一个小数点以及后面的数字,第二个小数点后的无法识别,遇到非数字字符串停止识别。-
toString( )将任意数据类型转换为字符串
与前几个不同的是,他是对象上的方法
undefiend和null没有toString方法引用值类型(对象、函数、数组)转换为字符串,步骤如下
- 如果对象有
toString()
,调用toString()
,如果返回原始值,将这个值转换为字符串;如果返回的是复合类型或对象没有toString()
,则调用valueOf()
; - 如果
valueOf()
返回原始值类型,将这个值转换为字符串; - 如果返回的是复合类型,则抛出一个类型错误异常。
- 如果对象有
Boolean( )把任何类型转换成布尔类型
Boolean(0); // false
Boolean(undefined); // false
Boolean(null); // false
Boolean(''); // false
Boolean(NaN); // false
隐式类型转换
-
isNaN()
检测数据是不是非数类型。
先将你传的参数调用一下Number
方法之后,再看看结果是不是NaN,不过这个方法可以检测NaN本身。
isNaN(NaN); // true
- ==
1,null和undefined,相等。
2,数字和字符串,转化为数字再比较。
3,如果有true或false,转换为1或0,再比较。
4,如果有引用类型,优先调用valueOf。
5,其余都不相等。
console.log(undefined == false); // false
console.log(null == false); // false
console.log(0 == false); // true
console.log(NaN == false); // false
console.log("" == false); // true
1 !== '1'; // true
1 !== 1; // false