原型模式故事链(三)--JS数据类型,以及区别、区分、改造上一章讲解原型链时提到,所有的引用类型都有一个_proto_属性,称为隐式原型。那么引用类型是什么鬼?试着简单解释一下javascript中的数据类型:JS中主要有两种数据类型:1.基本数据类型,也称为值类型。2.复杂数据类型也成为引用类型。值类型:Number、String、Boolean、Null、Undefined引用类型:Object、Array、Function所以JS一共有8种数据类型。那么为什么要区分值类型和引用类型呢?它们有何不同?我们来看一下:值类型是值的“副本”。以值类型中的数字类型为例。变量数=100;变量num2=num;数=200;console.log(num2);//100console.log(num);//200上面代码中,第二行是将num的值100复制到num2中,num2的值为100。当第3行的num变为200,与num2无关。引用类型是值“passing”,以引用类型中的Object类型为例。//例1:varobj={a:100};变量obj2=obj;obj.a=200;console.log(obj2.a);//{a:200}console.log(obj.a);//{a:200}//例子2:vararr=[1,2];vararr2=arr;arr2[0]=3;console.log(arr);//[3,2]console.log(arr2);//[3,2]在上面的代码中,在示例1的第二行代码中,将obj的值传递给obj2,其中obj2只是obj的一个别名!这意味着什么?也就是说,你叫小明,你妈妈叫你狗蛋,狗蛋是你的别名。所以不管你妈妈是叫狗蛋回家吃饭,还是叫小明回家吃饭,其实都是你在叫。所有的obj和obj2其实都指向同一个内存地址,它们是同一个东西,其中一个变了,另一个当然也变了。从例1和例2可以看出,obj改变会影响obj2,arr2改变也会影响arr2。当然!狗蛋买了新衣服,小明当然有这件新衣服。..如何判断一个变量是什么数据类型?typeof()可以查看值类型的所有数据类型,可以区分引用类型的Function,但是不能区分引用类型的Object和Array,会显示为Object.null是一个特殊的东西,会显示为object,有兴趣的可以去看看,这里不多说。那么如何区分数组呢?答案是:instanceof如:ainstanceofArray只有当a是数组时才会为真。变量a=5;varb='abc';变量c=空;变量d=未定义;console.log(typeof(a))//numberconsole.log(typeof(b))//stringconsole.log(typeof(c))//objectconsole.log(typeof(d))//undefinedvarobj={a:1}vararr=[1,2]varfn=function(){console.log('hello');}console.log(typeof(obj))//objectconsole.log(typeof(arr))//objectconsole.log(typeof(fn))//functionconsole.log(arrinstanceofObject)//true控制台。log(objinstanceofObject)//trueconsole.log(arrinstanceofArray)//trueconsole.log(objinstanceofArray)//falseconsole.log(arrinstanceofNumber)//false数据类型转换:有两种类型数据类型转换:隐式转换和强制转换隐式转换:隐式转换通常发生在运算中。变量数=10;varobj='20'varres=num+obj;//10+'20'console.log(res)//'1020'varobj2='11';变量num2=5;varres2=obj2>num2;//'11'>5console.log(res2)//true强制转换:一般使用String(),Number(),Boolean()转换(可能会丢失精度)varnum=123;console.log(typeof(num))//numberconsole.log(typeof(String(num)))//字符串例程总结:数据类型是JS非常重要的一部分,尤其是值类型和引用类型赋值的区别。一定要好好理解~下一篇:变量提升和函数声明
