JS里的类型

数据类型转换

转换为字符串

  • toString 方法
    // number 类型
    var n = 1
    n.toString()
    '1'
    
    // boolean 类型
    var n = true
    n.toString()
    'true'
    
    // null 报错
    var n = null
    n.toString()
    Uncaught TypeError: Cannot read property 'toString' of null
    
    // undefined 报错
    var n = undefined
    n.toString()
    Uncaught TypeError: Cannot read property 'toString' of undefined
    
    // object 类型
    var obj = {}
    obj.toString()
    "[object Object]"
    
  • 快捷方法
    1 + ''
    '1'
    
    true + ''
    'true'
    
    null + ''
    'null'
    
    undefined + ''
    'undefined'
    
    var obj = {}
    obj + ''
    '[object Object]'
    
    原理:JS中加号如果发现左右任意一边有字符串,会尝试将另外一边也变成字符串。
    1 + '1'
    '11'
    // 等价于
    (1).toString() + '1'
    '11'
    
  • String() 全局函数
    window.String(1)
    '1'
    
    window.String({})
    '[object Object]'
    
    window.String(true)
    'true'
    
    window.String(null)
    'null'
    
    window.String(undefined)
    'undefined'
    

转换为布尔值

  • Boolean() 函数
    Boolean(1)
    true
    
    Boolean(0)
    false
    
    Boolean('123')
    true
    
    Boolean('  ')
    true
    
    Boolean({})
    true
    
    Boolean({name:'frank'})
    true
    
  • 快捷方法
    !! 1
    true
    
    !! 0
    false
    
    !! ''
    false
    
    !! '   '
    true
    
    !! {name:'frank'}
    true
    
  • 5个 falsy 值
    !! 0
    false
    
    !! NaN
    false
    
    !! ''
    false
    
    !! null
    false
    
    !! undefined
    false
    

转换为数字

  • Number() 函数
    Number('1')
    1
    
  • parseInt()
    parseInt('1', 10)
    1
    
    parseInt('011')  // 默认转为十进制
    11
    
    parseInt('011', 8)
    9
    
    parseInt('1s')
    1
    
    parseInt('s')
    NaN
    
  • parseFloat()
    parseFloat('1.23')
    1.23
    
  • 快捷方法
    '1' - 0
    1
    
    '1.23' - 0
    1.23
    
    + '-1'
    -1
    
    - '-1'
    1
    

基本数据类型和复杂数据类型的区别

  1. 在内存中的存储方式不同。

    • 基本类型存在栈内存 (stack) 中;
    • 复杂类型存在堆内存 (heap) 中,在栈中存储引用地址。
                     //      stack        heap
    var a = 1        // a |64位浮点数 |
    var b = 2        // b |64位浮点数 |  { 100
    var o = {        // o |64位地址100|   --------------
      name: 'frank', // c |  1       |    name:'frank' 
      age: 18        //   |          |    age: 18      
    }                //   |          |    gender:'male'}
    var c = true     //   |          |   
    
  2. 访问方式不同。

    • 基本类型直接访问栈内存
    • 复杂类型先访问对象在栈内存中的地址,再按地址访问堆内存中对象。
  3. 复制机制不同

    • 基本类型:a = b 是将b中原始值的副本赋值给a,a和b相互独立,互不影响
    • 复杂类型:a = b 是将b中存储的对象的引用地址赋值给a,a和b指向同一个对象,其中一个做了改变,另一个也会受影响。
    var b = {
      age : 10
    }
    var a = b
    a.age = 20
    b.age
    20
    
  4. 例题

    // 第一题          //     stack       heap
    var a = {}        // a | ADDR33 |  { 33
    a.self = a        //   |        |   -------------
    a.self.self.name  //   |        |   self: ADDR33 
    'a'               //   |        |   name:'a'     }
                      //   |        |   
    
                      
    
    // 第二题         //      stack       heap
    var a = {n:1}    //  a |ADDR34  |  { 34
    var b = a        //  b |ADDR34  |   -------------
    a.x = a = {n:2}  //    |        |   n : 1        
                     //    |        |   x : ADDR54   }
    alert(a.x)       //    |        |   
    undefined        //  a |ADDR54  |  { 54
    alert(b.x)       //    |        |   -------------
    [object Object]  //    |        |   n : 2        }
                     //    |        |
    

垃圾回收

如果一个对象没有被引用,它就是垃圾,将被回收。

  • 举例1
                        //     stack       heap
    var a = {           // a |ADDR60 |  { 30 (垃圾)
      name : 'a'        // b |ADDR60 |   ----------
    }                   //   |       |   name: 'a' }
    var b = {           //   |       |
      name : 'b'        //   |       |  { 60
    }                   //   |       |   ----------
    a = b               //   |       |   name: 'b' }
    
  • 举例2
    var fn = function() {}
    document.body.onclick = fn
    fn = null
    
    //            stack                heap
    //       fn |null    |                    { 110 (不是垃圾)
    // document |ADDR222 |                     ---------
    //          |        |                     function }
    //          |        | 
    //          |        |                       ↑
    //          |        |
    //          |        | { 222              { 333    
    //          |        |  -------------  →  ----------------
    //          |        |  body:ADDR333 }    onclick:ADDR110 }
    

浅拷贝 vs 深拷贝

  • 深拷贝
    // b 变不影响 a
                  //     stack            heap  
    var a = 1     // a | 1     |
    var b = a     // b | 1     |
                  //   |       |
    b = 2         // b | 2     |
    a
    1
    // 所有的基本类型,赋值就是深拷贝
    
  • 浅拷贝
    // 复杂类型(对象)的赋值是浅拷贝
                    //     stack           heap
    var a = {       // a |ADDR44 |     { 44
      name : 'a'    // b |ADDR44 |      -----------
    }               //   |       |      name : 'b' }
    var b = a
    b.name = 'b'
    a.name
    'b'
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容