你真了解parseFloat吗?

        今天看了一下parseFloat,写下来与你们分享,本身也作一下笔记。 函数

        相信不少人都知道JavaScript的parseFloat这个函数,但不必定很了解。包括我本身,之前我总觉得若是传进去的参数是一个对象,那么返回的应该就是NaN。 spa

但事实并不如此,咱们先来看看W3C上面对parseFloat的说明吧。parseFloat 是全局函数,不属于任何对象。parseFloat 将它的字符串参数解析成为浮点数并返回。若是在解析过程当中遇到了正负号(+ 或 -)、数字 (0-9)、小数点,或者科学记数法中的指数(e 或 E)之外的字符,则它会忽略该字符以及以后的全部字符,返回当前已经解析到的浮点数。同时参数字符串首位的空白符会被忽略。若是参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。这里只是说明了parseFloat的用法,并无说它内部是怎么操做的。 code

        咱们再来看看ES5的规范是怎么说的吧
对象


        大意就是先转成字符串,再转为数字,若是不能转为数字,则返回NaN。实验一下,咱们来看3个例子: ip

var return_numStr = {
	toString : function() {
		console.log("toString invoke");
		return "6.5536";//返回一个能够转为数字的字符串
	},
	valueOf : function () {
		console.log("valueOf invoke");
		return "6.5536";
	}
}
parseFloat(return_numStr);//result : toString invoke!! return 6.55.36

var return_not_numStr_butPrimitive = {
	toString : function() {
		console.log("toString invoke");
		return true;//返回的是primitive类型的值,但不能够转为数字
	},
	valueOf : function () {
		console.log("valueOf invoke");
		return "6.5536";
	}
}
parseFloat(return_not_numStr_butPrimitive);//result : toString invoke!! return NaN!

var return_not_primitive = {
	toString : function() {
		console.log("toString invoke");
		return {};//返回不是primitive类型
	},
	valueOf : function () {
		console.log("valueOf invoke");
		return "6.5536";
	}
}
parseFloat(return_not_primitive);//result : toString invoke valueOf invoke too!!! return 6.5536



总结一下:

1.首先为传进来的参数调用toString方法,若是返回的是primitive类型(即Number,String, Boolean,Undefined,Null),则将此返回值转为字符串。再尝试将字符串转为数字,若是不能转成数字则返回NaN。(可参考实例代码1, 2) 字符串

2.若是toString方法返回的不是ptimitive类型,则继续调用valueOf方法。若是返回的是primitive类型,则将其转为字符串,再将字符串转为数字返回。 get

3.若是valueOf方法返回的也不是primitive类型,则返回NaN。 it

相关文章
相关标签/搜索