• Y
    2019-12-25
    这应该是由于对象类型转换为值类型时的拆箱操作导致的。
    []拆箱的话会先执行[].valueOf(),得到的是[],并不是原始值,就执行[].toString(),得到的结果是''。
    {}拆箱会先执行{}.valueOf(),得到的是{},并不是原始值,于是执行toString(),得到的结果是[object Object]。
    []+{}就相当于""+"[object Object]",结果就是[object Object]。
    {}+[]的话,js会把开头的{}理解成代码块,所以这句话就相当于+[],也就是等于+"",将空字符串转换为数字类型,结果就是0。
    {}+{}的话,也是和上面一样的道理,相当于+"[object Object]",将字符串转化为数字类型,结果是NaN。
    []+[]就相当于""+"",所以结果还是""。
    展开

    作者回复: 赞的。^^.

    今天的课程可以对答案哟。

    
     7
  • 王大可
    2019-12-26
    在chrome浏览器(版本 79.0.3945.88(正式版本) (64 位))计算 {} + {} 结果是"[object Object][object Object]"
    edge 下是计算 {} + {} 结果是 NaN

    作者回复: 确实。

    不过在浏览器的控制台上,和在引擎的层面上执行也是会有区别的。都是使用 v8,NodeJS在Shell中与chrome也一样。但是你写在.js文件中,或者直接从node的命令行上执行,效果就不一样了,例如:

    ```
    > node -p -e '{} + {}'
    NaN
    ```

     1
     2
  • 潇潇雨歇
    2019-12-25
    []和{}在转换为值类型时会先调用valueOf然后调用toString。
    1、[]+{},前者转换'',后者转换为[object Object],这里为字符串连接操作,所以结果为'[object Object]'
    2、{}+[],前者为代码块,后者+操作符将''转换为0,所以结果为0
    3、{}+{},前者为代码块,后者+操作符将'[object Object]'转换为NaN,因为它不能转换为一个正常的数值
    4、[]+[],前者为'',后者也为'',这里是正常的字符串连接,所以结果为''

    作者回复: 赞的,+1票。^^.

    今天的课程就分析这个了。

    
     1
  • sprinty
    2019-12-25
    在您的文章里,经常出现 "界面" 这个词,怎么理解呢?

    我简单的当做 "编程接口" 的近义词。

    作者回复: 是的。同义。

    只是我一直的工作是架构,所以架构中通用它的直译,也就是“界面”,而不是“接口/编程接口”,因为有些架构中的界面,并不是用编程来实现的。在这种情况下,界面更多的是一种规约。

    
     1
  • 晓小东
    2019-12-27
    老师对于下面两段话,我理解的不是很清楚 (没看出来,判断两次还是判断一次逻辑???)

    NOTE: 在 ECMAScript 6 之前,由于[PrimitiveValue]来存放对应的封装类。也就是说,只有当obj.[Class]存放着false值时,它才是false值所对应的对象实例。而 ECMAScript 6 将上述的依赖项变成了一个,也就是说只要有一个对象有内部槽[[BooleanData]],那么它就是某个 boolean 值对应的对象。这样处理起来就简便了,不必每次做两项判断。

    作者回复: ES6之前,是需要判断两次的。
    * 有[[PrimitiveValue]]内部槽,说明是一个用包装类得到的值。然后,
    * 查看[[Class]]内部槽,找到对应的包装类,从而知道类型。

    在ES6之后,由于每种包装类有独立的一个槽,所以如果对象obj有[[BooleanData]],那就说明了包装类是Boolean(),且被包装的数据在[[BooleanData]]槽中。

    
    
  • 鲜于.css
    2019-12-26
    js就是学不明白闭包和原型原型链
    
    
  • 晓小东
    2019-12-25
    老师有个问题, 既然您讲了数据的值类型与引用类型概念, 像weakSet与weakMap 对对象的弱引用该如何理解, 这个弱引用到底是个啥。

    作者回复: 弱引用是向weakSet/weakMap中添加一个目标对象的引用,但添加是目标对象的引用计数不增加。比较来说:

    ```
    var x = {}; // <-右边的对象字面量的引用计数加1
    var y = x; // <- 再加1
    weakSet.add(x); // <-不加1
    weakSet.add(y); // <-也不加1
    delete x; // 减1
    delete y; // 再减1
    ...
    ```
    到这里,由于对象的引用计数为0了,所以weakSet中的那个被add()进去的x、y就自动被回收了。——weakSet/weakMap具备这种机制。

    所以weakSet/weakMap没有size这个属性,它不安全。——你刚读了它的值,它自己自动回收了一下,就又变掉了。

    
    
我们在线,来聊聊吧