這篇文章主要介紹JavaScript中隱藏語法是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司成立十多年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設(shè)計、國際域名空間、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)公司通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
javaScript 通常被認為是最容易入門的語言,也是最難掌握的語言,我完全同意。這是因為 JavaScript 是一種非常古老且非常靈活的語言,它有著了神秘的語法和過時的特性。
我已經(jīng)使用 JavaScript 很多年了,直到現(xiàn)在,我偶爾會發(fā)現(xiàn)一些隱藏的語法或技巧,這些是我以前不知道的。雖然這些特性可能不太為人所知,但它們?nèi)匀皇潜娝苤摹?/p>
注意:這里沒有包括變量的提升、閉包、代理、原型繼承、異步等待、生成器等。
JavaScript 有一個一元 void 操作符。你可能見過它被用作 void(0) 或 void 0。void的作用便是返回undefined,在它右邊的操作數(shù)會正常計算,但是無論結(jié)果是什么,void都會返回undefined。使用“0”只是一種慣例。不必使用' 0 ',它可以是任何有效的表達式,如void <表達式>,它仍然返回未定義的。
// void operator void 0 // returns undefined void (0) // returns undefined void 'abc' // returns undefined void {} // returns undefined void (1 === 1) // returns undefined void (1 !== 1) // returns undefined void anyfunction() // returns undefined
為什么要創(chuàng)建一個特殊的關(guān)鍵字來返回undefined而不是僅僅返回undefined? 聽起來有點多余,不是嗎?
有趣的事實
實際上,在ES5之前,在大多數(shù)瀏覽器中,可以為原始的 undefined = "abc"分配一個新值。所以,在那些日子里,使用void是一種確保始終返回 undefine 的原始值的方法。
是的,我們在調(diào)用構(gòu)造函數(shù)時在類名后添加的括號——完全可選!(前提是不需要將任何參數(shù)傳遞給構(gòu)造函數(shù))
下面的兩種代碼風格都被認為是有效的 JS 語法而且結(jié)果都是一樣!
// Constructor with brackets const date = new Date() const month = new Date().getMonth() const myInstance = new MyClass() // Constructor without brackets const date = new Date const month = (new Date).getMonth() const myInstance = new MyClass
IIFE (立即調(diào)用的函數(shù)表達式)的語法對我來說總是有點奇怪,為什么要有那么多的括號?
實際上,這些額外的括號只是為了告訴JavaScript解析器,即將解析的的代碼是一個函數(shù)表達式,而不是函數(shù)。知道了這一點,你可以想象,有很多方法可以省略那些額外的括號,仍然可以使用 IIFE 有效的工作。
// IIFE (function () { console.log('正常形式的 IIFE 調(diào)用') })() // 清爽的 IIEF void function() { console.log('酷酷的 IIFE 調(diào)用') }()
void
操作符告訴解析器代碼是函數(shù)表達式。因此,我們可以跳過函數(shù)定義周圍的括號。你猜怎么著? 我們可以使用任何一元運算符(void, +, !, -等等
),這仍然有效!
這是不是比原始的寫法簡單而且 B 格多了呢?
但是,如果你是一個敏銳的觀察者,你可能會想,一元運算符不會影響 IIFE 返回的結(jié)果嗎?
它會影響結(jié)果。但好消息是,如果你只要的返回的結(jié)果并將其存儲在某個變量中,那么就不需要額外的括號。
JavaScript 有一個with語句塊, with 實際上是JS中的關(guān)鍵字。 with 塊的語法如下:
with 語句可以方便地用來引用某個特定對象中已有的屬性,但是不能用來給對象添加屬性。要給對象創(chuàng)建新的屬性,必須明確地引用該對象。
有趣的事實
with 塊看起來很酷,對吧? 它甚至比對象銷毀更好。好吧,其實不是。
通常不鼓勵使用 with 語句,因為它已被棄用,在嚴格模式下完全禁止。事實證明,使用 with 塊會增加語言中的一些性能和安全性問題。
函數(shù)語句不是定義新函數(shù)的唯一方法,可以使用function()構(gòu)造函數(shù)和new 操作符動態(tài)定義函數(shù)。
有趣的事實
Function 構(gòu)造函數(shù)是 JavaScript 中所有構(gòu)造函數(shù)的母親。甚至 Object 的構(gòu)造函數(shù)也是 Function 構(gòu)造函數(shù)。而 Function 自己的構(gòu)造函數(shù)也是 Function 本身。
因此,調(diào)用 object.constructor.constructor ...足夠多次將最終在 JavaScript 中的任何對象上返回Function構(gòu)造函數(shù)。
我們都知道函數(shù)是JavaScript中的第一類對象。因此,沒有人阻止我們向函數(shù)添加自定義屬性。在 JS 中這樣做是有效的,然而,它很少被使用。
那么我們什么時候要這樣做?
這里有一些很好的用例。例如,
可配置函數(shù)
假設(shè)我們有一個函數(shù)叫做 greet。我們希望函數(shù)根據(jù)不同的地區(qū)打印不同的問候消息,這個區(qū)域設(shè)置也應(yīng)該是可配置的。我們可以在某個地方維護全局 locale 變量,也可以使用如下所示的函數(shù)屬性實現(xiàn)該函數(shù)
function greet () { if (greet.locale === 'ch') { console.log('中國,你好') } else if (greet.locale === 'jp') { console.log('扣你機哇!') } else { console.log('Hello World') } } greet() // Hello World greet.locale = 'ch'; greet() // 中國,你好
具有靜態(tài)變量的函數(shù)
另一個類似的例子。比方說,希望實現(xiàn)一個生成有序數(shù)字序列的數(shù)字生成器。通常您將使用帶有靜態(tài)計數(shù)器變量的 Class 或 IIFE 來跟蹤最后一個值。這樣我們就限制了對計數(shù)器的訪問,同時也避免了使用額外的變量污染全局空間。
但是,如果我們希望能夠靈活地讀取甚至修改計數(shù)器,而又不污染全局空間,該怎么辦呢?
我們?nèi)匀豢梢詣?chuàng)建一個類,有一個計數(shù)器變量和一些額外的方法來讀取它;或者我們可以偷懶,使用函數(shù)自定義的屬性。
Arguments 的屬性
我相信你們大多數(shù)人都知道函數(shù)中的arguments對象。它是一個類似數(shù)組的對象,可以在所有函數(shù)中使用。它具有在調(diào)用函數(shù)時傳遞給函數(shù)的參數(shù)列表。但它也有一些其他有趣的性質(zhì):
arguments.callee: 當前調(diào)用的函數(shù)
arguments.callee.caller:調(diào)用當前函數(shù)的函數(shù)
注意:雖然ES5禁止在嚴格模式下使用callee & caller,但在許多編譯后的庫中仍然很常見。所以,學(xué)習(xí)它們是值得的。
模板字符串文字是ES6中許多很酷的附加內(nèi)容之一,但是,知道標記模板字符串是比較少的?
標記模板字符串允許你通過向模板字符串添加自定義標記來更好地將模板文字解析為字符串。Tag只是一個解析器函數(shù),它獲取字符串模板解釋的所有字符串和值的數(shù)組,標記函數(shù)應(yīng)返回最終字符串。
在下面的例子中,我們的自定義標記 ——?高亮顯示,解釋模板文本的值,并將解釋后的值包裝在結(jié)果字符串中,使用元素進行高亮顯示。
在大多數(shù)情況下,JavaScript對象是簡單的。假設(shè)我們有一個 user 對象,我們試圖使用user訪問它的age屬性。使用 user.age 得到年齡屬性的值,如果沒有定義,我們得到未定義的值。
但是,并不一定要這么簡單。JavaScript 對象具有 getter 和 setter 的概念。我們可以編寫自定義Getter函數(shù)來返回我們想要的任何東西,而不是直接返回對象上的值,設(shè)置一個值也是一樣。
這使我們可以在獲取或設(shè)置字段時擁有強大的能力,如 virtual fields
,field validations
,side-effects
。
JavaScript有一個逗號操作符。它允許我們在一行中用逗號分隔多個表達式,并返回上一個表達式的結(jié)果。
在這里,所有表達式都將被求值,結(jié)果變量將被賦值給expressionN返回的值。
我們經(jīng)常在for循環(huán)中使用了逗號操作符
for (var a = 0, b = 10; a <= 10; a++, b--)
有時在一行中編寫多個語句
function getNextValue() { return counter++, console.log(counter), counter }
或者
const getSquare = x => (console.log (x), x * x)
想要快速地將字符串轉(zhuǎn)換為數(shù)字嗎?
只需在字符串前面加上+運算符。加號運算符也適用于負數(shù)、八進制、十六進制、指數(shù)值。更重要的是,它甚至可以轉(zhuǎn)換 Date 或者 Moment.js對象的時間戳!
從技術(shù)上講,它不是一個單獨的JavaScript操作符。它只是兩次使用的 JavaScript 反運算符。
如果表達式為true值,則返回true;否則返回false。
讓我們面對它——沒有人關(guān)心位操作符。我們什么時候才能使用它!
這里有一個日常用例是關(guān)于波浪號或位非運算符的。
事實證明,當與數(shù)字一起使用時,非運算符是有效的 ~N => -(N+1)這個表達式只有在 N為-1時才計算為 “0”。
我們可以通過將~放在theindexOf(…)函數(shù)前面來利用這一點,如果項目存在于字符串或數(shù)組中,則執(zhí)行布爾檢查。
注意:ES6和ES7分別在字符串和數(shù)組中添加了一個新的 .include()方法。當然,這是一種比波浪號操作符更清晰的方法來檢查一個項目是否存在于數(shù)組或字符串中。
break和continue語句都可以與lebel語句聯(lián)合使用,從而返回代碼中特定的位置。用于嵌套循環(huán),減少循環(huán)次數(shù)。
以上是JavaScript中隱藏語法是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!