4JavaScript的对象

对象类型

对象

全局对象(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

类型转换

image-20200924181405247

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){\n f(x); \n}"
/\d+/g.toString() = "/\\d+/g"
new Date(2010,0,1).toString() = "Fri Jan 01 2010 00:00:00 GMT-0800(PST)"

还有一种是valueOf(),这个函数会将对象,如果能返回一个原始值就返回原始值,不能就返回对象本身

posted @ 2020-09-24 19:05  桑夏南风  阅读(68)  评论(0编辑  收藏  举报