一:数据类型
在JavaScript里面,一共有7种数据类型,分别是:
- 基本数据类型:字符型(String)、数值型(Number),null,undefined,布尔型(Boolean)。该类型直接存储在栈内存中,将某个基本数据类型的变量的值赋值给其它变量时是直接将该值赋值给变量,两个变量都是独立的,没有什么关联。
var a = 10;var b = a; // 此时a,b都等于10var a = 5; // 此时a=5,b=10,即a变量的改变不会影响到b变量
- 引用类型:Object。包括数组(Array)、对象(Object)、函数(function)等。该类型的值存储在堆内存里,需要通过地址查找,将对象赋值给变量时其实是将它的地址赋值给了变量,而将引用类型的变量的值赋值给其它变量时是将地址赋值给了变量,此时这两个变量是相同的,指向的都是同一个内存地址。所以修改其中一个变量,另一个对象也会被修改。
var obj1 = {a:10};var obj2 = obj1; //此时obj1和obj2都是{a:10}这个对象obj1.a = 20;console.log(obj2); //{a:20},即变量obj1的改变影响到了变量obj2var obj3 = {a:20};console.log(obj3===obj1) // false,虽然两个变量的对象都是{a:20},但是是两个对象,内存地址是不同的,所以是不等的。
- ES6新增:symbol,表示独一无二的值,主要用来避免属性名重复的问题,这里我没怎么用过,想了解的小伙伴可以看看阮一峰大佬的ES6入门。
二:类型间的转换
(一).转为数值型(Number):
- Number()方法,能将任意类型的值转换为数值型。
—— 如果是字符型,若全为数字或除数字外有且仅有一个小数点,则可以转换为正常的数,否则为NaN。
—— 如果是布尔型,则true为1,false为0。
—— undefined会转换为NaN,null会转换为0,引用类型会转换为NaN。 - parseInt()方法,能将任意类型的值转换为数值型,但是除了第一位为数字的字符串,其它的都会转换成NaN,转化规则是从第一个数字字符开始转换,直到遇到非数字结束。
parseInt(\"123adv\"); // 123parseInt(\"123.4\"); // 123parseInt(\"avc123\"); // NaN
- parseFloat()方法,与parseInt()很类似,但是可以转换小数,如果是整数就转换为整数。
parseFloat(\"123asd\"); //123parseFloat(\"123.4fdsaf\"); //123.4parseFloat(\"123.4.5\"); //123.4
- 隐式转换,进行减法( – ),乘法( * ),除法( / ),取余( % )操作时,会进行隐式转换,相当于进行了Number()方法。
(二).转换为字符型(String)
- toString()方法,null和undefined不能转,直接的对象也不能转
null.toString(); //会报错{a:1}.toString(); //会报错var obj={a:1};obj.toString(); //不会报错,结果是\"[object Object]\"
- String()方法,都能转。
- 隐式转换,进行 + 操作时,如果加号两边有字符型,就会进行字符串的拼接。
console.log(1+\"2\"); //结果是\"12\"console.log(1+2+\"3\"); //结果是\"33\"
(三).转换为布尔型(Boolean)
- Boolean()方法,任何类型都能转换,其中undefined,null,空字符串,0,NaN会转换为false,其它的都会转换为true。
- 隐式转换,当在判断条件中不是布尔值时或者使用 !(非) 运算符时,会进行隐式转换,相当于进行Boolean()方法。
if(1){} // 会执行if(\"haha\"){} //会执行if(0){} //会执行console.log(!\"123\") //false