浅谈对象与基本数据类型包装类
一、对象-------在javaScript中,对象的创建方式有两种
1、var obj = {} //通过var关键字声明一个对象,即plainObject 也称作对象字面量/对象直接量
2、构造函数
2.1系统自带的构造函数 通过new关键字构造对象
-----var obj = new Object(); //此时obj就是Object构造函数创建的实例
2.2自定义构造函数
----function Person{}
----var obj = new Person(); //此时obj就是自定义构造函数Person创建的实例
#### 注意:因为构造函数与普通函数在形式上没有任何区别,所以构造函数严格使用【大驼峰命名规则】 【大驼峰命名规则】-----所有单词首字母大写; 【小驼峰命名规则】----第一个单词首字母小写,后续单词首字母大写
## 注意:访问一个未经声明的变量会报错,访问一个不存在的对象属性会返回undefined
二、利用new操作符的才叫构造函数,那么new操作符具体干了什么?
function Person ( name, age ) {
// 1、隐式创建 var this= { };
// 2、执行 this.xx = xx;
this.name = name;
this.age = age;
// 3、隐式返回该对象 return this ( 但凡使用new,不能返回原始值,只能返回对象)
}
上述只是比较浅显的解释,但很好帮助我们理解,但需要注意的是,上述过程都是隐式的,即系统默认帮我们完成的,那么有朋友就会有疑问了,如果在上述Person函数内部,显式(手动的)return 一个对象会怎么样呢?
答案就是:会以显式return的对象作为返回值。假如在Person函数中return一个空对象,那么,通过new关键字创建的实例对象都将是一个空对象。
另外,但凡使用new,不能返回原始值,只能返回对象。假如在上述person函数中显式return 123; 那么该构造函数返回的仍然是隐式返回的对象this
三、包装类
js定义了5种原始数据类型,分别是Number、String、Boolean、Undefined、Null
1、基本包装类型(原始值)(undefined、null没有包装类)
- Number() - 可以将基本数据类型字符串转换为Number对象
- String() - 可以将基本数据类型字符串转换为String对象
- Boolean() - 可以将基本数据类型字符串转换为Boolean对象
特性:原始值没有属性和方法,不能给原始值赋属性值,但是在访问原始值的属性和方法时,系统会默认调用上述三个基本包装类型,通过new关键字创建一个包装类实例,为该实例添加属性或方法。然而,在创建实例后又会delete该实例。 下面以例子加以说明:
可以看到,原始值num是没有属性和方法的,那么控制台输出的undefined是怎么来的呢?
首先:var num = 123声明了一个变量num并赋值数字123
其次:num.length = 3; 当执行num.length时,由于num为三种原始值中的Number类型,所以会创建一个实例对象:即new Number().length = 3; 但是随即会delete该实例对象。
最后:console.log(num.length) 在执行num.length时依然会重新调用 new Number()创建一个实例对象,但是每次调用构造函数产生的实例都是相互独立的,所以这个最后创建的实例对象上并没有length属性,因此打印结果为undefined
误区:
字符串是没有长度属性的,但我们使用的length属性,其实是系统通过new String()构造了一个字符串实例对象,然后将字符串的值赋值给length属性,最后返回这个值,并销毁该实例对象。
var str = 'abcd';
str.length;//当访问str.length属性时,相当于 new String("abcd").length; 返回结果为传入的字符串长度
随后 delete该构造函数创建的实例对象
最后用一道百度的笔试题加以说明,如题:
var str = "abc"
str+=1;
var test = typeof(str);
if(test.length ==6 ) {
test.sign = "typeof的返回结果可能是String";
}
console.log(test.sign);
---解答过程如下---
1、声明str变量并赋值为字符串abc
2、字符串连接“+”会将其他类型转换为字符串类型
3、typeof(str)返回值是字符串"String"
4、test是三种原始中的String类型,因此test.length访问length属性会执行:new String("String").length,该实例返回的length属性值为6,所以if表达式为true
5、同4,test.sign会创建一个新实例并添加属性并赋值:sign = ‘typeof的返回结果可能是String’然后delete该实例
6、test.sign同理又创建了一个实例对象,并访问该实例对象的sign属性,由于通过构造函数创建的实例相互独立,所以该实例对象上并没有sign属性,因此console(test.sign)结果为undefined