JS 值类型和引用类型

值类型与引用类型

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()方法构造出的对象是引用型
posted @ 2019-05-02 15:41  汪汪汪~~  阅读(841)  评论(0编辑  收藏  举报