美文网首页JavaScript 基础专题
ECMAScript 之数据类型

ECMAScript 之数据类型

作者: Jeuin | 来源:发表于2020-11-20 09:42 被阅读0次

    概述

    计算机程序 = 数据结构 + 算法

    计算机程序的运行需要对数据进行操作,能够表示操作的值(Literals)的类型(Types) 称为数据类型。

    ES3 定义了 6 种语言类型,其中包括 5 种原始数据类型1 种引用数据类型

    • 原始数据类型:Undefined、Null、Boolean、String、Number
    • 引用数据类型:Object

    Undefined

    Undefined 类型表示 “未定义”。它仅有一个值 undefined,并且该值不是 JavaScript 的关键字和保留字,它是一个合法的标识符。

    Null

    Null 类型表示“空值”,它只有一个值 nullnull 是 JavaScript 的关键字,不能作为标识符使用。

    Boolean

    Boolean 类型表示一个逻辑实体,它仅有两个值 truefalse

    String

    字符串是由零个或多个 Unicode 字符(UTF-16)组成的有限有序序列的集合,最大长度为2^53-1

    字符串中每个字符被认为在序列中占据一个位置(索引),这些位置用非负整数表示,索引从 0 开始,依此类推。

    字符串的长度就是其中的字符数;空字符串不包含任何字符,因此长度为零。

    字符串可以当作只读数组,通过索引访问 'hello'[0]

    Number

    Number 类型使用 IEEE 754 标准来表示整数(32bit-4byte)和浮点数值(64bit-8byte)。

    有限大小,其中一半是正数,一半是负数;对于每个有限正数,都有一个相应的负数具有相同的大小。

    特殊的数值

    NaN

    NaN(Not-a-Number) 表示非数值,这个数值用于表示执行一些不合法的数学运算失败后返回的结果,此时不会抛出异常,例如 0/01/"xxx"

    任何涉及 NaN 的操作(如 NaN/10)都会返回 NaN。

    NaN 与任何值都不相等,包括 NaN 本身

    console.log(NaN == NaN) // false
    console.log(NaN/10) // NaN
    console.log(0/0) // NaN
    

    Infinity

    Infinity 表示无穷大,分为正无穷和负无穷。正数除以 0 返回 Infinity,负数除以 0 返回 -Infinity。

    console.log(1/0) // Infinity
    console.log(-1/0) // -Infinity
    

    +0/-0

    JavaScript 中存在正零(+0)和负零(-0)两个数值,且正零和负零是严格相等的

    console.log(+0 == -0) // true
    console.log(+0 === -0) // true
    

    Object

    对象是由一组零个或多个属性(properties)组成的无序集合。

    每个属性都包含以下内容:

    • 一个名称:属性名称可以是 String 值或 Symbol 值(ES6)。
    • 一个值:属性值可以是任何数据类型值。
    • 一组属性(attributes):每个 properties 具有 0 个或多个特征(attributes)描述属性,这些特征决定了如何使用每个属性。

    属性是包含其他数据类型值的容器

    var boy = {
        // 属性:表示对象的基础数据
        name: 'sgl',
        age: '25',
        // 属性:表示对象具备的功能
        loveMe: function() {
            console.log('love me very much')
        }
    }
    

    属性的特征属性

    image
    • ReadOnly: 只读属性。为 true 时,该属性不允许修改,任何执行 JS 代码试图修改该属性值的行为都是无效的。
    • DontEnum:不能枚举。为 true 时,该属性不会出现在 for-in 枚举中。
    • DontDelete:不能删除。为 true 时,该属性不允许删除,尝试删除属性的操作将会被忽略。
    • Internal: 内部属性,在 JS 程序中无法访问,用来实现 JS 语法的内部逻辑。

    内部属性

    image
    • [[Prototype]]:指向当前对象的原型
    • [[Class]]:当前对象的类型,调用Object.prototype.toString 方法,返回的就是内部属性 [[Class]] 的值
    • [[Value]]:对象的值
    • [[Get]]:当读取属性值时,内部调用的就是该方法,获取指定属性的值。会遍历原型链查找
    • [[Put]]:当设置属性值时,内部调用的就是该方法,设置指定属性的值。首先判断 [[CanPut]] ,如果为 false,则不允许修改。否则执行修改操作,无指定属性时,执行创建属性并赋值操作。
    • [[CanPut]]:判断属性是否可以进行 [[Put]] 操作。会判断 ReadOnly 特征属性的值。
    • [[HasProperty]]:判断对象是否存在指定属性。会遍历原型链查找
    • [[Delete]]:通过 delete 操作符删除对象指定属性,内部调用的就是该方法,删除操作执行前,会获取 DontDelete 特征属性的值,判断是否允许删除。
    • [[DefaultValue]]:获取对象的默认值方法,默认值为一个原始值。算法如下:
      String/Date 类型:会首先调用 toString 方法,判断是否返回原始值,如果不能返回,再调用 valueOf方法。如果都不能返回原始值,则抛出运行时错误。
      Number 与 其他 Object 类型:会首先调用 valueOf 方法,判断是否返回原始值,如果不能返回,再调用toString 方法。如果都不能返回原始值,则抛出运行时错误。
    • [[Construct]]:指向对象的构造器
    • [[Call]]:当调用函数时,内部执行的就是该方法。函数必须具有该内部属性。
    • [[HasInstance]]:判断当前对象是否存在指定实例
    • [[Scope]]:作用域链
    • [[Match]]:测试正则表达式是否匹配并返回MatchResult值

    相关文章

      网友评论

        本文标题:ECMAScript 之数据类型

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