javascript - Number()函数传入Object时的情况
怪我咯
怪我咯 2017-04-11 11:53:20
0
2
779

我在读《Javascript高级程序设计》一书时,当读到Number Type下对于Number()函数转化规则一部分时,发现他有如下一个介绍:

When applied to objects, the valueOf() method is called and the
returned value is converted based on the previously described rules.
If that conversion results in NaN, the toString() method is called and
the rules for converting strings are applied.

按照它的描述,我的理解是,对于一个Object,先执行Object的valueOf()函数,如果最后转化结果是NaN,就再采用Object的toString()函数进行转化。

但是我做了如下实验:

var obj = {
    a: "hello",
    valueOf: function() {
        return this.a;
    },
    toString: function() {
        return 1;
    }
}

Number(obj) // 结果:NaN

所以是不是书里描述错误了,应该是如果没有valueOf()函数的时候才执行toString(),否则只是执行valueOf()

怪我咯
怪我咯

走同样的路,发现不同的人生

Antworte allen(2)
小葫芦

犀牛书里关于这个写的是:传入对象 先调用valueOf 如果返回的是对象的原始值,则把原始值转成数字,如果不返回原始值,则调用tostring 。 你的例子valueof 返回的是字符串已经是原始值了,把这个字符串的原始值转换成数字就是NaN并返回, 不需要再调用tostring 了。 不知道我理解的对不对

洪涛

Number(),传入object的话:

Apply the following steps:
1.Let primValue be ToPrimitive(input argument, hint Number).
2.Return ToNumber(primValue).

ToPrimitive会调用 [[DefaultValue]]内部方法:

1.Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf".
2.If IsCallable(valueOf) is true then,
a.Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and an empty argument list.
b.If val is a primitive value, return val.

你的"hello"是字符串,就是原始值了,再执行把字符串转成数字:"hello" -> NaN

你可以试试:

var obj = {
    a: "123",
    valueOf: function() {
        return this.a;
    },
    toString: function() {
        return 1;
    }
}

Number(obj) // 结果:123
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!