js的一些潛在規(guī)則使用分析
為什么開(kāi)發(fā)中建議使用void 0 來(lái)代替undefined
因?yàn)?JavaScript 的代碼 undefined 是一個(gè)變量,而并非是一個(gè)關(guān)鍵字,這是JavaScript 語(yǔ)言公認(rèn)的設(shè)計(jì)失誤之一,所以,我們?yōu)榱吮苊鉄o(wú)意中被篡改,我建議使用void 0 來(lái)獲取 undefined 值。
MDN上的解釋?zhuān)?undefined
is a property of the global object. That is, it is a variable in global scope. The initial value of undefined
is the primitive value undefined
。
為什么開(kāi)發(fā)中將未賦值的變量賦值為null,而不是undefined
null 表示的是:“定義了但是為空”。所以,在實(shí)際編程時(shí),我們一般不會(huì)把變量賦值為 undefined,這樣可以保證所有值為 undefined 的變量,都是從未賦值的自然狀態(tài)。
String類(lèi)型的長(zhǎng)度
因?yàn)?String 的意義并非“字符串”,而是字符串的 UTF16 編碼,我們字符串的操作charAt、charCodeAt、length 等方法針對(duì)的都是 UTF16 編碼。所以,字符串的最大長(zhǎng)度,實(shí)際上是受字符串的編碼長(zhǎng)度影響的。
JavaScript 中的字符串是永遠(yuǎn)無(wú)法變更的,一旦字符串構(gòu)造出來(lái),無(wú)法用任何方式改變字符串的內(nèi)容,所以字符串具有值類(lèi)型的特征。
JavaScript 字符串把每個(gè) UTF16 單元當(dāng)作一個(gè)字符來(lái)處理,所以處理非 BMP(超出U+0000 - U+FFFF 范圍)的字符時(shí),你應(yīng)該格外小心。
"\uD835\uDD46" // "??" "??".length // 2
為什么parseInt在將字符串轉(zhuǎn)為數(shù)字的時(shí)候,需要指定第二個(gè)參數(shù)
在不傳入第二個(gè)參數(shù)的情況下,parseInt 只支持 16 進(jìn)制前綴“0x”,而且會(huì)忽略非數(shù)字字符,也不支持科學(xué)計(jì)數(shù)法。
parseInt("0x1111") // 4369 parseInt(1e+40) // 1
在一些古老的瀏覽器環(huán)境中,parseInt 還支持 0 開(kāi)頭的數(shù)字作為 8 進(jìn)制前綴,這是很多錯(cuò)誤的來(lái)源。所以在任何環(huán)境下,都建議傳入 parseInt 的第二個(gè)參數(shù),而 parseFloat 則直接把原字符串作為十進(jìn)制來(lái)解析,它不會(huì)引入任何的其他進(jìn)制。
多數(shù)情況下,Number 是比 parseInt 和 parseFloat 更好的選擇。
對(duì)象轉(zhuǎn)基本數(shù)據(jù)類(lèi)型的規(guī)律
在 JavaScript 標(biāo)準(zhǔn)中,規(guī)定了 ToPrimitive 函數(shù),它是對(duì)象類(lèi)型到基本類(lèi)型的轉(zhuǎn)換(即,拆箱轉(zhuǎn)換)。
對(duì)象到 String 和 Number 的轉(zhuǎn)換都遵循先拆箱再轉(zhuǎn)換的規(guī)則。通過(guò)拆箱轉(zhuǎn)換,把對(duì)象變成基本類(lèi)型,再?gòu)幕绢?lèi)型轉(zhuǎn)換為對(duì)應(yīng)的 String 或者 Number。
拆箱轉(zhuǎn)換會(huì)嘗試調(diào)用 valueOf 和 toString 來(lái)獲得拆箱后的基本類(lèi)型。如果 valueOf 和toString 都不存在,或者沒(méi)有返回基本類(lèi)型,則會(huì)產(chǎn)生類(lèi)型錯(cuò)誤 TypeError。
在 ES6 之后,還允許對(duì)象通過(guò)顯式指定 @@toPrimitive Symbol
來(lái)覆蓋原有的行為。
Object.prototype[Symbol.toPrimitive] = function() {return '111'} const z = {name: 'zh0'} String(z) // "111"
JavaScript 中對(duì)象獨(dú)有的特色
對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)?JavaScript 賦予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。
為了提高抽象能力,JavaScript 的屬性被設(shè)計(jì)成比別的語(yǔ)言更加復(fù)雜的形式,它提供了數(shù)據(jù)屬性和訪(fǎng)問(wèn)器屬性(getter/setter)兩類(lèi)。
在 ES5 開(kāi)始,[[class]]
私有屬性被 Symbol.toStringTag
代替,Object.prototype.toString 的意義從命名上不再跟 class 相關(guān)。我們甚至可以自定義一個(gè)類(lèi)的class。
var o = { [Symbol.toStringTag]: "MyObject" } console.log(o + ""); // [object MyObject]
JavaScript對(duì)象分類(lèi)
宿主對(duì)象
宿主對(duì)象(host Objects):由 JavaScript 宿主環(huán)境提供的對(duì)象,它們的行為完全由宿主環(huán)境決定。宿主對(duì)象也分為固有的和用戶(hù)可創(chuàng)建的兩種。
例如我們可以通過(guò)dom操作創(chuàng)建一些對(duì)象。
js運(yùn)行時(shí),也會(huì)創(chuàng)建一些對(duì)象(window, 一些構(gòu)造方法等等)
內(nèi)置對(duì)象
內(nèi)置對(duì)象(Built-in Objects):由 JavaScript 語(yǔ)言提供的對(duì)象。
- 固有對(duì)象(Intrinsic Objects ):由標(biāo)準(zhǔn)規(guī)定,隨著 JavaScript 運(yùn)行時(shí)創(chuàng)建而自動(dòng)創(chuàng)建的對(duì)象實(shí)例。
固有對(duì)象在任何 JS 代碼執(zhí)行前就已經(jīng)被創(chuàng)建出來(lái)了,它們通常扮演著類(lèi)似基礎(chǔ)庫(kù)的角色。
三個(gè)值:Infinity、NaN、undefined。 九個(gè)函數(shù): eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent 一些構(gòu)造器:Array、Date、RegExp、Promise、Proxy、Map、WeakMap、Set、WeapSet、Function、Boolean、 String、Number、Symbol、Object、Error、EvalError、RangeError、ReferenceError、SyntaxError、 TypeErrorURIError、ArrayBuffer、SharedArrayBuffer、DataView、Typed Array、Float32Array、 Float64Array、Int8Array、Int16Array、Int32Array、UInt8Array、UInt16Array、UInt32Array、 UInt8ClampedArray。 四個(gè)用于當(dāng)作命名空間的對(duì)象: Atomics JSON Math Reflect
- 原生對(duì)象(Native Objects):可以由用戶(hù)通過(guò) Array、RegExp 等內(nèi)置構(gòu)造器或者特殊語(yǔ)法創(chuàng)建的對(duì)象。
能夠通過(guò)語(yǔ)言本身的構(gòu)造器創(chuàng)建的對(duì)象稱(chēng)作原生對(duì)象。
幾乎所有這些構(gòu)造器的能力都是無(wú)法用純 JavaScript 代碼實(shí)現(xiàn)的,它們也無(wú)法用class/extend 語(yǔ)法來(lái)繼承。
所有這些原生對(duì)象都是為了特定能力或者性能,而設(shè)計(jì)出來(lái)的“特權(quán)對(duì)象”。
- 普通對(duì)象(Ordinary Objects):由{}語(yǔ)法、Object 構(gòu)造器或者 class 關(guān)鍵字定義類(lèi)創(chuàng)建的對(duì)象,它能夠被原型繼承。
特殊行為對(duì)象
- Array:Array 的 length 屬性根據(jù)最大的下標(biāo)自動(dòng)發(fā)生變化。
- Object.prototype:作為所有正常對(duì)象的默認(rèn)原型,不能再給它設(shè)置原型了。
- String:為了支持下標(biāo)運(yùn)算,String 的正整數(shù)屬性訪(fǎng)問(wèn)會(huì)去字符串里查找。
- Arguments:arguments 的非負(fù)整數(shù)型下標(biāo)屬性跟對(duì)應(yīng)的變量聯(lián)動(dòng)。
- 模塊的 namespace 對(duì)象:特殊的地方非常多,跟一般對(duì)象完全不一樣,盡量只用于import 吧。
- 類(lèi)型數(shù)組和數(shù)組緩沖區(qū):跟內(nèi)存塊相關(guān)聯(lián),下標(biāo)運(yùn)算比較特殊。
- bind 后的 function:跟原來(lái)的函數(shù)相關(guān)聯(lián)。
以上就是js的一些潛在規(guī)則使用分析的詳細(xì)內(nèi)容,更多關(guān)于js潛在規(guī)則的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序中button組件的邊框設(shè)置的實(shí)例詳解
這篇文章主要介紹了微信小程序中button組件的邊框設(shè)置的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09可拖動(dòng)窗口,附帶鼠標(biāo)控制漸變透明,開(kāi)啟關(guān)閉功能
可拖動(dòng)窗口,附帶鼠標(biāo)控制漸變透明,開(kāi)啟關(guān)閉功能...2006-06-06精確到按鈕級(jí)別前端權(quán)限管理實(shí)現(xiàn)方案
這篇文章主要為大家介紹了精確到按鈕級(jí)別前端權(quán)限管理實(shí)現(xiàn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Three.js引用和環(huán)境搭建過(guò)程詳解
這篇文章主要為大家介紹了Three.js引用和環(huán)境搭建過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05AntDesignPro使用electron構(gòu)建桌面應(yīng)用示例詳解
這篇文章主要為大家介紹了AntDesignPro使用electron構(gòu)建桌面應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10THREE.js添加多個(gè)castShadow光源報(bào)錯(cuò)解決及原因分析
這篇文章主要介紹了THREE.js添加多個(gè)castShadow的光源報(bào)錯(cuò)解決及原因分析2023-06-06Js原型鏈constructor prototype __proto__屬性實(shí)例詳解
這篇文章主要介紹了Js原型鏈constructor prototype __proto__屬性實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10微信小程序之網(wǎng)絡(luò)請(qǐng)求簡(jiǎn)單封裝實(shí)例詳解
這篇文章主要介紹了微信小程序之網(wǎng)絡(luò)請(qǐng)求簡(jiǎn)單封裝實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06前端AI機(jī)器學(xué)習(xí)在瀏覽器中訓(xùn)練模型
這篇文章主要為大家介紹了前端AI機(jī)器學(xué)習(xí)在瀏覽器中訓(xùn)練模型的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07