在javascript中,没有对象、直接调用的函数,都是全局函数。说是全局,其实只不过是从属于内置对象window的属性或方法而已。也就是说,isNaN()等价于window.isNaN()。其它方法属性也是类似,比如:
// 不属于任何对象的ivar i = 5
function test(){
alert(i)
}
test()// 5
alert(i) // 5
alert(window.i) // 5
以上几种alert出来的i都是5,说明window.i其实就是声明的那个i。
isNaN是window对象的一个方法,它的作用是判断参数是不是一个NaN。其实也就是看参数能不能转化为数字,如果能,就返回false;不能转化为数字,则返回true。例如:
isNaN('134') // false,字符串134可以转化为数字isNaN('1a34') // true,字符串1a34不能转化为数字
isNaN('0x34') // false,字符串0x34能转化为数字,十六进制
isNaN(true) // false,布尔型变量能转化为数字,值为1
有一点要注意,在上面已经提到,布尔型值是能够转换成数字的,比如:
alert(true + 1) // 结果为2,因为true会转化为数字1,而false会转化为数字0但是,如果用下面的代码,就会得到NaN:
alert(parseInt(true)) // NaNparseInt和isNaN类似,都是window的一个方法,其作用是将参数强制转化为整数,类似的还有window的另一个方法parseFloat,将参数强制转化为浮点数。显然这里parseInt(true)得到了一个NaN,但isNaN(true)得到的却是false。
这两者之间的差别,太具体的我就不清楚了。
1、isNaN是Ecmascript提供的内置对象Global的一个函数,如下代码即可以检测
console.log(typeof isNaN)//打印function2、function自然不是Number类型啦,严格来说,funcion属于对象类型,在其他语言中function是单独的一种数据类型,但是在js中Function类型是Object类型的派生类型。js中数据类型有如下:
字符串、数字、布尔、数组、对象(包括函数)、Null、Undefined3、那么得出的结论如下
//自定义的函数var myfc=function() {}
//全局函数,isNaN为ecma内置对象global的函数
var gloabfc=isNaN
//都是函数(函数的类型被ecma划分为对象类型)
console.log('myfc的数据类型为:'+typeof myfc)
console.log('gloabfc的数据类型为:'+typeof gloabfc)
//1、js是一门弱语言类型,其中弱指的是弱数据类型,也就是说变量的类型一开始并不会确定,当为变量赋值时会自动判断后隐式转换它的所有类型类型并进行转换。那么它的变量、表达式等在参与运算时,即使类型不正确,也能通过隐式转换来得到正确地类型。
//2、其他类型转为布尔运算时,如果一个对象(函数也是对象)存在,那么则为true。 如果不存在,会抛出异常,不是你想象中的false,哈哈!
//3、isNaN是存在一个函数,所以为true
function turnBoolean(param) {
if(param){
console.log(param+'的转换结果为:'+true)
}else{
console.log(param+'的转换结果为:'+false)
}
}
turnBoolean(myfc)
turnBoolean(gloabfc)
//其他数据类型转布尔值
turnBoolean(null)
turnBoolean(undefined)
turnBoolean(0)
turnBoolean('')
turnBoolean(1)
turnBoolean({})
其实总结就一句,因为isNaN函数(对象)存在,所以为true