全局對象 window
ECMAScript
規(guī)定全局對象叫做 global
,但是瀏覽器把 window
作為全局對象(瀏覽器先存在的)
window
就是一個哈希表掏缎,有很多屬性。
window
的屬性就是全局變量蒙谓。
這些全局變量分為兩種:
-
一種是
ECMAScript
規(guī)定的global.parseInt
global.parseFloat
global.Number
global.String
global.Boolean
global.Object
-
一種是瀏覽器自己加的屬性
window.alert
window.prompt
window.comfirm
window.console.log
window.console.dir
window.document
window.document.createElement
window.document.getElementById
-
document
瀏覽器私有文檔柜候,w3c制定DOM文檔。瀏覽器BOM
所有 API 都可以在 MDN 里找到詳細的資料汽摹。
全局函數(shù)
Number()
var n = new Number(1)
創(chuàng)建一個 Number 對象
與 new Number(1)
的區(qū)別是什么?
var a = 1
var c = new Number(1)
a == c
true
a === c
false
a.valueOf() === c.valueOf()
true
a.xxx = 2//操作之后會被垃圾回收
a.xxx//調(diào)取不到
undefined
var n = new Number(1)
//js在設(shè)計時苦锨,被要求語法與java相似逼泣,js之父覺得這樣太麻煩了。
//所以設(shè)計了這兩種方式舟舒。
c
里面有__proto__
才可以c.tostring()
拉庶。
為什么a
沒有,卻也可以秃励?
臨時轉(zhuǎn)化temp = new Number(n);temp.toString
String()
var s = new String('hello')
創(chuàng)建一個 String 對象
'hello'
與 new String('hello')
的區(qū)別是什么氏仗?
常用api
trim()
concat()
slice()
replace()
String as object
Boolean()
var b = new Boolean(true)
創(chuàng)建一個 Boolean 對象
true
與 new Boolean(true)
的區(qū)別是什么?
var b = new Boolean(false)
if (b) {
console.log('hi')
}
'hi'
Object()
var o1 = {}
var o2 = new Object()
o1 和 o2 沒區(qū)別夺鲜,但是o1 == o2為false皆尔。
公用的屬性藏在哪
所有對象都有 toString
和 valueOf
屬性,那么我們是否有必要給每個對象一個 toString
和 valueOf
呢币励?
明顯不需要慷蠕。
JS 的做法是把 toString
和 valueOf
放在一個對象里(暫且叫做公用屬性組成的對象)
然后讓每一個對象的 __proto__
存儲這個「公用屬性組成的對象」的地址。
object.prototype
是源頭食呻!
重要公式
var 對象 = new 函數(shù)()
對象.__proto__ === 對象的構(gòu)造函數(shù).prototype
__proto__和prototype的區(qū)別流炕。
__proto__是對象的澎现,prototype是函數(shù)的,在內(nèi)存圖中地址相同每辟,指向同一個結(jié)構(gòu)剑辫。
// 推論
var number = new Number()
number.__proto__ = Number.prototype
Number.__proto__ = Function.prototype // 因為 Number 是 Function 的實例
var object = new Object()
object.__proto__ = Object.prototype
Object.__proto__ = Function.prototype // 因為 Object 是 Function 的實例
var function = new Function()
function.__proto__ = Function.prototype
Function.__proto__ == Function.prototye // 因為 Function 是 Function 的實例!
//Object是函數(shù)
typeof(Object)
"function"
//prototype本身就是一個對象
typeof(Object.prototype)
"object"
函數(shù).prototype.__proto__ === Object.prototype
//function也是對象
Function.__proto__ == Function.prototype//true
Function.prototype.__proto__ == Object.prototype
Number.prototype.__proto__ == Object.prototype//true
Object.__proto__ == Function.prototype//true
Number.__proto__ == Function.prototype//true
Number.__proto__ == Object.__proto__//true
Function.__proto__.__proto__ == Object.prototype//true
Object.__proto__.__proto__ == Object.prototype//true
Object.prototype.__proto__ //null
Object.__proto__.__proto__.__proto__ //null
Function.__proto__.__proto__.__proto__//null
Number.__proto__.__proto__.__proto__//null