对象类型
对象
全局对象(global object)
当JavaScript解释器启动时(或web加载新页面的时候)会创建一个新的全局对象,并给一组初始属性
- 全局属性,比如undefined,Infinity和NaN
- 全局函数,比如isNaN(),parseInt()和eval()
- 构造函数,比如Date(),RegExp(),String(),Object()和Array()
- 全局对象,比如Math和JSON
在代码的顶级,可以使用JavaScript关键字this来引用全局对象
var global = this; //定义一个引用全局对象的全局变量
而在客户端JavaScript中,在其表示的浏览器窗口中的所以JavaScript代码中,Window对象充当了全局对象,这个全局Window对象中有一个window属性来引用自身,可以用来替代this来引用全局对象
包装对象
存取字符串、数字或布尔值的属性时创建的临时对象称作包装对象
JavaScript中对象是由键值对组成,通过.来引用属性或方法.
但字符串和数字为什么也能调用方法和属性呢?
因为只有调用了字符串,它就会通过调用new String()来新建一个对象,这个对象继承了字符串的方法,并用来处理属性的引用,一旦引用结束,这个对象就会被销毁
var s = 'test';
s.len = 4;
var t =s.len;
var a = new String(s);//创建显示包装对象
a==s;//true 因为值相同
a===s;//false 因为类型不同
此时输出t,结果会为undefined,因为在s引用时创建新的对象,并添加属性len,但当引用结束,该对象销毁,就无法获取这个s.len
同理,数字和布尔值也有各自的方法:通过Number()和Boolean()构造函数创建对象,这些方法的调用都是来自这个临时对象,而null和undefined没有包装对象
不可变的原始值和可变的对象引用
JavaScript中的原始值(数字,字符串,布尔值,null和undefined)与对象(对象,数组,函数)有根本区别,原始值是不可改变的,没有任何方法可以对原始值进行修改.
原始值之间的比较只有在它们的值相等时才相等,比如字符串的每一项索引和长度都相等
对象是可变的--它们的值是可以修改的:
var o = {x:1};
o.x = 2;
o.y = 1;
而对象的比较并非值的比较,即使两个对象包含一样的属性一样的值,它们也不是相当的.同理,数组也一样
所以,只有当它们引用同一个基对象时,它们才会相等
var a = [];
var b = a ;//只是赋值的引用,并没有复制一次
a[0]=1;
b[0]//1
a===b//true
类型转换
null == undefined
'0' == 0 // 转换成数字
0 == false //布尔值转换成数字
'0' == false //字符串和布尔值都转换成数字
以上结果全为true
ps:虽然undefined在希望是布尔值的时候会转换成false,但不代表undefined == false ,if语句可以将undefined转换成false,但==从不试图将操作数转换成布尔值
显式类型转换
以上都是隐式类型转换,而显式类型转换最简单的方法就是用Boolean(),String(),Number(),Object()
Number("3") // 3
String(false) //'false'
Boolean([]) //true
Object(3) //new Number(3)
除了null或undefined,之外的任何值都有tostring()方法,这个方法的结果和String()方法返回结果一致,如果将null或undefined转换成对象会抛出类型错误,但Object()不会抛出异常,它只会返回一个空对象
在数字转换成字符串的方法中,Number类定义了三种方法:
-
toFixed(): 指定小数点的位数将数字转换成字符串
-
toExpotential(): 使用指数计数法将数组转换成指数形式的字符串
-
toPrecision:指定有效数字转成字符串
var n = 123456.789
n.toFixed(0) = "123457"
n.toFixed(2) = "123456.79"
n.toExpotential(1) = "1.2e+5"
n.toPrecision(4) = "1.235e+5"
n.toPrecision(7) = "123456.8"
字符串转换成数字:parseInt()和parseFloat()将内容转换成数字
而对象转成原始值则非常简单,因为所有的对象都转成true,包装对象也是如此,new Boolean(false)转成true,
对象转成字符串使用toString()方法就行,但toString()在不同的对象中有不同的作用
({x:2,y:2}).toString() = "[object object]"
[1,2,3].toString() = "1,2,3"
(function(x){f(x);}).toString() = "function(x){
f(x);
}"
/d+/g.toString() = "/\d+/g"
new Date(2010,0,1).toString() = "Fri Jan 01 2010 00:00:00 GMT-0800(PST)"
还有一种是valueOf(),这个函数会将对象,如果能返回一个原始值就返回原始值,不能就返回对象本身