国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

原來JS還可以這樣拆箱轉換詳解

2024-05-06 15:42:40
字體:
來源:轉載
供稿:網友

前言

在讀 Winter 大佬的《重學前端》欄目時,重溫了 JS 的「拆箱轉換」。「裝箱轉換」與「拆箱轉換」以前都是了解的,今天來看,自己所謂的了解也真是一知半解。在閱讀 Winter 老師寫的內容后,對「拆箱轉換」這個知識點還是不甚清楚,因此我再去深入地了解一番,參考資料詳見文末的「參考鏈接」。

被我們忽略的表象

首先,我們來看一下例子:

const a = { name: 'a', toString () {  console.log(this);  console.log('toString');  return { name: 'toString' }; }, valueOf () {  console.log(this);  console.log('valueOf');  return { name: 'valueOf' }; }};a * 2;// {name: "a", toString: ƒ, valueOf: ƒ}// valueOf// {name: "a", toString: ƒ, valueOf: ƒ}// toString// Uncaught TypeError: Cannot convert object to primitive valuea + "";// {name: "a", toString: ƒ, valueOf: ƒ}// valueOf// {name: "a", toString: ƒ, valueOf: ƒ}// toString// Uncaught TypeError: Cannot convert object to primitive alert(a);// {name: "a", toString: ƒ, valueOf: ƒ}// toString// {name: "a", toString: ƒ, valueOf: ƒ}// valueOf// Uncaught TypeError: Cannot convert object to primitive value

可以看到,toString 和 valueOf 的執行順序并不固定,而是根據某個條件來決定的,那么是根據什么呢?那就是在拆箱轉換時,調用了對象的 ToPrimitive 內部函數時,其會根據執行上下文,自動傳入一個轉換類型參數,暫時給它命名為 hint。

ToPrimitive

在 JavaScript 標準中,規定了 ToPrimitive 函數,它是對象類型到基本類型轉換的實現者(即,拆箱轉換);但這是一個內部算法,是編程語言在內部執行時遵循的一套規則。

對象到 String 和 Number 的轉換都遵循“先拆箱再轉換”的規則。通過拆箱轉換,把對象變成基本類型,再從基本類型轉換為對應的 String 或者 Number。

但是對于不同的操作,拆箱轉換的內部實現也有所區別,正如上面的例子所示。

「拆箱轉換」的調用規則及順序如下:

檢查對象中是否有用戶顯式定義的 [Symbol.toPrimitive] 方法,如果有,直接調用; 如果沒有,則執行原內部函數 ToPrimitive,然后判斷傳入的 hint 值,如果其值為 string,順序調用對象的 toString 和 valueOf 方法(其中 toString 方法一定會執行,如果其返回一個基本類型值,則返回、終止運算,否則繼續調用 valueOf 方法); 如果判斷傳入的 hint 值不為 string,則就可能為 number 或者 default 了,均會順序調用對象的 valueOf 和 toString 方法(其中 valueOf 方法一定會執行,如果其返回一個基本類型值,則返回、終止運算,否則繼續調用 toString 方法);

來看一下第一種情況:

const b = { [Symbol.toPrimitive] (hint) {  console.log(`hint: ${hint}`);  return {}; }, toString () {  console.log('toString');  return 1; }, valueOf () {  console.log('valueOf');  return 2; }};alert(b); // hint: string b + ''; // hint: defaultb + 500; // hint: default+b; // hint: numberb * 1; // hint: number            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 凤山县| 无极县| 北流市| 神农架林区| 宜春市| 南康市| 林甸县| 威信县| 芮城县| 雷州市| 永寿县| 曲靖市| 桓仁| 招远市| 宁强县| 西充县| 托里县| 含山县| 凌源市| 井研县| 三台县| 自贡市| 宁安市| 句容市| 天气| 苍梧县| 封开县| 田林县| 彰化县| 尤溪县| 河曲县| 江孜县| 开原市| 云和县| 张家界市| 宣威市| 东乌珠穆沁旗| 荃湾区| 苏尼特左旗| 沙湾县| 兴仁县|