記錄第一次面試——廣州凡科(三)
第三題:熱身的js題
到了js部分就要格外注意表達(dá)問(wèn)題了。畢竟對(duì)面的面試官聽(tīng)不懂你的表達(dá)鳞陨,基本就讓面試的氣氛十分尷尬昨寞。涼了一半
所以記住一些表達(dá)句子很有必要。
1.typeof
2.instanceof
3.constructor
4.Object.prototype.toString()
首先回顧:js的數(shù)據(jù)類型
基本分為基本類型和引用類型
基本類型:布爾厦滤、Number援岩、String、Undefined掏导、Null享怀、Symbol
引用類型:Object、Array趟咆、Data添瓷、RegExp、Function值纱、基本包裝類型(Boolean鳞贷、Number、String)單體內(nèi)置對(duì)象(Global虐唠、Math)
-
typeof
用法&例子:(真是不想說(shuō)筆試的時(shí)候忘記怎么用typeof了)
返回?cái)?shù)據(jù)類型的字符串形式
1 typeof ""; //"string"
2 typeof 1; //"number"
3 typeof false; //"boolean"
4 typeof undefined; //"undefined"
5 typeof function(){}; //"function"
6 typeof {}; //"object"
7 typeof Symbol(); //"symbol"
8 typeof null; //"object"
9 typeof []; //"object"
10 typeof new Date(); //"object"
11 typeof new RegExp(); //"object"
12 typeof new Number(33) //"object"
13 typeof Null //"undefined"
總結(jié):
1.可以對(duì)基本類型做出準(zhǔn)確的判斷(除了null)可以返回的數(shù)據(jù)類型有:Number悄晃、String、Undefined、Symbol妈橄、Object、Function
2.從第8條看出翁脆,null返回的是“object”眷蚓,因?yàn)閚ull被認(rèn)為是一個(gè)空的對(duì)象引用,而Null或者N返回的是“undefined”反番,就是找不到數(shù)據(jù)類型嘛
3.對(duì)于引用類型沙热,typeof返回的是object,因?yàn)樗袑?duì)象的原型鏈最終指向Object罢缸,Object是所有對(duì)象的祖宗
4.從第12條看出篙贸,使用new 字符初始化的對(duì)象,typeof都是返回object
5.從第13條看出枫疆,對(duì)于未聲明變量Null爵川,typeof會(huì)返回“undefined”
6.最后一點(diǎn)則是我迷惑了很久的大小寫的問(wèn)題。
我們寫出有什么數(shù)據(jù)類型是大寫的息楔,但是typeof返回的是小寫的字符串形式寝贡。所以typeof 1===Number是返回false的。但是當(dāng)我們使用instanceof 時(shí)值依,
var a= new Number(22);
a instanceof Number // true
a instanceof number // 報(bào)錯(cuò)!number is not defined
-
instanceof
instanceof判斷A是否是B的實(shí)例圃泡,表達(dá)式為:A instanceof B,如果是返回true愿险,否則返回false颇蜡。在原型鏈上的原型都可以返回true的
比如:
[] instanceof Array; // true
[] instanceof Object; // true
所以instanceof只能判斷兩個(gè)對(duì)象是否屬于實(shí)例關(guān)系,不能具體判斷一個(gè)對(duì)象實(shí)例屬于哪種類型
undefined辆亏、null用instanceof 會(huì)報(bào)錯(cuò)
-
constructor
當(dāng)一個(gè)函數(shù) F被定義時(shí)风秤,JS引擎會(huì)為F添加 prototype 原型,然后再在 prototype上添加一個(gè) constructor 屬性褒链,并讓其指向自身唁情。
function F(){}
F.prototype
constructor: ? F()
__proto__: Object
當(dāng)執(zhí)行 var f = new F() 時(shí),F(xiàn) 被當(dāng)成了構(gòu)造函數(shù)甫匹,f 是F的實(shí)例對(duì)象甸鸟,此時(shí)原型上的 constructor 就被遺傳到了新創(chuàng)建的對(duì)象上,因此 f.constructor == F
var f=new F()
f.constructor===F // true
注意:
1.null和undefined是無(wú)效的對(duì)象兵迅,因此不會(huì)有constructor存在抢韭,這兩種類型數(shù)據(jù)需要通過(guò)其他方式判斷。
2.函數(shù)的 constructor 是不穩(wěn)定的恍箭,這個(gè)主要體現(xiàn)在自定義對(duì)象上刻恭,當(dāng)開發(fā)者重寫 prototype 后,原有的 constructor 引用會(huì)丟失,constructor 會(huì)默認(rèn)為 Object
F.prototype={a:"XXXX"}
var ff=new F()
ff.constructor===F // false
ff.constructor // ? Object() { [native code] }
*為什么變成了 Object鳍贾?
因?yàn)?prototype 被重新賦值的是一個(gè) { }鞍匾, { } 是 new Object() 的字面量,因此 new Object() 會(huì)將 Object 原型上的 constructor 傳遞給 { }骑科,也就是 Object 本身橡淑。
因此重寫原型一般需要給constructor重新賦值ff.constructor=F
-
Object.prototype.toString()
toString()是Object的原型方法,調(diào)用該方法咆爽,默認(rèn)返回當(dāng)前對(duì)象的[[Class]]梁棠。這是一個(gè)內(nèi)部屬性,其格式為[object Xxx],其中Xxx就是對(duì)象的類型斗埂。
Object.prototype.toString.call("a")
"[object String]"
Object.prototype.toString.call(undefined)
"[object Undefined]"
Object.prototype.toString.call(null)
"[object Null]"
Object.prototype.toString.call(new Date())
"[object Date]"