javascript
【☆】javascript数据类型拾遗
一、Array對象
1.兩個數組能用< > == ===做比較嗎?
? 答:數組可以用> <進行矩陣比較,比如a=[1,2,3] b=[1,2,4],那么a<b,如果a的數值長度增加,比如a=[1,2,3,1],那么結果還是a<b。而如果數組的長短和數據項大小都相同,那么ab怎么比較都是false。
?????? 所以我們可以知道數組的比較規則:從索引0開始,只要二者比較出結果,即停止比較,返回比較結果。
2.兩個空數組相等嗎?[]==[]?
?答:不相等,等同于兩個空對象比較,有法比較嗎?所以false。
3.變態使用數組的方法:x=array.sort;【任意方法名】x();會產生什么效果?
答:只能是報錯。
4.變態數組[,,]的長度?現有成員數目?join('1')會顯示什么?
答:數組將,號的解析undefined,長度也是undefined,但是成員卻是兩個undefined,join('1')會顯示 1 。
5.給數組元素變態的加上一對[],比如[[[[1]]]],它和數值1是什么關系?
答:不論加多少[],都是換湯不換藥,1還是1,所以1==[[[[1]]]]
6.如何對字符數組進行降序排序?
答:sort方法中的function參數的返回值指定排序方式,如果返回的兩個參數差值是大于零的升序拍,等于0并排。小于零降序排。所以我們只需稍微修改sort的兩個參數的表現形式,變成function(a,b){return a.charCodeAt(0)-b.charCodeAt(0);}就可以了。
二、Number類型
1.var x=1,x.toString()和1.toString()有什么區別?
答:前者輸出1,后者錯誤,因為數值沒有toString()方法。
2.如果非想用一個數值調用toString方法怎么辦?
答:用1..toString();
3.問題2多點幾個點行不?
答:就只能倆點,多了不行!
4.parseInt('011')會得到什么?
答:在ECMAScript3瀏覽器下(IE8以下老版本)會輸出9,因為parseInt遇見0或0x會把字符串當成八、十六進制解析,而ECMAScript5卻不支持8進制,直接輸出11,但是還沒有放棄16進制。
三、RegExp對象
1.正則對象有哪三種有用的方法?
答:reg.test(string):檢測目標字符串是否含有正則表達式的內容,如果有則返回true,否則false。
???? reg.exec(string):檢測目標字符串是否含有正則表達式匹配的內容,如果有則返回匹配到的字符串,沒有返回"".
???? reg.complie(regExp):將reg的正則表達式改變為regExp。返回值是替換后的正則表達式。
2.正則表達式的test(null) 和 test(),二者匹配的項是什么?
答:test:返回值為布爾,如果匹配成功返回true。exec:返回匹配成功的字符串。complie:返回值為正則表達式,用途是更換當前正則對象的匹配內容。
??? 正則表達式的test 方法會把 null看成字符串"null",而空則被看成"undefined". 相似的方法是:exec 。但是complie方法比較特殊,對于null和其他方法處理一致,但是當為undefined時,就變成了 /(?:)/,很奇特。
四、Function對象
1.你不知道的function對象的默認屬性。
答:有一個name屬性是函數對象特有的,值就是函數名,如果是匿名函數,這個值就是"",而如果該函數對象時通過new Function()出來的,默認值是"anonymous"--匿名的
2.當我eval一個函數名的時候會發生什么?
答:會將該函數的函數體整出來,但是該函數不會執行。typeof這個eval會告訴你這是一個 function;如果eval的是一個匿名函數名,即eval(),那么會返回undefined。
3.如果我給函數的name屬性賦值,結果會是怎樣?
答:name屬性是只讀的,不能賦值!
4.function定義函數和new Function生成函數對象有什么區別?
答:其實二者在實現功能方面沒什么區別,區別在于閉包上。function聲明函數如果在一個函數體內,則會形成閉包,而new Function則不會形成閉包。
5.如果我的函數名和變量名重復了,怎么辦?
答:這得分情況。
???? 如果我的變量聲明了但是沒有賦值,那么以函數名為準。不管誰先聲明。
???? 如果我的變量聲明了也賦了具體的值,那么以變量為準,不管誰先聲明。
五、Object類型
1.ECMAScript5新增特性Object.getPrototypeOf([object]) 會返回什么?
答:其實就是得到該參數的__proto__這個指針所指向的內容。
????? 可以知道如下等式:[object].__proto__=[object].constructor.prototype=Object.getPrototypeOf([object])
???????????????????????????????[object].constructor=[object].constructor.prototype.constructor
2.一個function的constructor.prototype和一個變量的constructor.prototype是什么?
答:前者是一個空函數
???? 后者根據不同的數據類型會有不同。
??? 自定義對象:[object object]
??? RegExp對象://
????Number對象:0
??? Array和String:空
??? null和undefined:報錯
3.如何對對象進行深度克隆?(不是有cloneNode方法么為什么還要?cloneNode是克隆節點的呀笨蛋!)
答:思路是這樣的,a.先找到待克隆對象的constructor指向,這樣就找到了創建該對象的父類。
???????????????????????? b.有了父類對于普通對象來說New就可以了。可是如果待克隆對象是Date?Array String Number的話,我們得不到它的默認值,所以針對這三類我們還要在構造時把待克隆對象的valueOf()傳進去。 而另一種對象json就更為復雜,即時new constructor也不能滿足深度克隆,需要使用ECMAScript5定義的下列方法:s = JSON.stringify(obj), //系列化對象 newobj = JSON.parse(s); //反系列化(還原)
???????????????????????? c.做好了這些一個支持IE8以上及其他新版本瀏覽器的對象深度克隆就可以了。
?
function cloneObject(obj) {if (!obj.valueOf()) {var cstr = new obj.constructor();}else if(window.JSON) {var s = JSON.stringify(obj);var cstr = JSON.parse(s);for (var item in obj) {cstr[item] = obj[item];}} else {cstr = new obj.constructor(obj.valueOf());}return cstr;}?4.如何實現ECMAScript5的Object的create方法?
?答:Object.create有兩個參數,第一個是某類的原型。第二個是屬性,可選。方法返回一個對象。因此我們可以通過下面的代碼實現這一方法:
Object.prototype.create=function(objProto,jsonpro){function XClass(){}XClass=objProto.constructor;var obj=new XClass();if(jsonpro) {for(var item in jsonpro){obj[item]=jsonpro[item];}}return obj; }?5.obj.prototype.sayname=function(){}和obj.prototype={sayname:function(){}}有什么區別嗎?
答:前者的原型constructor指向obj,而后者原型的constructor則指向了Object。
6.ECMAScript5下一個對象如何防篡改?有哪些級別?
答:使用Object.preventExtensions(obj)這種方法。對象被防篡改后就不會再被隨意增加屬性,但可以修改刪除屬性。
?????使用Object.seal(obj)方法,對象被防篡改之后就不可以刪除屬性,但是可以更改。
???? 使用Object.freeze(obj)方法,對象不可以刪除不可以修改。
7.遇到如下這種變態的操作,會得出什么結果呢?
function foo(){// => 執行順序3:foo.abc => alert(1)foo.abc = function () { alert(1);};// => 執行順序4:obj.abc => alert(2)
this.abc = function () {alert(2);};// => 執行順序5:window.abc => alert(3)
abc = function () {alert(3);};// => 執行順序6:局部變量 var abc = alert(4)
var abc = function () {alert(4);}; }// => 執行順序1:obj.abc => alert(5)
foo.prototype.abc = function () {alert(5);};// => 執行順序2:foo.abc => alert(6)被foo對象實例化過程中產生的abc覆蓋
foo.abc = function () {alert(6);};var obj = new foo();obj.abc(); foo.abc();
這個問題涉及到的知識點:
?使用方法優先在對象自身上找,如果沒有就在原型鏈上找,如果自身和原型鏈有沖突,使用自身的方法。
?最后編譯的函數會覆蓋前面定義的函數
obj 是 foo 構造函數的實例對象,在調用 abc 方法時會優先查找實例方法,如果找不到 abc 實例方法,就會去原型鏈上繼續搜索是否存在名為 abc 的方法,直到原型鏈的頂端。本例中存在實例方法,所以返回值為 2.
foo.abc() 為什么不是 6 呢?因為在實例化 foo 構造函數時,其函數中的 foo.abc 聲明覆蓋了后面的聲明,所以返回值是 1
8.給call方法傳入null或undefined會有什么結果?
答:會把this對象變為window。
?六、String對象
1.字符串中出現轉義字符'\'怎么辦?
答:看轉義后的內容是什么,如果只是\n啥的長度會比眼見的縮減1.
2.類似這種var str = '\u104A0';這個str的長度是多少?
答:是2,不要忽視轉義字符啊,一般情況下,有'\'出現,字符串的長度就比眼看到的要小。題目輸出的結果是這樣的:?0,這個方塊就是\u104a
3.有什么最簡單的將 純數字型 字符串轉為數字的方法么?
答:javascript中如果想要把字符串轉變為數字,最好的方法還是用parseInt吧。不過最簡單的方法就是 比如var s="12" ; +s就是12這個數字。如果s中含有非數字字符,那么得到的就是NaN。
X.其他
1.亂使用關鍵字的后果:a={class:'一班',name:'jack'}; a.class是什么?
答:根據瀏覽器的不同,效果也不同,在FF下(其他瀏覽器好像和FF一致),會輸出一班,而在IE8會報錯。
2.對undefined賦值會有什么效果?對undefined typeof將獲得什么?
答:對undefined賦值聽起來很瘋狂,可是在IE8下偏偏就成功了。undefined的typeof是undefined.
3.如果另a為window,那么a.a==a返回什么?
答,這不就是一個循環么,window的window屬性不還是為window么。所以返回true。?
5.如果遇到如下情況,得到的結果是什么?
if (!("a" in window)) {var a = 1; } alert(a);答:輸出undefined,因為javascript引擎在初始化的時候,會把變量聲明(而不是賦值)在其所在的作用域提前置頂。
6.如果給一個已賦值變量賦值為一個無返回值的函數執行體,那這個值變為什么?
答:變為undefined,這是自動返回的。
轉載于:https://www.cnblogs.com/JhoneLee/p/3543578.html
總結
以上是生活随笔為你收集整理的【☆】javascript数据类型拾遗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XML和JSON两种数据交换格式的比较
- 下一篇: gradle idea java ssm