JS 里的类型

作者: 小志1 | 来源:发表于2018-03-20 16:05 被阅读0次

    null

    var n = null;
    n.toString()  //Cannot read property ’toString’ of null
    

    上面报错的意思:toString点前面的是null,因为null没有toString这个API,所以会报错。

    如何转String

    平时常使用的console.log也是用的tostring方法,把要打印的变成字符串。

    String的三种方法:

    • toString()
    • string函数
    • + ''

    如何转Boolean

    Boolean(x) 如果

    • Boolean(0)
    • Boolean(NaN)
    • Boolean('')
    • Boolean(null)
    • Boolean(undefined)
      上面五个是false,其他是true (五个falsy值)
      但是一般转Boolean是这个方法:
      !!(x) 取Boolean !!0 !!true

    如何转number

    '1' -> 1

    • Number('1')
    • parseInt('1',10)
    • parseFloat('1.23')
    • '11' - 0 减零
    • + '13232' //13232 取正

    Stack(栈内存) Heap(堆内存)

    简单值存Stack地址 :number/string/null/undefined/Symbol/Boolean
    复杂值存Heap地址 :Object
    因为js没有指针,但是有引用这个概念。所以变量和对象之间的关系都是引用。
    等于号只做一件事:把右边的东西存到左边
    例子1

    var a = 1
    var b = a
    b = 2
    a = ? //1
    

    把1存到a上,b把a的值存到b上,改变b,a存的值不影响,所以是1


    stack赋值

    例子2

    var a = {name : 'a'}
    b = a
    b = {name : 'b'}
    a.name = ? // a
    

    {name = 'a'}存到heap堆里面,a存的是heap的引用,b=a以后
    ,b也是存的是a的地址的引用,所以b也存的的地址,但是当b变化以后,b存的地址就改变了,没有影响到a的地址,所以a.name = a

    不同地址

    例子3

    var a = {name : 'a'}
    b = a
    b.name = 'b'
    a.name = ? // b
    

    同上,a和b存的是同一个地址,现在b修改的是地址里的值,所以a.name= b

    同一地址

    例子4

    var a = {name : 'a'}
    b = a
    b = null
    a = ? //   {name : 'a'}
    

    一开始存到都是同一个地址,但是null赋给b以后,b就不指向a的地址了,不影响a,所以a = {name : 'a'}

    null赋值
    例子5
    这是一个面试经常错的题
    分析如上,在执行到a.x = a = {n:2}的时候,这里a的值已经确定好了,不会重复确定a的值了,故alert(a.x) // undefined

    垃圾回收

    • 如果一个对象没有被引用,它就是垃圾,将被回收
    var fn = function(){}
    document.body.onclick = fn
    fn = null
    

    fn被回收了吗?
    答案是没有,因为fn等于null了,没有引用这个函数了,应该被回收,但是有document.body.onclick在引用着,而document不会被浏览器回收的,所以有document罩着,不会被回收。

    垃圾回收

    相关文章

      网友评论

        本文标题:JS 里的类型

        本文链接:https://www.haomeiwen.com/subject/wplbqftx.html