JS(1)数据类型

一、在“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)数据类型)