美文网首页
JS(1)数据类型

JS(1)数据类型

作者: G莫_小语 | 来源:发表于2019-04-06 15:06 被阅读0次
    一、在“JavaScript”规范中,共定义了七种数据类型,分为“基本类型”和“引用类型”两大类
    • 基本类型(六种):字符串(String)、数字(Number)、布尔(Boolean)、唯一(Symbol)、(未定义)Undefined、空(Null)。
    • 引用类型(一种):对象(Object),对象又包含了Object、Function、Array、Date、RegExp等
    二、基本包装类型(String、Number、Boolean)
    • 引用类型有方法和属性,但是基本类型是没有的,为了方便操作,给每一个包装类型提供了一个对应的包装对象
        var str = 'hello';        //  string 基本类型,本身不具备方法和属性
        var s1 = str.charAt(0);   //  在执行到这一句的时候 后台会自动完成以下动作
    
        // 1. 找到对应的包装对象,通过包装对象创建一个值相同的实例
        // var str = new String('hello');
        // 2. 调用这个实例的方法(通过原型继承调用包装对象的方法)
        // var s2 = str.chaAt(0);
        // 3. 销毁这个实例
        // str = null;
    
        console.log(s1);  // h
        console.log(str); // 还是hello不是null,注意这是一瞬间的动作,实际上我们没有改变字符串本身的值。就是做了下面的动作.这也是为什么每个字符串具有的方法并没有改变字符串本身的原因。
    
    • 引用类型与基本包装类型的区别
      它们的对象生命周期不同:
      引用类型:使用new创建引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。
      基本包装类型:自动创建基本包装类型的对象,只执行一行代码的瞬间之后就会立即销毁。
      这意味着在运行时为基本包装类型值添加属性和方法是无效的,只有在包装对象的原型上添加。
        var str = 'hello';
        
        str.name = 'jack';  // 添加之后马上销毁了,无效
        console.log(str.name);   // undefined
    
        String.prototype.age = 24;  // 在原型上添加
        console.log(str.age);   // 24
    
    三、数据类型检测
    
        let s1 = 1;
        let s2 = '';
        let s3 = true;
        let s4 = undefined;
        let s5 = Symbol();
        let s6 = function test() { };
        let s7 = null;
        let s8 = [];
        let s9 = {};
        let s10 = new Date();
        let s11 = new RegExp();
    
        // 使用 typeof 运算符只能检测出七种
        console.log(typeof s1); // number
        console.log(typeof s2); // string
        console.log(typeof s3); // boolean
        console.log(typeof s4); // undefined
        console.log(typeof s5); // symbol
        console.log(typeof s6); // function
        console.log(typeof s7); // object
        console.log(typeof s8); // object 
        console.log(typeof s9); // object
        console.log(typeof s10);  // object
        console.log(typeof s11);  // object
    
        console.log('----------------------');
    
        // 使用 Object.prototype.toString(),全部能检测出来
        // Object.prototype.toString 最终会返回形式如 [object,class] 的字符串,class 指代的是其检测出的数据类型,这个是我们判断数据类型的关键。
        // toString === window.toString === Object.prototype.toString
        let judgeType = val => toString.call(val).slice(8, -1).toLowerCase();
        console.log(judgeType(s1)); // number
        console.log(judgeType(s2)); // string
        console.log(judgeType(s3)); // boolean
        console.log(judgeType(s4)); // undefined
        console.log(judgeType(s5)); // symbol
        console.log(judgeType(s6)); // function
        console.log(judgeType(s7)); // null
        console.log(judgeType(s8)); // array
        console.log(judgeType(s9)); // object
        console.log(judgeType(s10));  // date
        console.log(judgeType(s11));  // regexp
    
        console.log(s3.toString()); // "true"  自己原型上的 toString 方法是转成字符串
    
    
    
    • 为什么非要调用对象上的 toString 方法(Object.prototype.toString.call())而不调用自己原型上的 toString(s3.toString() ) 方法呢?因为自己原型上的 toString 方法重写了对象的 toString 方法,自己原型上的 toString 方法用处不一样

    相关文章

      网友评论

          本文标题:JS(1)数据类型

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