整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          必考知識點-JavaScript類型轉換(講原理)

          必考知識點-JavaScript類型轉換(講原理)

          、類型轉換先說類型

          類型轉換指將一種類型轉換為另一種類型,那我們首先來說說JavaScript中的類型。


          1.1原始(Primitive)數據類型

          • Null
          • Undefined
          • Boolean
          • String
          • Number
          • Symbol
          • BigInt

          BigInt時一種新的數據類型,用于當整數值大于Number數據類型支持的范圍時。這種數據類型允許我們安全地對大整數執行算術操作,表示高分辨率的時間戳,使用大整數id,等等,而不需要使用庫。重要的是要記住,不能使用Number和BigInt操作數的混合執行算術運算,需要通過顯式轉換其中的一種類型。此外,出于兼容性原因,不允許在BigInt上使用一元加號(+)運算符。

          1.2引用(Object)數據類型

          javaScript中內置了很多對象。

          • Array
          • Array
          • ArrayBuffer
          • AsyncFunction
          • Atomics
          • BigInt
          • BigInt64Array
          • BigUint64Array
          • Boolean
          • DataView
          • Date
          • Error
          • EvalError
          • Float32Array
          • Float64Array
          • Function
          • Generator
          • GeneratorFunction
          • Infinity
          • Int16Array
          • Int32Array
          • Int8Array
          • InternalError
          • Intl
          • Intl.Collator
          • Intl.DateTimeFormat
          • Intl.ListFormat
          • Intl.Locale
          • Intl.NumberFormat
          • Intl.PluralRules
          • Intl.RelativeTimeFormat
          • JSON
          • Map
          • Math
          • NaN
          • Number
          • Object
          • Promise
          • Proxy
          • RangeError
          • ReferenceError
          • Reflect
          • RegExp
          • Set
          • SharedArrayBuffer
          • String
          • Symbol
          • SyntaxError
          • TypeError
          • TypedArray
          • URIError
          • Uint16Array
          • Uint32Array
          • Uint8Array
          • Uint8ClampedArray
          • WeakMap
          • WeakSet
          • WebAssembly
          • decodeURI()
          • decodeURIComponent()
          • encodeURI()
          • encodeURIComponent()
          • escape()
          • eval()
          • globalThis
          • isFinite()
          • isNaN()
          • null
          • parseFloat
          • parseInt
          • undefined
          • unescape()
          • uneval()

          詳情請參考MDN,

          大家不要看javaScript的內置對象這么多,轉換時只需要把這么統統當做一個類型引用類型進行轉換就行,在javaScript內部中轉換也不會考慮這么多。


          二、自動裝箱

          為了方便操作基本數據類型, ECMAScript還提供了三個特殊的引用類型,基本包裝類型,String、Boolean、Number。有了這三個類型,在需要的時候,原始類型會自動轉換成相應的包裝對象(這個過程叫自動裝箱)。自動裝箱就是臨時創建一個包裝對象,將原始類型的值封裝起來,以便調用包裝對象的函數。但是原來那個變量的值不會有任何變化!

          var s1="some text";
          var s2=s1.substring(2);

          字符串是基本數據類型,為撒能調用方法了,這其實在后臺進行了一系列的操作

          1. 創建String類型的一個實例
          2. 在實例上調用指定的方法。
          3. 銷毀這個實例。
          var s1=new String("some text");
          var s2=s1.substring(2);
          s1=null;

          當然,你可以將Boolean 、Number 、String 這三個函數當作構造函數來使用,通過手動new包裝類來裝箱(得到包裝對象):

          // 手動裝箱
          var s1=new String("some text");
          s1.toUpperCase();
          typeof s1;
          // "object"

          三、類型轉換的規則




          四、內部用于實現類型轉換的4個函數

          4.1 ToPrimitive ( input [ , PreferredType ] )

          // ECMA-262, section 9.1, page 30. Use null/undefined for no hint,
          // (1) for number hint, and (2) for string hint.
          function ToPrimitive(x, hint) {
              // Fast case check.
              if (IS_STRING(x)) return x;
              // Normal behavior.
              if (!IS_SPEC_OBJECT(x)) return x;
              if (IS_SYMBOL_WRAPPER(x)) throw MakeTypeError(kSymbolToPrimitive);
              if (hint==NO_HINT) hint=(IS_DATE(x)) ? STRING_HINT : NUMBER_HINT;
              return (hint==NUMBER_HINT) ? DefaultNumber(x) : DefaultString(x);
          }
          
          // ECMA-262, section 8.6.2.6, page 28.
          function DefaultNumber(x) {
              if (!IS_SYMBOL_WRAPPER(x)) {
                  var valueOf=x.valueOf;
                  if (IS_SPEC_FUNCTION(valueOf)) {
                      var v=% _CallFunction(x, valueOf);
                      if (IsPrimitive(v)) return v;
                  }
                  var toString=x.toString;
                  if (IS_SPEC_FUNCTION(toString)) {
                      var s=% _CallFunction(x, toString);
                      if (IsPrimitive(s)) return s;
                  }
              }
              throw MakeTypeError(kCannotConvertToPrimitive);
          }
          
          // ECMA-262, section 8.6.2.6, page 28.
          function DefaultString(x) {
              if (!IS_SYMBOL_WRAPPER(x)) {
                  var toString=x.toString;
                  if (IS_SPEC_FUNCTION(toString)) {
                      var s=% _CallFunction(x, toString);
                      if (IsPrimitive(s)) return s;
                  }
                  var valueOf=x.valueOf;
                  if (IS_SPEC_FUNCTION(valueOf)) {
                      var v=% _CallFunction(x, valueOf);
                      if (IsPrimitive(v)) return v;
                  }
              }
              throw MakeTypeError(kCannotConvertToPrimitive);
          }

          ToPrimitive將input轉換為基本數據類型,PreferredType要么不傳,要么是number、string。

          4.1.1 PreferredType為number

          1. 如果input本身就是原始類型,直接返回input。
          2. 調用input.valueOf(),如果結果是原始類型,則返回這個結果。
          3. 調用input.toString(),如果結果是原始類型,則返回這個結果。
          4. 拋出TypeError異常。


          4.1.2 PreferredType為string

          1. 如果input本身就是原始類型,直接返回input。
          2. 調用input.toString(),如果結果是原始類型,則返回這個結果。
          3. 調用input.valueOf(),如果結果是原始類型,則返回這個結果。
          4. 拋出TypeError異常。

          4.1.3 PreferredType不傳入

          1. 如果input是內置的Date類型,PreferredType 視為String
          2. 否則PreferredType 視為 Number。

          來看看這道網上的面試題

          ({}) + 1

          +號操作符,只有當左右兩邊的類型相同(都為string或者number)是才進行操作。所以會經歷如下步驟:

          1. {}和1都會調用ToPrimitive,1原始類型直接返回。
          2. {}內部調用DefaultNumber,使用valueOf方法,返回object。
          3. 在調用toString方法,返回[object, object]。
          4. 所以最后的結果就是[object, object]1。

          這一類轉換換湯不換藥,轉換規則都是這樣的。


          4.2 ToBoolean ( argument )



          4.3 ToNumber( argument )



          4.4 ToString( argument )


          來源:ECMA-262草案/ 2019年11月7日 ECMAScript?2020語言規范


          五、隱式類型裝換

          在執行過程中當js內部期望得到某種類型的值,而實際在那里的值是其他的類型,就會發生隱式類型轉換。系統內部會自動調用我們前面說ToBoolean ( argument )、ToNumber ( argument )、ToString ( argument ),嘗試轉換成期望的數據類型。

          5.1 期望得到boolean的值

          if ( !undefined && !null && !0 && !NaN && !'') {
            // xxxx
          } 

          因為在if的括號中,js期望得到boolean的值,所以對括號中每一個值都使用ToBoolean ( argument ),將它們轉化成boolean。


          5.2 期望得到number的值

          3 * { valueOf: function () { return 5 } }; 

          因為在乘號的兩端,js期望得到number類型的值,所以對右邊的那個對象使用ToNumber ( argument ),得到結果5,再與乘號左邊的3相乘。


          5.3 加號有別于其他運算符

          • 如果有一邊是字符串,就把另外一邊也轉換為字符串
          • 如果一方不是字符串或者數據,就轉換為數據或者字符串

          除了加號運算符,其他運算符,只要其中一方數據,那么另一方就被轉換為數字


          六、顯示類型轉換

          手動調用Boolean(value)、Number(value)、String(value)完成的類型轉換。

          Boolean('some text');  //  true
          Number("2019");  //  2019
          String({a: 1});  //  "[object Object]"

          前面兩個類型轉換沒有什么好解釋的,我們看看最后一個String({a: 1});在內部發生的時候

          1. 執行轉換String({a: 1})。
          2. 執行內部的ToString({a: 1})。
          3. {a: 1}不是原始類型,執行ToPrimitive({a: 1}, hint string)。
          4. 調用toString方法,返回"[object, object]"。
          5. 執行ToString("[object, object]"),返回"[object, object]"。

          我是@半糖學前端 ,專注前端技術領域分享,關注我,和我一起學習共同進步,加油!

          ?不會寫代碼又需要HTML文件怎么呢?會編輯Word文檔就可以,因為Word文檔能直接轉換為HTML文件,當然還是需要借助轉換工具,PDF轉換器就可以實現Word轉HTML。下面,就給大家詳細介紹下如何用迅捷PDF轉換器實現Word轉HTML。具體操作步驟都準備好了,一起來看一下吧。

          ??第一步,雙擊打開迅捷PDF轉換器,在主頁的左側選擇轉換格式,展開【PDF轉換成其他文件】選項,然后選擇【文件轉HTML】。?


          ??第二步,點擊頁面上方的【添加文件】可以把單個的文件加進來進行轉換,也可以點擊【添加文件夾】按鈕,批量添加Word文檔進行批量轉換。?


          ??第三步,點擊右上角的【開始轉換】就完成Word轉HTML了,如果想要更換文件存儲位置,可以勾選【自定義】按鈕,,然后選擇新的存儲位置即可。?


          ??就這么簡單的三步就可以實現Word轉HTML,你學會了吧。快來本站下載迅捷PDF轉換器解鎖更多文件轉換功能,雄雌文件格式轉換不求人,本站提供迅捷PDF轉換器最新版免費下載。

          avaScript為unicode編碼轉換為中文

          var str="\u6211\u662Funicode\u7F16\u7801";

          關于這樣的數據轉換為中文問題,常用的以下方法。

          1. eval解析或new Function("'+ str +'")()
          var str="\\u6211\\u662Funicode\\u7F16\\u7801";
          str=eval("'" + str + "'"); // "我是unicode編碼"

          2. unescape 解析

          方法一:

          var str="\\u6211\\u662Funicode\\u7F16\\u7801";
          str=unescape(str.replace(/\u/g, "%u")); // "我是unicode編碼"

          方法二:


          主站蜘蛛池模板: 亚洲AV本道一区二区三区四区| 国产aⅴ精品一区二区三区久久| 国模视频一区二区| 亚洲av乱码一区二区三区| 国产香蕉一区二区在线网站| 精品欧洲av无码一区二区三区| 麻豆AV天堂一区二区香蕉 | 无码中文字幕人妻在线一区二区三区| 国产成人无码AV一区二区| 亚洲va乱码一区二区三区| 日本香蕉一区二区三区| 亚洲电影唐人社一区二区| 久久久无码精品人妻一区| 无码中文人妻在线一区二区三区| 国产精品无码一区二区在线观一| 亚洲日本va午夜中文字幕一区| 男人的天堂av亚洲一区2区 | 能在线观看的一区二区三区| 精品福利一区二区三| 亚洲日本精品一区二区| 视频一区视频二区日韩专区| 国产丝袜视频一区二区三区| 日韩精品一区二区三区中文精品| 国产丝袜一区二区三区在线观看 | 久久亚洲一区二区| 国产伦理一区二区| 国产丝袜视频一区二区三区| 99精品国产一区二区三区| 亚洲片一区二区三区| 丰满岳妇乱一区二区三区| 无码8090精品久久一区| | 无码一区二区三区亚洲人妻| 亚洲欧美成人一区二区三区 | 欧洲精品一区二区三区在线观看| 中文字幕日韩一区二区不卡 | 日韩精品中文字幕无码一区| 久久久久久综合一区中文字幕| 寂寞一区在线观看| 色婷婷综合久久久久中文一区二区| 国产精品视频一区二区噜噜|