美文网首页
javaScript数据类型

javaScript数据类型

作者: Confucianmen大宇 | 来源:发表于2022-12-13 23:04 被阅读0次

    数据类型

    • 原始数据类型
      Number、String、Boolean、Undefined、Null
      Symbol和Biglnt是ES6新增类型:
      Symbol独一无二数据类型,解决全局变量冲突问题。
      Biglint任意精度格式的整型,安全操作大整数,即使超出Number安全范围
    • 引用数据类型
      Object、Array、Function、RegExp

    堆栈

    栈内存存放原始数据类型,堆内存存放应用数据内存。

    存储位置不同

    原始数据直接存储在栈stack中的简单数据段,空间小,大小固定,属于被频繁使用的数据。
    引用数据类型存储在堆heap中的对象,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值,会先在栈中检索地址,从堆中获得实体。

    数据结构

    栈,先进后出;
    堆,优先队列。

    操作系统

    栈由编译器分配释放。
    堆由开发者分配,开发者不释放,由垃圾回收机制回收。

    数据类型检测方法

    typeof

    console.log(typeof 2);               // number
    console.log(typeof true);            // boolean
    console.log(typeof 'str');           // string
    console.log(typeof []);              // object    
    console.log(typeof function(){});    // function
    console.log(typeof {});              // object
    console.log(typeof undefined);       // undefined
    console.log(typeof null);            // object
    

    instanceof

    运行机制:判断在其原型链中是否能找出该类型的原型;所以instanceof只能正确判断引用数据原型,不能判断基本数据原型。

    console.log(2 instanceof Number);                    // false
    console.log(true instanceof Boolean);                // false 
    console.log('str' instanceof String);                // false 
     
    console.log([] instanceof Array);                    // true
    console.log(function(){} instanceof Function);       // true
    console.log({} instanceof Object);                   // true
    

    constructor

    对象实例通过constructor访问构造函数,如果改变其原型,那么就不能拿来判断了

    console.log((2).constructor === Number); // true
    console.log((true).constructor === Boolean); // true
    console.log(('str').constructor === String); // true
    console.log(([]).constructor === Array); // true
    console.log((function() {}).constructor === Function); // true
    console.log(({}).constructor === Object); // true
    

    Object.prototype.toString.call()

    Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型

    var a = Object.prototype.toString;
    console.log(a.call(2));
    

    同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?
    这是因为toString是Object的原型方法,而Array、function等引用数据类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object上原型toString方法(返回对象的具体类型)。
    所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。

    判断数组的方法

    Object.portotype.toString.call

    Object.prototype.toString.call(obj).slice(8,-1) === 'Array';
    //取第八位到倒数第一位对比‘数组’
    

    ES6的Array.isArray()

    instanceof关键词

    通过Array.prototype.isPortotypeOF()

    null和underfined区别

    null代表空对象,常用于初始化,undefined代表未定义。
    双等号判断两者会返回true,三等号会返回false。
    typeof判断类型时,Null类型会返回“object”

    其他值到字符串的转换规则

    ● Null 和 Undefined 类型 ,null 转换为 "null",undefined 转换为 "undefined",
    ● Boolean 类型,true 转换为 "true",false 转换为 "false"。
    ● Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
    ● Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
    ● 对普通对象来说,除非自行定义 toString() 方法,否则会调用 toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。

    其他值转到布尔值

    以下这些是假值:
    • undefined
    • null
    • false
    • +0、-0 和 NaN
    • ""
    假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。

    相关文章

      网友评论

          本文标题:javaScript数据类型

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