JavaScript中的isNaN()函数
伊谢尔伦
伊谢尔伦 2017-04-10 17:40:18
[JavaScript讨论组]

“isNaN()确实适用于对象。在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。”
这段内容不明白,请各位老师给解释一下,多谢!

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
大家讲道理

请看下面的例子。

isNaN(obj)

// 等同于

if (typeof obj.valueOf() === 'object') {
  isNaN(obj.toString());
} else {
  isNaN(obj.valueOf());
}

上面代码中,isNaN函数将obj对象转为数值。首先,调用obj.valueOf方法, 结果返回对象本身;于是,继续调用obj.toString方法,这时返回字符串"[object Object]",对这个字符串使用isNaN函数,得到true。因为字符串不是数字。

默认情况下,对象的valueOf方法返回对象本身,所以一般总是会调用toString方法,而toString方法返回对象的类型字符串(比如[object Object])。所以,会有下面的结果。

isNaN({}) // true

如果toString方法返回的不是原始类型的值,结果就会报错。

var obj = {
  valueOf: function () {
    return {};
  },
  toString: function () {
    return {};
  }
};

isNaN(obj)
// TypeError: Cannot convert object to primitive value

上面代码的valueOf和toString方法,返回的都是对象,所以转成数值时会报错。

从上面的例子可以看出,valueOf和toString方法,都是可以自定义的。

isNaN({
  valueOf: function () {
    return 2;
  }
})
// false

isNaN({
  toString: function () {
    return 3;
  }
})
// false

为了更好的解释先运行的valueOf()方法,可以进行如下测试,Number() 和 isNaN()行为类似

Number({
  valueOf: function () {
    return 2;
  },
  toString: function () {
    return 3;
  }
})
// 2

解释的够清楚了,哈哈,望采纳

迷茫
var obj = {};

//当你把obj丢进isNaN(obj)时
// 做了两件事
// 1. 首先调用obj的valueOf()方法, 假设返回了一个 valueOfResult
// 判断valueOfResult是否可以转换为数值, 如果不能,
// 再 valueOfResult.toString() 看是否能转化为数值。
大家讲道理

undersocerjsNaN的判断

// Is the given value `NaN`? (NaN is the only number which does not equal itself).
  _.isNaN = function(obj) {
    return _.isNumber(obj) && obj !== +obj;
  };

//为了看的清楚,下面的代码在源码上做了一点点修改
  _.isNumber= function(obj) {
    return return Object.prototype.call(obj) === '[object Number]';
  };
ringa_lee

谢谢各位老师的指点,非常感谢!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号