1>基本数据类型:
Number,String,Boolean,undefine,null
boolean为false的情况:数字0,null,undeine,NAN,空字符串
2>引用数据:
object,function,date,array
3>两者不同之处:
1)内存分配
基本数据类型是简单的数据段,引用类型是由多个值构成的对象
基本数据类型储存在栈中,是有最大值和最小值的,不能超过默认范围
引用类型的数据储存在堆中,引用类型的地址储存在栈中,储存在堆中的引用类型的数据是没有固定大小的
2)访问机制(不同的内存机制带来的)
基本数据类型是可以直接访问保存在变量中的实际值
引用类型数据是保存在堆中的对象,js是不可以直接访问堆内存空间的位置和操作堆内存空间,只能操作对象在栈内存中的引用地址,可以通过这个引用地址快速查找到堆内存中的对象,是引用访问
3)复制变量
基本数据类型:在栈上重新分配一个内存空间来存当前赋值的对象,这两个对象可以参与任何操作而不会相互影响
引用类型:在将保存着对象内存地址的变量复制给另一个变量时,会把这个,也就是说这两个变量指向堆内存地址赋给新变量内存中的同一个对象,改变其中一个对象,就会影响另一个对象。
4)参数传递
js所有的函数都是按值传递的,函数外部的值复制给函数内部的变量,与一个变量复制给另一个变量是一样的
4>判断方法:
1)typeof:返回字符串,可以判断number,string,boolean,undefined,function,其余数据类型为object
var arr=[1,2,3];
console.log(typeof arr);//object
2)A instanceof B A是不是B的实例,适合一些条件选择或分支,B一定要是对象的类型
var arr=[1,2,3];
console.log(arr instanceof Array);//true
3)constructor 但是在类继承上会出错,instanceof不会出错,对象的直接继承和间接继承都会为true
原理:查看B的prototype指向的对象是否在对象A的[[prorotype]]链上,如果在则返回true,如果不在则返回false,不过有一个特殊的情况,当对象B的prototype为null将会报错(类似空指针异常)
function a(){};
function b(){};
a.prototype=new b();
var aobj=new a();
console.log(aobj.constructor==b);//true
console.log(aobj.constructor==a);//false
var arr=[1,2,3];
console.log(arr.constructor===Array) ;//true
4)Object.prototype.toString 返回[object 具体数据类型] 通用方法
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,但必须通过Object.prototype.toString.call来获取,大部分的对象都实现了自身的toString方法,这样就可能会导致Object的toString被终止查找,因此要用call来强制执行Object的toString方法。
var arr=[1,2,3];
console.log(Object.prototype.toString.call(arr));//[object Array]
5)isPrototypeOf 对象的直接继承和间接继承都会为true
isPrototypeOf 判断该对象是否为另一个对象的实例
console.log(Array.prototype.isPrototypeOf([1,2,3]))//true
6)$.type() 对象是undefined和null,则返回“undefined”和“null”
5>判断NAN
1)全局函数isNaN(),但这个函数有一个问题,它总会将参数中的值隐式的转换成数字再做判断,这样就在判断很多明显不是NaN的值的时候也返回了true
var str="shisha";
console.log(isNaN(str))//true
2)解决方法:
1》利用NaN是唯一一个与自身严格不相等的值:
function myIsNaN(value){
return value!==value;
}
console.log(myIsNaN("13232sdf"));//false
console.log(myIsNaN(NaN));//true
2》在使用isNaN()之前先检查一下这个值是不是数字类型,这样就避免了隐式转换的问题
function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}
3)一般用于:检测parseInt()和parseFloat()的结果是否为合法的数字或者检测算数结果
6>判断是不是DOM
在DOM 2标准中定义了一个HTMLElement对象,它规定所有的DOM对象都是HTMLElement的实例,所以我们可以利用这点来判断一个对象是不是DOM对象:如果该对象是HTMLElement的实例,则它肯定是一个DOM对象。在不支持HTMLElement的浏览器中我们则还是使用特征检测法。
//首先要对HTMLElement进行类型检查,因为即使在支持HTMLElement
//的浏览器中,类型却是有差别的,在Chrome,Opera中HTMLElement的
//类型为function,此时就不能用它来判断了
var isDOM = ( typeof HTMLElement === 'object' ) ?
function(obj){
return obj instanceof HTMLElement;
} :
function(obj){
return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
}
7>JS中isPrototypeOf 和hasOwnProperty 的区别
1》isPrototypeOf 判断该对象是否为另一个对象的实例
console.log(Array.prototype.isPrototypeOf([1,2,3]))//true
2》hasOwnProperty是用来判断一个对象是否有你给出名称的属性或对象。不过这个方法无法检查该对象的原型
function Parent(){
this.name='wenbo';
};
Parent.prototype.alertP=function(){
alert('Parent')
};
var f=new Parent();
console.log(f instanceof Parent);//true
console.log(Parent.prototype.isPrototypeOf(f));//true
console.log(Parent.hasOwnProperty('name'));//true
console.log(Parent.hasOwnProperty('alertC'));//false
8>数据类型转换
parseInt()把值转换成整数,只有对String类型调用这个方法,才能正确运行;对其他类型返回的都是NaN,首先查看位置0处的 字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作,以此类推。可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数
parseInt("1234blue");//returns 1234
parseInt("AF", 16);//returns175
parseFloat()把值转换成浮点数,只有对String类型调用这个方法,才能正确运行;对其他类型返回的都是NaN
Boolean()——把给定的值转换成Boolean型(””,0,null,undefine,NaN,转换成false);
valueOf():会返回最适合该对象的原始值。
toString():数值,布尔值,对象,字符串都有这个方法。但是unll,undefine没有这个方法。
String():可以把任何类型转换成字符串
Number(value)——把给定的值转换成数字(可以是整数或浮点数);它转换的是整个值,而不是部分值
隐式转换:
1》“+”:数字和字符串运算+进行操作,那么会将数字先转换为字符串,然后进行字符串连接操作
2》“-”:如果进行减法操作,那么两个操作数都会先被转换为数字,然后在进行算数运算
3》“==”:强制转换,布尔值转换成0或1,字符串和数值时将字符串转换成数值,对象会调用valueOf()
4》递增和递减(“--”,“++”):布尔值和字符串变为数值,在进行加减1操作。
5》一元加和减操作符:
一元加放在数值前面不会对数值产生任何影响。
一元减主要用于表示负数
他们都会把非数值的像Number()转型函数一样对这个值转型。
var num="23";
console.log(typeof +num)//number
6》乘性操作符:(乘法,除法,求模):在操作数非数值的情况下会执行自动类型转换,后台会使用Number()转型函数转换成数值。
7》关系操作符(<,>,<=,>=):
一个操作数是数值,把另一个转换成数值
一个操作数是布尔值,把布尔值转换成数值在比较
if(false>"-2"){
console.log("成功")//成功
}
一个操作数是对象,就调用这个对象的valueOf()方法
两个操作数都是字符,比较两个字符串对应的字符编码
两个操作数都是数值,则执行数值比较