基本数据类型:String Number Boolean Null Undefined
引用数据类型:Object
在 JS 中为我们提供了三个包装类,通过这三个包装类可以将基本数据类型的数据转换为 对象
- String()
- 可以将基本数据类型字符串转换为 String对象
- Number()
- 可以将基本数据类型数字转换为 Number对象
- 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
> 但是注意:我们在实际应用中不会使用基本数据类型的对象,如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果
**对象转换为布尔值都是 true **~~(只是提一下)~~
```javascript
var boo = new Boolean(true);
console.log(typeof boo);
console.log(boo == true); // true
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);
var num = 10;
- 创建出一个和基本类型相同的对象
var num = new Number(10);
var num = num.toString();
- 调用 Number对象的 toString()方法,并返回结果给 num 变量
- num = null;
- 之后这个临时创建的对象就被销毁了
给基本类型添加属性和方法
num.name = "你好";
- 将 num 转换为和其类型相同的对象,在对象中添加 name 属性,添加完后就销毁对象
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
写了跟没写一样!