javascript的值与类型

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不是引用类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值