web开发人员的专业javascript告诉我们如何将对象转换为数字,这是一个错误吗?

web开发人员的专业javascript告诉我们如何将对象转换为数字,这是一个错误吗?,javascript,type-conversion,Javascript,Type Conversion,看看下面的代码,它应该输出什么 让obj=Object.create(null); obj.valueOf=函数(){console.log('hit valueOf!');返回“TO BE NaN”;}; obj.toString=函数(){console.log('hit-toString!');返回“1”;}; 编号(obj) // ? 根据专业javascript,valueOf函数返回“to BE NaN”,并将其转换为NaN,然后调用toString函数 数字转换 当应用于对象

看看下面的代码,它应该输出什么

让obj=Object.create(null);
obj.valueOf=函数(){console.log('hit valueOf!');返回“TO BE NaN”;};
obj.toString=函数(){console.log('hit-toString!');返回“1”;};
编号(obj)
// ?
根据专业javascript,valueOf函数返回“to BE NaN”,并将其转换为NaN,然后调用toString函数

  • 数字转换
当应用于对象时,将调用valueOf()方法并转换返回的值 基于前面描述的规则。如果该转换结果为NaN,则toString() 方法,并应用转换字符串的规则

事实上,它在这里显示了一些东西,函数toString没有被调用

让obj=Object.create(null);
obj.valueOf=函数(){console.log('hit valueOf!');返回“TO BE NaN”;};
obj.toString=函数(){console.log('hit-toString!');返回“1”;};
编号(obj)
//击中目标!
//楠
web开发人员的专业javascript告诉我们对象如何转换为数字是错误的吗?

number(value)
,根据规范,
ToNumeric(value)
,返回
ToPrimitive(value,number)
。第二个参数是
preferredType
,:

如果提示是字符串,则

让方法名为«“toString”,“valueOf”»

否则,

让methodname为«“valueOf”,“toString”»

对于MethodName的每个元素名称,请执行以下操作

a。让方法成为现实吧?获取(O,名称)

b。如果IsCallable(方法)为true,则

  • 让结果如何?调用(方法,O)
  • 如果类型(结果)不是对象,则返回结果
  • 因此,在
    Number(obj)
    的情况下,实际上应该首先调用
    valueOf
    方法

    换言之,无论以下句子来自何处,都是不正确的:

    当应用于对象时,将调用valueOf()方法,并根据前面描述的规则转换返回的值。如果转换结果为NaN,则调用toString()方法并应用转换字符串的规则


    是的,这是你书中的一个错误

    它应该读得更像1

    当应用于对象时,将调用
    valueOf()
    方法,如果返回的值是基元值,则将根据前面描述的规则对其进行转换。如果转换结果为NaN,则返回一个对象,调用
    toString()
    方法并应用转换字符串的规则

    证明:

    const obj=Object.create(空);
    obj.valueOf=函数(){console.log('hit valueOf!');返回{};};
    obj.toString=函数(){console.log('hit-toString!');返回“1”;};
    
    console.log(Number(obj))
    我不知道这个“面向web开发人员的专业javascript”是什么,也不知道您在说什么“错误”,但您是否尝试过阅读or或or(这是选择
    valueOf
    toString
    的相关行为)?显然是“面向web开发人员的专业javascript”是一本书,你问它是否有错误。大概我不知道那句话的全部内容。在两种方法中,
    toString
    valueOf
    只调用一种。不存在一种方法作为另一种方法的“后备”的行为。