Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

valueOf与toString方法研究2

我是出于一个“邪恶”的目的来研究它们的,因为目的过于邪恶,所以研究必须更为深入才能成功。但天机不可泄漏,大家跟着我享受过程即可。

我们先看两题:

  1. var date = new Date();
    var date_string = date.toString();
    var date_value = date.valueOf();
    alert(date == date_string);
    alert(date == date_value);

    true, true

    false, false

    true, false

    false, true

  2. var now = new Date(2010,10,1);
    alert(now+1);

    Mon Nov 1 00:00:00 UTC+0800 20101

    1288540800001

    [object Date]1

答案如下:

第一题非常难,如果不知道内部规则的话,那我们还是先看第二题吧,首先考察一下Date.toString方法,其返回值在不同还是有差异的。

  • IE8:Mon Nov 1 00:00:00 UTC+0800 2010
  • chrome5:Mon Nov 1 00:00:00 UTC+0800 2010(China Standard Time)
  • safari5:Mon Nov 01 2010 00:00:00 GMT+0800 (Öйú±ê׼ʱ¼ä)
  • opera 10.5:Mon Nov 01 2010 00:00:00 GMT+0800
  • firefox 3.6:Mon Nov 01 2010 00:00:00 GMT+0800

接着我们再翻开ECMA262v5的11.6.1节,看有关对加号操作符的处理:

  1. 决定哪个是被加数
  2. 将被加数传入GetValue中进行运算
  3. 决定哪个是被加数
  4. 将加数传入GetValue中进行运算
  5. 将2的结果传入ToPrimitive中进行运算
  6. 将4的结果传入ToPrimitive中进行运算
  7. 如果5或6的结果随便一个为字符串,那么
  8. 将6直接置于5之后拼成新字符串返回
  9. 否则将它们都转换为数字(ToNumber)相加返回

这内部调用一个ToPrimitive方法,它定义在9.1节,基本上只对Object对象进行特殊处理

类型 结果
Undefined 与输入时一致,无转换
Null 与输入时一致,无转换
Boolean 与输入时一致,无转换
Number 与输入时一致,无转换
String 与输入时一致,无转换
Object Object 返回Object的默认值,它由内部一个名为[[DefaultValue]] 的方法决定的。

[[DefaultValue]] 会根据提示信息是调用valueOf方法或toString方法。此提示信息当然是前面提供的,我们再翻回11.6.1节,它解释道,除Date对象外,其他ECMA对象都应该转换为数字,Date则为字符串。看到这里,一切疑云应该清空吧。

在wtfjs中提到一道难题

[] == ![]  //答案为true,注意非[] !== []

拥有了以上的知识,我们就轻而易举地解决它。

[] ==> [].valueOf() ==> '';
![] ==> false
'' == false ==> true!!

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(5752)  评论(3编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示