從一道題看js的拆箱操作

来源:https://www.cnblogs.com/xya-b/archive/2019/10/10/11646641.html
-Advertisement-
Play Games

前段時間看到一道題,如下:([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]問最終列印結果,然後簡單瞭解一下js的裝箱,拆箱操作。 基本 1. 裝箱操作: 就是將基本類型(String, Number, Boolean)轉為引用類型 2. 拆箱操作: 與裝箱相反,就是將引用類 ...


前段時間看到一道題,如下:([][[]]+[])[+![]]+([]+{})[!+[]+![]]問最終列印結果,然後簡單瞭解一下js的裝箱,拆箱操作。

基本
  1. 裝箱操作: 就是將基本類型(String, Number, Boolean)轉為引用類型
  2. 拆箱操作: 與裝箱相反,就是將引用類型轉為基本類型, 常用的基本方法有: valueof , toString()
分析

像上面的那個題目,主要是拆箱操作,下麵就來簡單拆解分析一下吧:

   1. 基礎:
    [] ==> [] (Array);
    [[]] ==> [array(0)]  (Array);
    []+[[]] ???
    ok, 我們簡單來瞭解一下js中的+運算符:
    +:一般是用於對象相加的,這是在兩個對象都是Number的情況下。那其他類型下就涉及到隱式轉換,下麵看下隱式轉換的規則
      1. 如果一個對象是String,那麼就要將另一個對象轉換為String再進行字元串拼接
      2. 如果對象都是複雜類型,那麼就要將兩個對象均轉化為String,再進行拼接。
      至於如果對象是其他簡單類型(Number, Boolean),就要先將對象轉化為Number再進行運算
    所以 []+[[]] ==> String([]) + String([[]]) == "" + "" ==> ""
   2. 拆解:
    然後我們來看下題目,簡單拆分為4部分:
    
      1. ([][[]]+[])
         [][[]] 這部分乍一眼看過去會覺得很蒙,但我們已經知道[] ==> Array,常用的獲取Array中的數據的方法有Array[]
         所以,讓我們來拆解下吧:
         首先為了更清楚,將最左側的[]賦值給 father ==> var father = [];
         將右側[]中的[]賦值給child ==> var child = [];
         即最終 [][[]] == father[child] == "undefined"
         [][[]] + [] == String("undefined") + String([]) == "undefined"
         
      2. [+!![]]
         關於這一部分,我們需要瞭解一下!!
         !!: 一般來說,似乎大家普遍認為是將對象取反,再取反,即雙重否定。但其實應該是將對象強制轉換為Boolean類型。
         關於Boolean中,需要關註,{}和[]轉換為Boolean時是true.
         [+!![]] ==>[+true] ==> [Number(true)] ==> [1]
      3. ([]+{})
         這一部分就很簡單了: []+{} ==> String([]) + String({}) == "" + "[object Object]".
         但是,如果將上面兩個對象調轉位置呢:
         {} + [] : 按常規來說,應該是和上面一樣的結果,但是最終的列印結果卻是0,這是為什麼呢。
         js中{} 不僅可以代表一個對象,同時也有可能是一個代碼塊,有些時候,js會將寫在前面的{}解釋為代碼塊,於是參與運算的其實就只有+[]了。
      4. [!+[]+!![]]
        經過上面部分,這裡也很清楚了:
        !+[] ==> ! + String([]) == !+"" == !"" == true
        [true + !![]] == [true + true] = [Number(true) + Number(true)] == [2]
      
      所以最後的結果: "undefined"[1] + "[object Object]"[2] == "nb";

通過上面的題目,應該已經大致瞭解了關於拆箱的一些基礎了。這樣,下次看到就不會一頭霧水了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Node.js的crypto模塊提供了一組包括對OpenSSL的哈希、HMAC、加密、解密、簽名,以及驗證等一整套功能的封裝。具體的使用方法可以參考這篇文章中的描述:node.js_crypto模塊。 本文重點介紹在使用createCipheriv方法時所遇到的坑。對應的解密演算法createDeci ...
  • 1. 在IE8中整個頁面都打不開,一般情況是: 頁面組件中最後一個屬性出現了逗號 沒有多餘的逗號,就很有可能是組件中沒有設置renderTo:Ext.getBody(); 2. 頁面按鈕顏色失效 自定義css,更改按鈕顏色即可 3. 頁面視窗上下層級錯亂 在點擊的window屬性中添加alwaysO ...
  • 一、小案例(評論區) 1、流程 (1)分析靜態頁面。(vue項目創建參考https://www.cnblogs.com/l-y-h/p/11241503.html)(2)拆分靜態頁面,變成一個個組件。(3)對組件編碼,生成動態頁面。 2、靜態頁面 參考來源:https://www.bilibili. ...
  • @babel/traverse 官網: https://babeljs.io/docs/en/babel-traverse github:https://github.com/babel/babel/blob/master/packages/babel-traverse/test/traverse. ...
  • 調用請求: 封裝函數: 返回值的數據類型不夠齊全,如有需要再做修改 ...
  • <div id="div1"></div><div id="div2"></div><div id="div3"></div><div id="div4"></div><div id="div5"></div><div id="div6"></div> ps : transparent為設置透明 為 ...
  • 使用Vue cli3.0創建的項目,如何發佈npm包 在使用 進行項目開發時,如果我們想要發佈一個包,有時候會有點迷糊,不知道應該怎麼修改腳手架的預設設置。這裡記錄一下一些常見的操作。 創建index.js進行模塊的導出 將我們需要導出的組件在 文件中進行統一導出,可能之前需要進行處理,是先進行全局 ...
  • 1.校驗的數據結構如下: 2.html結構 3.提交 4.效果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...