javascript数值转换问题

clipboard.png

clipboard.png

js高级程序设计第三版
关于数值转换的描述

clipboard.png

如果是NaN不行应该执行toString么 怎么会打印出NaN?

阅读 1.9k
4 个回答

转换规则如下:

  1. 如果valueOf存在,且返回“基本类型”数据,返回valueOf的结果。
  2. 如果toString存在,且返回“基本类型”数据,返回toString的结果。
  3. 报错。

综上所诉

var box = {
  valueOf() {
    console.log('调用了valueOf');
    return 'abc';
  },
  toString() {
    console.log('调用了toString');
    return '123';
  },
};
console.log(Number(box));

以上就只调用了valueOf,因为valueOf返回的是基本类型数据。


var box = {
  valueOf() {
    console.log('调用了valueOf');
    return {};
  },
  toString() {
    console.log('调用了toString');
    return '123';
  },
};
console.log(Number(box));

以上两个方法都调用了,因为valueOf返回的不是基本类型,所以在调用一次toString


同理 你可以在测试一下两个方法返回的都是复杂类型数据的时候结果是什么

我的理解是这样,希望对你有所帮助!

基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。
  • 示例代码
var box = {
        valueOf: function() {
            return 1;
        },
        toString: function() {
            return "toString";
        }
    };
console.log(Number(box)); //1
console.log(String(box)); //toString
*    当使用`Number`时,调用的其实是其内部的`valueOf`方法,返回一个`1`,这样`Number`本身也要对返回值进行一次检查,如果你返回的不是`number`类型的,当然检测出来就是`NaN`,当然这个方法也可以重写
*    使用`String`也是同上理解,不过不会出现`NaN`而已。
博主对这句话理解有偏差

number类型转换

前面的规则说明了,如果是对象则调用ValueOf()方法,这时候调用valueOf()方法已经返回'abc',然后再依照前面的规则,规则第五条,所以返回NAN

前面的规则

另外,命理难说 回答地很详细!

var box = {
  valueOf() {
    return 'abc';
  },
  toString() {
    return '1233';
  },
};
console.log(Number(box));

==>

var box = {
  valueOf() {
    return 'abc';
  },
  toString() {
    return '1233';
  },
};
var boxValue=Number(box);
console.log(boxValue);

Number作为普通函数调用时,将执行类型转换
转换规则,先调用对象的valueOf方法,如果能返回一个基本类型(原始类型),那么返回这个原始类型,再根据原始类型到number类型的转换规则执行转换,不能转换成数字,那么返回NaN。
如果valueOf不能不能返回基本类型,那么转而去调用toString方法,如果这个方法能返回原始类型,再根据原始类型到number类型的转换规则执行转换,不能转换成数字,那么抛出类型错误
Uncaught TypeError: Cannot convert object to primitive value

var box = {
  valueOf() {
    return {};
  },
  toString() {
    return {};
  },
};
var boxValue=Number(box);//Uncaught TypeError: Cannot convert object to primitive value
console.log(boxValue);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题