美文网首页Web前端之路程序员
JavaScript 万物皆对象?

JavaScript 万物皆对象?

作者: 三毛丶 | 来源:发表于2017-05-28 09:12 被阅读112次

原文链接我的blog

为什么说“ JavaScript 万物皆对象?”,这个“万物”,难道真的是“万物”?

其实不然。

在 JavaScript 中一共有七种主要类型:

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Symbol
  • Object

前六种为基本数据类型,Object 为引用类型(对象类型),值得注意一点的是用 typeof null 会返回 Object,这实际上是一个bug,Null 实际上是基本类型的值。

typeof null // object 原理:不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判 断为 object 类型,null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“object”。

根据 JavaScript 对语言类型的分类,很容易知道,并不是 JavaScript 万物皆对象,或者说任何非基本类型的都是对象类型。

基本类型,引用类型(对象类型)

区别基本类型,对象类型,归根结底还是得从基本类型,对象类型各自特点出发。

基本类型:包括上述中的六种,基本类型的值是一种简单的数据段。存储在栈内存中;当复制基本类型的值时,复制它的值(改变其中一个,另一个不受影响),比较时,按其值比较。

引用类型:一种数据结构,是一类对象所具有的属性和方法;引用类型的值是可能是由多个值构成的对象,储存在栈内存与堆内存中;当复制引用类型的值时,复制它的引用(改变其中一个,另一个随之改变),比较时按其引用比较。

根据基本类型与引用类型各自特点,便容易区分。

  • 能否添加/删除属性

    // 引用类型
    let arr = []
    arr.name = 'jk'
    arr.name // jk
    
    // 基本类型
    let str = 'mark'
    str.name = 'chao'
    str.name // undefined
    
  • 复制以后,改变其中一个变量,是否对另一个变量有影响

    • 复制基本类型的值时,会创建一个新值,然后把该值复制到为新变量分配的位置上,此后两个变量互不影响。

      let a = 1
      let b = a
      b = 2
      console.log(a) //1
      

      复制前:


      复制后:


    • 复制引用类型的值时,同样也会将存储在变量中的值复制一份放到为新变量分配的空间中,不同的是,此时这个值,实际上是一个指向堆内存中的指针。复制结束后,两个变量将引用同一个对象,改变其中一个,另一个随之改变。

      let obj1 = {
        name: 'Mary'
      }
      
      let obj2 = obj1
      
      obj2.name = 'Jack'
      console.log(obj1.name) // 'Jack'
      
      

基本包装函数

既然基本类型并非对象,也就不具备属性和方法,那为什么能使用例如length, charAt的方法的了?这其中起作用的就是基本包装函数了。

每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据(null, undefined 没有对应的构造函数形式)。

一个简单例子:

let str = 'Jack'
let oStr = str.substring(2)

第二行代码,访问 str 时,访问过程处于读取模式,也就是会从内存中读取这个字符串的值,在读取过程中,会进行以下几步:

  • 创建一个 String 类型的一个实例;
  • 在实例上调用相应的方法。
  • 销毁这个实例。

另一种形式表示:

let str = new String('Jack')
let oStr = str.substring(2)
str = null

基本包装函数,与引用类型主要区别就是对象的生存期,使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前一直都保存在内存中,而自动创建的基本包装类型的对象,则只存在与一行代码的执行瞬间,然后被立即销毁。这也就是不能给基本类型添加属性和方法的原因了。


完。

相关文章

  • JavaScript - 对象

    对象 JavaScript 是一门面向对象脚本语言,在 JavaScript 中,万物皆对象。而对象只是带有属性和...

  • JavaScript面向对象

    一. JavaScript面向对象前言 1.1 什么是对象? Everything is object (万物皆对...

  • JavaScript面向对象

    一. JavaScript面向对象前言 1.1 什么是对象? Everything is object (万物皆对...

  • 原型链和访问对象原型的方法

    1.背景介绍 javaScript 中,万物皆对象。 JavaScript根据"原型链"(prototype ch...

  • JavaScript | 面向对象编程

    Reference : JavaScript教程 - 廖雪峰的官方网站 JavaScript哲学:万物皆对象 Ja...

  • JS面对对象,我要面对两头象

    javascript是脚本语言?javascript万物皆对象? 呵呵哒!带你见识下js面对对象的魅力 是的是的,...

  • 原型与原型链

    JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object ,Function...

  • 原型链详解

    title: 技术分享篇 Welcome 原型链 原型对象 在Javascript中,万物皆对象,但对象也有区别,...

  • JavaScript 万物皆对象?

    原文链接我的blog。 为什么说“ JavaScript 万物皆对象?”,这个“万物”,难道真的是“万物”? 其实...

  • 万物皆对象目录

    万物皆对象(1) 万物皆对象(2) 万物皆对象(3) 万物皆对象(4)

网友评论

    本文标题:JavaScript 万物皆对象?

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