您好,登錄后才能下訂單哦!
小編這次要給大家分享的是javascript有哪些易錯點(diǎn),文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
為什么 typeof null === 'object'
原理是這樣的,不同的對象在底層都表示為二進(jìn)制,在JavaScript中二進(jìn)制前三位都為0的話會被判斷為 object 類型, null 的二進(jìn)制表示是全0,自然前三位也是0,所以執(zhí)行 typeof 時會返回“ object ”。
如 myObject.a 的屬性訪問返回值可能是 undefined ,但是這個值有可能是屬性中存儲的 undefined ,也可能是因?yàn)閷傩圆淮嬖谒苑祷?undefined 。那么如何區(qū)分這兩種情況呢?
var myObject = { a:2 }; // 方案一 ("a" in myObject); // true ("b" in myObject); // false // 方案二 myObject.hasOwnProperty( "a" ); // true myObject.hasOwnProperty( "b" ); // false // 方案三 Object.prototype.hasOwnProperty.call(myObject, 'b')
參考如下代碼:
function Foo(name) { this.name = name; } Foo.prototype.myName = function() { console.log(this.name) } function Bar(name, label) { Foo.call(this, name); this.label = label; } // 方法1 Bar.prototype = Object.create(Foo.prototype) // 方法2 Bar.prototype = Foo.prototype; // 方法3 Bar.prototype = new Foo(); //Bar.prototype.constructor = Bar; Bar.prototype.sayName = function() { console.log(this.name) } var b = new Foo('fayin') b.sayName()
上例中,三種方法都可以使 Bar 繼承 Foo.prototype 上的方法,但它們之間又有微妙的差別:
Object.create(..) 會憑空創(chuàng)建一個“新”對象并把新對象內(nèi)部的 [[Prototype]] 關(guān)聯(lián)到你指定的對象(本例中是 Foo.prototype )。
Bar.prototype = Foo.prototype 并不會創(chuàng)建一個關(guān)聯(lián)到 Bar.prototype 的新對象,它只是讓 Bar.prototype 直接引用 Foo.prototype 對象。因此當(dāng)你執(zhí)行類似 Bar.prototype.myLabel = ... 的賦值語句時會直接修改 Foo.prototype 對象本身。
Bar.prototype = new Foo() 的確會創(chuàng)建一個關(guān)聯(lián)到 Bar.prototype 的新對象。但是它使用了 Foo(..)的“構(gòu)造函數(shù)調(diào)用”,如果函數(shù) Foo 有一些副作用(比如寫日志、修改狀態(tài)、注冊到其他對象、給 this 添加數(shù)據(jù)屬性,等等)的話,就會影響到 Bar() 的“后代”,后果不堪設(shè)想。
結(jié)論
因此,要創(chuàng)建一個合適的關(guān)聯(lián)對象,我們必須使用 Object.create(..) 而不是使用具有副作用的 Foo(..) 。這樣做唯一的缺點(diǎn)就是需要創(chuàng)建一個新對象然后把舊對象拋棄掉,不能直接修改已有的默認(rèn)對象。
看完這篇關(guān)于javascript有哪些易錯點(diǎn)的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。