![5b68c278281efab38ae5382bf98b576e.png](https://img-blog.csdnimg.cn/img_convert/5b68c278281efab38ae5382bf98b576e.png)
全局对象
ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)
window 就是一个哈希表,有很多属性。
window 的属性就是全局变量。(所有window的属性前面都可以省略window,直接调用)
这些全局变量分为两种:
- 一种是 ECMAScript 规定的
- global.parseInt
- global.parseFloat
- global.Number
- global.String
- global.Boolean
- global.Object
2. 一种是浏览器自己加的属性
-
- window.alert
- window.prompt
- window.comfirm
- window.console.log
- window.console.dir
- window.document
- window.document.createElement
- window.document.getElementById
全局函数
- Number
var n = new Number(1) 创建一个 Number 对象
var n1 = 1 与var n2 = new Number(1) 的区别是什么?
![9067eacd0651fbbb9de929de9e08293b.png](https://img-blog.csdnimg.cn/img_convert/9067eacd0651fbbb9de929de9e08293b.png)
*n2包装成对象后里面有一些内嵌函数可以调用,n1就只是一个单独的数字。但是n1也可以调用这些方法,原因是给n1创建了一个临时变量,当这一个语句执行完该临时变量就被销毁。
var n = 1
n.xxx = 2 //不会报错
console.log(n.xxx) //undefined,因为上一句创建的临时变量已经被销毁,现在是另一个新的临时变量
2. String
var s = new String('hello') 创建一个 String 对象
'hello' 与 new String('hello') 的区别是什么?同上
常用api:
- str.trim() — 去掉空格
- str.charAt(’s’) — 返回’s'字符在该字符串中的位置
- str1.concat(str2) — 将两个字符串连接在一起
- str.slice(index1,index2) — 根据index截取字符串(包含index1,不包含index2)
- str.replace(’s’,'r’) — 将字符串中的’s’换成’r'
3. Boolean
var b = new Boolean(true) 创建一个 Boolean 对象
true 与 new Boolean(true) 的区别是什么?--同上
var b = new Boolean(false)
var b1 = false
if(b){console.log(’b’)}
if(b1){console.log(’b1’)}
//输出:b,因为b是一个对象,所有对象都返回true
4. Object
var o1 = {}
var o2 = new Object()
o1 和 o2 没区别
var o1 = {}
var o2 = new Object()
o1 === o2 //false,因为o1和o2地址不同
公用属性
所有对象都有 toString 和 valueOf 属性,不需要在每个对象里重复,为了节省内存,JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象),然后让每一个对象的 __proto__ 存储这个「公用属性组成的对象」的地址。
![50b8589fcbc6a021fae97d36b0294be1.png](https://img-blog.csdnimg.cn/img_convert/50b8589fcbc6a021fae97d36b0294be1.png)
但像Number这样的对象还有自己的一些共用属性(eg: toString(16)转成16进制),所以它的第一个 __proto__存的是Number独有的共用属性,然后有第二个 __proto__存的是所有对象的共用属性。
![656770d879411b7694c4be15aa750583.png](https://img-blog.csdnimg.cn/img_convert/656770d879411b7694c4be15aa750583.png)
String、Boolean也同理。
⚠️共用属性也就是原型(prototype)。
![dd475d84d512010b2605b4d6a070a07f.png](https://img-blog.csdnimg.cn/img_convert/dd475d84d512010b2605b4d6a070a07f.png)
![1095abdfcc0e98284813a4315826c489.png](https://img-blog.csdnimg.cn/img_convert/1095abdfcc0e98284813a4315826c489.png)
prototype和_proto__的区别:
prototype是在我们还没写代码时浏览器就准备好了的,是对共用属性的引用(为防止垃圾回收);
__proto__是我们写了代码创建了对象后产生的,也是对共用属性的引用(这个对象被销毁,不再引用共用属性,共用属性也不会被回收,因为prototype会一直指向共用属性)。
![f1574d36a4cb093a3eceb8040cb9e07c.png](https://img-blog.csdnimg.cn/img_convert/f1574d36a4cb093a3eceb8040cb9e07c.png)
重要公式
var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype
// 推论
var number = new Number()
number.__proto__ == Number.prototype
var object = new Object()
object.__proto__ == Object.prototype
var function = new Function()
function.__proto__ == Function.prototype
// 另外,所有函数都是由 Function 构造出来的,所以
Number.__proto__ == Function.prototype // 因为 Number 是函数,是 Function 的实例
Object.__proto__ == Function.prototype // 因为 Object 是函数,是 Function 的实例
Function.__proto__ == Function.prototye // 因为 Function 是函数,是 Function 的实例!