JavaScript的对象

2018-05-14  本文已影响0人  庄海鑫

全局对象 window

ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)
window 就是一个哈希表,有很多属性。
window 的属性就是全局变量。

1(global):一种是ECMAScript标准规定的全局对象

2.(window):一种是浏览器自己的全局对象

每次浏览器打开的时候,就会生成一个全局对象。那么为什么要有全局对象呢?因为这样我们可以调用一些方法,所以要有一些内置的对象或方法。

下图为js所占的内存 image.png

全局函数

1.Number

问题:为什么有两种方式呢?

js之父Brendan Eich被公司要求写一门浏览器语言,但这言语要和Java差不多,所以他模仿Java写了var n=new Number(1);这样n就是一个对象,有自己的属性,但这样太麻烦,于是他又写了一种,var n=1;n是基本类型,但他用了一个方法,使得这样声明也可以使用Number对象的属性

var n=1;
n.toString();   //n使用toString时,本质是下面两行,实际上n没有属性的

var temp=new Number(n)  //先生成一个临时变量temp,并将n作为Number对象赋给temp
temp.toString()   //用temp来执行toString,执行之后temp就被抹杀了

image.png
当执行n.toString(),我们假设会先在Heap中生成一个对象temp,然后temp调用方法,得到字符串1,于是字符串1作为n.toString的结果,最后将临时对象抹杀
问题:下面第二行代码报错吗?
var a=1;
a.xxx=2; //  不报错
a.xxx   // undefined  

a.xxx为undefined,因为xxx方法是存在于temp中的,上一句temp执行完就被抹杀了,所以xxx也会被抹杀,所以执行第三局n.xxx的时候,又创建了一个临时对象地址为10,这时这个临时对象的xxx方法就没有值,所以为undefined


image.png

总结:基本类型n可以调用toString,...等方法是因为生成临时对象temp,temp调用方法后的返回值再传给n.toString

2.String

var s = new String('hello') 创建一个 String 对象
'hello' 与 new String('hello') 的区别是什么?看内存图

3.Boolean

var b = new Boolean(true) 创建一个 Boolean 对象
true 与 new Boolean(true) 的区别是什么?看内存图

4.Object

var o1 = {}
var o2 = new Object()
o1 和 o2 没区别

上一篇 下一篇

猜你喜欢

热点阅读