这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 JavaScript 中的原始值和复杂值 的相关资料, 需要的朋友可以参考下
前面的话
javascript 的数据类型可以分为两种:原始类型和引用类型。原始类型也称为基本类型或简单类型,javascript 基本数据类型包括 Undefined、Null、Boolean、Number 和 String 五种,而引用类型也称为复杂类型,在 Javascript 中是 Object。与此相对应,它们的值也分别被称为原始值和复杂值
特性
原始值 (primitive value)
简单的说:原始值是固定而简单的值, 是存放在栈 (stack) 中的简单数据段, 也就是说, 它们的值直接存储在变量访问的位置.
原始值是表示 Javascript 中可用的数据或信息的最底层形式或最简单形式。原始类型的值被称为原始值,是因为它们是不可细化的。也就是说,数字是数字,字符是字符,布尔值则是 true 或 false,null 和 undefined 就是 null 和 undefined。这些值本身很简单,不能表示由其他值组成的值
有哪些类型是原始类型呢?
原始类型 (primitive type) 有以下五种类型: Undefined,Null,Boolean,Number,String
我们可以使用 typeof 来判断一个是否在某个类型的范围内.
typeof 运算符
对变量或值使用 typeof 运算符将会返回下列值之一:
注意:
1. 返回值为字符串类型.
2. 和原始类型比, 还差了个 null, 这个比较特殊, 使用 typeof(null), 返回的是 "object", 我们将 null 理解成是 object 的占位符.
复杂值
复杂值可以由很多不同类型的 javascript 对象组成。复杂对象其在内存中的大小是未知的,因为复杂对象可以包含任何值,而不是一个特定的已知值
存储方式
栈存储
因为原始值占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈 (stack) 中
堆存储
由于复杂值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此其存储在堆 (heap) 中,存储在变量处的值是一个指针,指向存储对象的内存处
访问方式
按值访问
原始值是作为不可细化的值进行存储和操作的,引用它们会转移其值
- var myString = 'foo';
- var myStringCopy = myString;
- var myString = null;
- console.log(myString, myStringCopy); //null,'foo'
引用访问
复杂值是通过引用进行存储和操作的,而不是实际的值。创建一个包含复杂对象的变量时,其值是内存中的一个引用地址。引用一个复杂对象时,使用它的名称 (即变量或对象属性) 通过内存中的引用地址获取该对象值
- var myObject = {};
- var copyOfMyObject = myObject; //没有复制值,而是复制了引用
- myObject.foo = 'bar'; //操作myObject中的值
- //现在如果输出myObject和copyOfMyObject,则都会输出foo属性,因为它们引用的是同一个对象
- console.log(myObject, copyOfMyObject); //Object{foo="bar"}
比较方式
原始值采用值比较,而复杂值采用引用比较。复杂值只有在引用相同的对象 (即有相同的地址) 时才相等。即使是包含相同对象的两个变量也彼此不相等,因为它们并不指向同一个对象
- var price1 = 10;
- var price2 = 10;
- var price3 = new Number('10');
- var price4 = price3;
- console.log(price1 == price2); //true
- console.log(price1 == price3); //false
- price4 = 10;
- console.log(price4 == price3); //true
- console.log(price4 === price3); //false
- var objectFoo = {
- same: 'same'
- };
- var objectBar = {
- same: 'same'
- };
- console.log(objectFoo == objectBar); //false
- var objectA = {
- foo: 'bar'
- };
- var objectB = objectA;
- console.log(objectA == objectB); //true
动态属性
对于复杂值,可以为其添加属性和方法,也可以改变和删除其属性和方法;但简单值不可以添加属性和方法
复杂值支持动态对象属性,因为我们可以定义对象,然后创建引用,再更新对象,并且所有指向该对象的变量都会获得更新。一个新变量指向现有的复杂对象,并没有复制该对象。这就是复杂值有时被称为引用值的原因。复杂值可以根据需求有任意多个引用,即使对象改变,它们也总是指向同一个对象
- var str = 'test';
- str.property = true;
- console.log(str.property); //undefined
- var objA = {
- property: 'value'
- };
- var pointer1 = objA;
- var pointer2 = pointer1;
- objA.property = null;
- console.log(objA.property, pointer1.property, pointer2.property); //null null null
包装类型
原始值被当作构造函数创建的一个对象来使用时,Javascript 会将其转换成一个对象,以便可以使用对象的特性和方法,而后抛弃对象性质,并将它变回到原始值
来源: http://www.phperz.com/article/17/0409/267697.html