zoukankan      html  css  js  c++  java
  • 关于类型转换

      JavaScript中,类型转换实在是太常见了。分为显示类型转换和隐式类型转换。

      今天讨论的不是什么情况下,发生类型转换,而是在特定条件下,对象是怎么发生类型转换的。

      以显示类型转换的方法Number()为例:

      关于Number()的转换方法在《JavaScript高级程序设计》有详细的介绍

      

      我们现在关注的焦点在红线框出来的这块。

            var obj = {
                toString: function() {
                    return "456"
                },
                valueOf: function() {
                   return 123;
                }
            }
            console.log(Number(obj))
    

       在浏览器当中验证一下,返回123,如果按照我们对红线框出来的这句话理解,那么如果我们在重写valueOf的方法时,让其返回值变成NaN,那么他是不是就会再次调用toString方法呢?

           var obj = {
                toString: function() {
                    return "456"
                },
                valueOf: function() {
                    return NaN;
                }
            }
            console.log(Number(obj))
    

      在浏览器中查看答案:

      

      很抱歉,依然是NaN,并没有调用toString方法,什么情况这是?

      很纠结吧!

      稍作变形: 

            var obj = {
                toString: function() {
                    return "456"
                },
                valueOf: function() {
                    return {
                        result: 124
                    };
                }
            }
            console.log(Number(obj))
    

       当valueOf返回一个对象时,此时Number(obj)的返回结果居然是数字456,是不是很惊喜?仔细琢磨一下,发现:

      在使用Number()对对象做显示类型转换时,优先调用valueOf方法,当返回结果非基本类型值时,他会再次调用toString方法。注意:如果这两个方法都重写了,而且返回值都是非基本类型值的话,会报错。

             var obj = {
                toString: function() {
                    return {
                        num: 12
                    }
                },
                valueOf: function() {
                    return {
                        result: 124
                    };
                }
            }
            console.log(Number(obj))    
    

      报错如下:

      

      而如果仅仅重写了其中一个方法,无论哪个,他都优先调用重写后的方法,返回基本类型值之后,再按照基本类型值进行类型转换,转换为数值。

      关注点在:重写了两个方法之后,如果valueOf直接返回NaN,并不会再次调用toString。

      

      

        

  • 相关阅读:
    node拦截器设置
    node中session存储与销毁,及session的生命周期
    node做验证码
    防止iframe被别的网站引用
    表单元素disabled禁用后不能自动提交到服务器
    bootstrap 模态框中弹出层 input不能获得焦点且不可编辑
    post请求和get请求content_type的种类
    Firefly在线一键安装
    Firefly通讯协议-
    Firefly《暗黑世界》碎片合成部分代码
  • 原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/10304612.html
Copyright © 2011-2022 走看看