基本数据类型:String Number Boolean Null Undefined
    引用数据类型:Object

    在 JS 中为我们提供了三个包装类,通过这三个包装类可以将基本数据类型的数据转换为 对象

    1. String()
      • 可以将基本数据类型字符串转换为 String对象
    2. Number()
      • 可以将基本数据类型数字转换为 Number对象
    3. Boolean()
      • 可以将基本数据类型布尔转换为 Boolean()对象 ```javascript var num = new Number(2); console.log(typeof num); // number

    var str = new String(“hello”); console.log(typeof str); // string

    var boo = new Boolean(true); console.log(typeof boo); // boolean

    1. > 但是注意:我们在实际应用中不会使用基本数据类型的对象,如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果
    2. **对象转换为布尔值都是 true **~~(只是提一下)~~
    3. ```javascript
    4. var boo = new Boolean(true);
    5. console.log(typeof boo);
    6. console.log(boo == true); // true
    7. console.log(boo === true); // false

    方法和属性只能添加给对象,不能添加给基本数据类型
    当我们对一些基本数据类型的值去调用属性和方法时,
    浏览器会临时使用包装类将其转换为对象,然后在调用对象的属性和方法
    调用完以后,再将其转换为基本数据类型

    var num = 10;  // 将 num 包装为 Number  // 相当于    var num = new Number(10);
    var num = num.toString();  // 包装完后,调用 Number对象的 toString()方法,num 就相当于 Number,对象调用方法
    num.name = "你好";  // 先将 num 转换为对象,再将 name 属性添加到对象中,添加完后就销毁对象
    console.log(num.name);  // undefined  // 先将 num 转换为对象,查找对象的name属性
    console.log(typeof num);
    
    1. var num = 10;
    • 创建出一个和基本类型相同的对象 var num = new Number(10);
    1. var num = num.toString();
    • 调用 Number对象的 toString()方法,并返回结果给 num 变量
    1. num = null;
    • 之后这个临时创建的对象就被销毁了

    给基本类型添加属性和方法

    1. num.name = "你好";
    • 将 num 转换为和其类型相同的对象,在对象中添加 name 属性,添加完后就销毁对象
    1. console.log(num.name); // undefined
    • 由于 num 是基本数据类型不能添加属性和方法,所以先将其转换为和其类型相同的对象,再在对象中查找 name 属性,由于 num 对象没有 name 属性,所以返回 undefined,查找一个对象的属性,如果没有则返回undefined,而不会报错

    可能就有疑问了,你前面不是有一个 num.name 吗?这不是向对象中添加属性吗?为什么,第二行 输出num的name属性时,会返回 undefined呢?因为呀!第一行和第二行,根本就不是同一个对象(判断一个对象是否相等,判断的是对象的内存地址),每创建一个对象,就会在堆中开辟出一个新的内存空间,对象的属性和方法,就保存在所开辟的堆内存中,第一行创建了一个对象,第二行也创建了一个对象,它们所指向的内存地址不是相同的,第一行是在当前对象添加 name 属性,第二行是在当前对象中查找 name 属性,没有就返回 undefined,所以懂了吗?童鞋。

    那么!要在基本数据类型中添加属性和方法要怎么办呢?
    可以在基本包装类的原型上实现:

    var str = "hello";
    String.prototype.long = str.length;
    console.log(str.long);  // 5
    

    注意:这样因为你是给基本类型string的原型上添加的属性,所以任意一个字符串都可以访问到这个属性及此值。(所以不提倡这种做法)

    var str = "hello";
    String.prototype.long = str.length;
    var str2 = "world";
    console.log(str.long);  // 5
    console.log(str2.long);  // 5
    

    写了跟没写一样!