值类型与引用类型
1 ECMAScript 引用类型:引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象。从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
1.1 对象是由 new 运算符加上要实例化的对象的名字创建的。 var o = new Object();
1.2 Object 对象:CMAScript 中的所有对象都由这个对象继承而来,Object 对象中的所有属性和方法都会出现在其他对象中
1.2.1 constructor 对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。
1.2.2 Prototype 对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。
1.2.3 方法
a hasOwnProperty(property) 判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty("name"))
b IsPrototypeOf(object) 判断该对象是否为另一个对象的原型。
c PropertyIsEnumerable 判断给定的属性是否可以用 for...in 语句进行枚举。
d ToString() 返回对象的原始字符串表示。对于 Object 对象,ECMA-262 没有定义这个值,所以不同的 ECMAScript 实现具有不同的值。
e ValueOf() 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。
1.3 Boolean 对象:Boolean 对象是 Boolean 原始类型的引用类型。
1.3.1 要创建 Boolean 对象,只需要传递 Boolean 值作为参数:var oBooleanObject = new Boolean(true);Boolean 对象将覆盖 Object 对象的 ValueOf() 方法,返回原始值,即 true 和 false。ToString() 方法也会被覆盖,返回字符串 "true" 或 "false"。
var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true; //输出 true
在这段代码中,用 false 值创建 Boolean 对象。然后用这个值与原始值 true 进行 AND 操作。在 Boolean 运算中,false 和 true 进行 AND 操作的结果是 false。不过,在这行代码中,计算的是 oFalseObject,而不是它的值 false。正如前面讨论过的,在 Boolean 表达式中,所有对象都会被自动转换为 true,所以 oFalseObject 的值是 true。然后 true 再与 true 进行 AND 操作,结果为 true。
1.4 Number 对象:Number 对象是 Number 原始类型的引用类型
1.4.1 要创建 Number 对象,采用下列代码:var oNumberObject = new Number(68);
1.4.2 要得到数字对象的 Number 原始值,只需要使用 valueOf() 方法:var iNumber = oNumberObject.valueOf();
1.4.3 toFixed() 方法:返回的是具有指定位数小数的数字的字符串表示.var oNumberObject = new Number(68); console.log(oNumberObject.toFixed(2)); //68.00
1.4.4 toExponential() 方法:它返回的是用科学计数法表示的数字的字符串形式。 var oNumberObject = new Number(68); console.log(oNumberObject.toExponential(1)) //6.8e+1
1.4.5 toPrecision() 方法:根据最有意义的形式来返回数字的预定形式或指数形式。它有一个参数,即用于表示数的数字总数(不包括指数)
var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(1)); //输出 "7e+1"
var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(2)); //输出 "68
1.5 String 对象:String 对象是 String 原始类型的对象表示法 var oStringObject = new String("hello world");String 对象的所有属性和方法都可应用于 String 原始值上,因为它们是伪对象。
1.5.1 String 对象的 valueOf() 方法和 toString() 方法都会返回 String 类型的原始值:alert(oStringObject.valueOf() == oStringObject.toString()); //输出 "true"
1.5.2 length 属性:它是字符串中的字符个数var oStringObject = new String("hello world"); alert(oStringObject.length); //输出 "11"
1.5.2 charAt() 和 charCodeAt() 方法访问的是字符串中的单个字符。这两个方法都有一个参数,即要操作的字符的位置。
var oStringObject = new String("hello world");
alert(oStringObject.charAt(1)); //输出 "e"
alert(oStringObject.charCodeAt(1)); //输出 "101"
1.5.3 concat() 方法:用于把一个或多个字符串连接到 String 对象的原始值上。该方法返回的是 String 原始值,保持原始的 String 对象不变:
var oStringObject = new String("hello ");
var sResult = oStringObject.concat("world");
alert(sResult); //输出 "hello world"
alert(oStringObject); //输出 "hello "
1.5.4 indexOf() 和 lastIndexOf() 方法:返回的都是指定的子串在另一个字符串中的位置,如果没有找不到子串,则返回 -1。
var oStringObject = new String("hello world!");
alert(oStringObject.indexOf("o")); 输出 "4"
alert(oStringObject.lastIndexOf("o")); 输出 "7"
1.5.5 localeCompare() 方法:对字符串进行排序。该方法有一个参数 - 要进行比较的字符串,返回的是下列三个值之一:
a 如果 String 对象按照字母顺序排在参数中的字符串之前,返回负数。
b 如果 String 对象等于参数中的字符串,返回 0
c 如果 String 对象按照字母顺序排在参数中的字符串之后,返回正数。
注释:如果返回负数,那么最常见的是 -1,不过真正返回的是由实现决定的。如果返回正数,那么同样的,最常见的是 1,不过真正返回的是由实现决定的。
var oStringObject = new String("yellow");
alert(oStringObject.localeCompare("brick")); //输出 "1"
alert(oStringObject.localeCompare("yellow")); //输出 "0"
alert(oStringObject.localeCompare("zoo")); //输出 "-1"
1.5.6 slice() 和 substring():两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数。第一个参数是要获取的子串的起始位置,第二个参数(如果使用的话)是要获取子串终止前的位置(也就是说,获取终止位置处的字符不包括在返回的值内)。如果省略第二个参数,终止位就默认为字符串的长度。与 concat() 方法一样,slice() 和 substring() 方法都不改变 String 对象自身的值。它们只返回原始的 String 值,保持 String 对象不变。
var oStringObject = new String("hello world");
alert(oStringObject.slice("3")); //输出 "lo world"
alert(oStringObject.substring("3")); //输出 "lo world"
alert(oStringObject.slice("3", "7")); //输出 "lo w"
alert(oStringObject.substring("3", "7")); //输出 "lo w"
对于负数参数,slice() 方法会用字符串的长度加上参数,substring() 方法则将其作为 0 处理(也就是说将忽略它)
var oStringObject = new String("hello world");
alert(oStringObject.slice("-3")); //输出 "rld"
alert(oStringObject.substring("-3")); //输出 "hello world"
alert(oStringObject.slice("3, -4")); //输出 "lo w"
alert(oStringObject.substring("3, -4")); //输出 "hel"
1.5.7 toLowerCase()、toLocaleLowerCase()、toUpperCase() 和 toLocaleUpperCase():两种方法用于把字符串转换成全小写的,后两种方法用于把字符串转换成全大写的
var oStringObject = new String("Hello World");
alert(oStringObject.toLocaleUpperCase()); //输出 "HELLO WORLD"
alert(oStringObject.toUpperCase()); //输出 "HELLO WORLD"
alert(oStringObject.toLocaleLowerCase()); //输出 "hello world"
alert(oStringObject.toLowerCase()); //输出 "hello world"
1.6 instanceof 运算符:instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型
var oStringObject = new String("hello world");
alert(oStringObject instanceof String); //输出 "true"
2 值类型(基本类型):字符串(String)、数值(Number)、布尔值(Boolean)、Undefined、Null (这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值);引用类型:对象(Object)、数组(Array)、函数(Function)
2.1 区别:
值类型:
1、占用空间固定,保存在栈中(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;栈中存储的是基础变量以及一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。)
2、保存与复制的是值本身
3、使用typeof检测数据的类型
4、基本类型数据是值类型
引用类型:
1、占用空间不固定,保存在堆中(当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。)
2、保存与复制的是指向对象的一个指针
3、使用instanceof检测数据类型
4、使用new()方法构造出的对象是引用型