javascript的值与类型
/**
* 主题
* 1、typeof的用法
* 2、基本类型,引用类型有哪些
* 如何判断基本类型和引用类型简单判断
*
* 3、instanceof的用法
* 4、Object.prototype.toString完成类型的判断
* 5、如何区别数组类型和对象类型
* 6、NaN
* 7、undefined和null
*/
/*1、typeof
用法1 typeof value === 'xxx';
用法2 typeof( value ) === 'xxx';
*/
// 所有的typeof的测试结果返回的是一个字符串
console.log( typeof( typeof( 1 ) ) );//'string'
/*2、引用类型和基本类型*/
// 基本类型
console.log( typeof 1 );//'number'
console.log( typeof '1' );//'string'
console.log( typeof true );//'boolean'
console.log( typeof undefined );//'undefined'
console.log( typeof NaN );//number
// 引用类型
// {} 和 []返回的结果都是object,所以typeof并不能区分两者
console.log( typeof []);//'object'
console.log( typeof {});//'object'
console.log( typeof function(){} );//'function'
// 小测试
console.log( typeof 1.2);// 'number' 证明js中并没有浮点型的类型
console.log( typeof null );// 'object' null可能是引用类型
console.log( null === null );// true null可能是基本类型,所以用typeof判断null的类型不靠谱
console.log( typeof {} );// 'object'
console.log( {} === {} );// false 引用类型的不会等于和自身类似的相等,这里相当于 new Obejct() === new Object()
/*
3、instanceof的用法
主要用于实例和构造函数之间的判断
*/
/*基本值的检测*/
console.log( 1 instanceof Number );// false
console.log( '1' instanceof String );// false
console.log( true instanceof Boolean );// false
console.log( null instanceof Object);// false
console.log( undefinedinstanceof Object );// false
/*引用类型的检测*/
console.log( []instanceof Array);// true
console.log( {}instanceof Object );// true
console.log( function(){} instanceof Function );// true
/*将基本值转换成对象后 instanceof操作就起判断类型的作用了*/
console.log( 1instanceof Number );// false 因为此时的1是一个基本类型,而非一个数值类对象
console.log( new Number(1) instanceof Number );//true 此时的1被转换成数值对象了
console.log( 1 === 1 );//true
console.log( 1 === new Number(1) );//false
console.log( new Number(1) === new Number(1) );//false
// 这里可以解释'abc'.length 'abc'明明只是一个基本类型,为什么能够访问到length属性呢?原因只可能是在调用length属性之前,'abc'被隐式转化成字符串对象,只有对象才会有方法和属性
/*{}和[]通过instanceof的结果*/
console.log({} instanceof Object);//true
console.log({} instanceof Array);//false;
console.log([] instanceof Object);//true
console.log([] instanceof Array);//true
// 还是不能使用instanceof进行类型的区别
/*4、Object.prototype.toString.call进行类型的判断*/
// 即使你传入一个基本类型去调用toString方法,也会返回对应的值类型回来
console.log(Object.prototype.toString.call( 1));//'[object Number]'
console.log(Object.prototype.toString.call( 1.2));//'[object Number]'
console.log(Object.prototype.toString.call( '1'));//'[object String]'
console.log(Object.prototype.toString.call( true));//'[object Boolean]'
// 可以利用这个特性进行数组和对象两者之间的区分
console.log(Object.prototype.toString.call( []));//'[object Array]'
console.log(Object.prototype.toString.call( {}));//'[object Object]'
console.log(Object.prototype.toString.call( function(){} ));//'[object Function]'
console.log(Object.prototype.toString.call( null));//'[object Null]'
console.log(Object.prototype.toString.call( undefined));//'[object Undefined]'
/*5、如何区别数组类型和对象类型*/
function isArray(a){
if(Array.isArray){//es5提供的原生判断方法
return Array.isArray(a);
}else{
Object.prototype.toString.call(a) === '[object Array]';
}
}
/*6、NaN*/
console.log(NaN === NaN);//false;
function isReallyNaN(v){
return (v === v) === false;
}
var res = isReallyNaN(NaN);
console.log(res);//true
// js原生的isNaN函数在判断之前会将参数值先进行一次隐式转换,所以用isNaN来进行判断并不靠谱
console.log(isNaN('xxx'));//true
/*7、undefined和null*/
var a ;//变量在声明的时候默认值为undefined
console.log(a);//undefined
console.log(typeof undefined);//undefined
console.log(typeof null);//object
console.log(Object.prototype.toString.call(undefined));// [object Undefined]
console.log(Object.prototype.toString.call(null));// [object Null]
// null到底是不是基本类型
console.log(undefined instanceof Object);//false
console.log(null instanceof Object);//false 证明null是属于基本类型
console.log(null.constructor);// undefined 证明null不是引用类型