数据类型和值
1.计算机是通过操作值(value)来运行的,能过表示并操作的值得类型称为数据类型。
2.在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
1)原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
2)引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
3.为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域——栈中。这样存储便于迅速查寻变量的值。在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
4.引用数据类型(复合数据类型):对象(Object)。一个对象表示的是值的集合。这种集合有两种:一种是无序的,即定义的普通对象;另一种是有序的,即为数组。还有一种特殊的对象——函数(function)。除了数组和函数外,JavaScript还定义了一些专用的对象,他们不是新的数据类型,而是对象的新的类(class),例如:Date、RegExp、Error
5.typeof运算符。对变量或值调用 typeof 运算符将返回下列值之一:
1)undefined - 如果变量是 Undefined 类型的
2)boolean - 如果变量是 Boolean 类型的
3)number - 如果变量是 Number 类型的
4)string - 如果变量是 String 类型的
5)object - 如果变量是一种引用类型或 Null 类型的。为什么 typeof 运算符对于 null 值会返回 "Object"?这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
6.Number
1)ECMA-262 中定义的最特殊的类型是 Number 类型。这种类型既可以表示 32 位的整数,还可以表示 64 位的浮点数。
2)八进制:var iNum = 070;//070等于十进制的56
3)十六进制:var iNum = 0xAB;// 0xAB等于十进制的171
4)定义浮点数用1.0而不是1
5)支持科学计数法
6)特殊的Number项:
Infinity:无穷大的特殊值
NaN:特殊的非数字值
Number.MAX_VALUE:可表示的最大数字
Number.MIN_VALUE:可表示的最小数字(与0最接近的数字)
Number.POSITIVE_INFINITY:表示正无穷大的特殊值
Number. NEGATIVE_INFINITY:表示负无穷大的特殊值
7)因为NaN和NaN不相等,所以用isNaN()函数来判断
8)可以用isFinite()来检测一个数字是不是NaN或者无穷大
7.String
1)JavaScript的字符串和JavaScript的数组一样,都是以0开始索引的
2)都写JavaScript版本可是使用数组下标的形式将单个字符从一个字符串中提出,但是不能写入。(避免使用)
3)当字符串用于数字环境中时候其会自动转换,所以可以用:
var numberStr = “25”-0;进行转换。
8.Null用于表示尚未存在的对象。当null用于布尔环境,被转换为false;当用于数字环境,被转换为0;当用于字符串,被转换为“null”。
9.在使用了一个未声明的变量,或者使用了已声明但未赋值的变量,又或者使用了一个并不存在的对象属性时,返回值为undefined。虽然undefined与null不同,但是==运算符将两者看做相等。如果要区分两者,可以使用===或者typeof运算符。Unfinished用于布尔环境是,为false;用于数字时,为NaN;用于字符串时为“unfinished”。
10.函数
1)在许多语言中,函数只是语言的语法特性,它们可以被定义、被调用,但却不是数据类型,JavaScript中的函数是真正的数值。这就意味着,函数可以被存储在变量、数组和对象中,而且函数还可以作为参数传递给其他函数,也可以像其他类型的值一样赋给对象的属性。
2)函数直接量。函数直接量看起来就像个函数的定义,只不过没有函数名。例如:
var square = function(x) {return x * x;}
还有另外一种定义函数的方法,将参数列表和函数体用字符串的形式传给构造函数,例如:
var square = new Function(“x”,”return x*x;”);
11.Object
1)JavaScript中的对象可以作为关联数组来使用,如果采用这种方式使用对象,语法为:使用一个由方括号封闭起来的、包含所需属性名的字符串,例如:image[“width”]
2)对象的创建:var o = new Object();
3)对象直接量(对象初始化程序):用“{}”括起来的键值对的集合,键值对之间用“,”隔开,键与值之间用“:”隔开。例如:
var rect = { upper : { x : point.x , y : point.y},
“lower”: { x : 4,y: 2}}
说明:对象直接量可以嵌套;对象直接量中使用的对象值可以是任何JavaScript表达式;对象直接量中的属性名可以是字符串而不是标识符。
12.Error对象,预定义的错误对象的类型有Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError和URIError
13.基本数据类型的包装对象(String对象、Number对象和Boolean对象)和基本数据类型(字符串、数字和boolean类型)的瞬态转换。在基本类型瞬态转换为其包装对象时,JavaScript自动创建一个对象,使用完后丢弃。
14.当一个非空对象用在布尔环境中时,它都转换为true。例如:new Boolean(false),这个对象用在布尔环境中时,将转换为true
15.toString()方法把数组元素转换为字符串,然后返回这些字符串的连接结果。一个没有元素的数组就被转换为一个空字符串,空串在数字环境下会被转化为0。
16.valueOf方法的工作,把一个对象转换为一个合理的基本类型的值。
17.传值和传址
1)要理解任何的编程语言,都必须理解三种操作数据值的方法,在这种语言里是怎么实现的:
A.复制一个数据值(复制)
B.把一个数据值作为一个参数传递给一个函数或方法(传递)
C.把它和另一个值进行比较,看看两者是否相等(比较)
2)有两种截然不同的方式可以操作数据的值,即传值和传址。
3)JavaScript的基本规则是:基本数据类型通过传值来操作,引用数据类型通过传址来操作。
4)字符串是JavaScript中一种纠结的类型,我们推测,JavaScript字符串是通过传址来复制和传递的,但是是通过传值来比较的。