JavaScript 新增兩個原始數據類型

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列

JavaScript即將推出兩個新的數據類型:Record 和 Tuple ,這倆是啥呢?其實就是一個只讀的 Object 和 Array,其實在其它語言中已經有類似的數據類型了,例如 Python 中也有 Tuple(元祖)這一類型,作用也是一個只讀的數組(在Python里叫只讀的列表),一起來了解一下,這個特性是一個第2階段提案(即差不多穩了),想要提前體驗的,文末也有 polyfill 的使用教程!

基礎寫法

//?Records
const?myRecord?=?#{name:?'01',age:?23
}//?Tuple
const?myTuple?=?#['1',?'2',?'3']

其實就是在原先的對象和數組前面加了個 #

可讀特性

Record和Tuple的語法跟對象和數組是一樣的,所以?

const?myRecord?=?#{name:?'01'
}const?myTuple?=?#['1',?'2']myRecord['age']?=?23??//?error
myTuple.push('3')??//?error

為啥報錯了啊?開頭有提到哦~因為這兩個類型是 只讀的 Object 和 Array

非唯一性

在平時的開發中,數組與數組、對象與對象 都不適合直接用 === 進行比較判斷,因為每個生成的對象在內存中的地址都不一樣

const?obj1?=?{?name:?'01'?}
const?obj2?=?{?name:?'01'?}
const?objIsSame?=?obj1?===?obj2???//?falseconst?arr1?=?[1]
const?arr2?=?[1]
const?arrIsSame?=?arr1?===?arr2???//?false

要想真正比較兩個數組或對象是否相等(即我們想要的內容都一樣),需要遍歷遞歸去一一對比,而現在呢?Record和Tuple能否解決這一問題呢?

const?record1?=?#{?name:?'01'?}
const?record2?=?#{?name:?'01'?}
const?recordIsSame?=?record1?===?record2???//?trueconst?tuple1?=?#[1]
const?tuple2?=?#[1]
const?tupleIsSame?=?tuple1?===?tuple2???//?true

可以看到,只要內部內容一致,即使是兩個分別生成的Record或Tuple比較一下,也是相等的

普通對象和數組的轉換

我可以用對象 RecordTuple 將普通的對象和數組轉換

const?myRecord?=?Record({?name:?'01',?age:?23?});???//?#{?name:?'01',?age:?23?}
const?myTuple?=?Tuple([1,?2,?3,?4,?5]);???//?#[1,?2,?3,?4,?5]

支持擴展運算符

我們也可以對Record和Tuple使用擴展運算符

const?myTuple?=?#[1,?2,?3];
const?myRecord?=?#{?name:?'01',?age:?23?};const?newRecord?=?#{?...myRecord,?money:?0?}?//?#{?name:?'01',?age:?23,?money:?0?}
const?newTuple?=?#[?...myTuple,?4,?5];???//?#[1,?2,?3,?4,?5]

JSON方法擴展

現在不是有 JSON.parseJSON.stringfy 兩個方法嘛,據說草案中還提到一個不錯的想法,那就是給 JSON 對象新增一個 parseImmutable 方法,功能應該就是直接將一個 Record字符串或Tuple字符串 解析成對應的Record和Tuple對象

提前體驗

如果你想現在體驗該功能,可以裝一下babel的插件

#?babel基本的庫
yarn?add?@babel/cli?@babel/core?@babel/preset-env?-D#?Record和Tuple?Babel?polyfill
yarn?add?@babel/plugin-proposal-record-and-tuple?@bloomberg/record-tuple-polyfill?-D

在目錄下創建 .babelrc,內容如下:

{"presets":?["@babel/preset-env"],"plugins":?[["@babel/plugin-proposal-record-and-tuple",{"importPolyfill":?true,"syntaxType":?"hash"}]]
}

再創建一個 index.js,內容如下:

const?tuple1?=?#[1,2,3]
const?tuple2?=?#[1,2,3]const?record1?=?#{?name:?'01'?}
const?record2?=?#{?name:?'02'?}console.log(tuple1?===?tuple2,?record1?===?record2)

執行一下babel的命令編譯一下

./node_modules/.bin/babel?index.js?--out-file?compiled.js

輸出得到的 compiled.js 文件內容如下:

"use?strict";var?_recordTuplePolyfill?=?require("@bloomberg/record-tuple-polyfill");var?tuple1?=?(0,?_recordTuplePolyfill.Tuple)(1,?2,?3);
var?tuple2?=?(0,?_recordTuplePolyfill.Tuple)(1,?2,?3);
var?record1?=?(0,?_recordTuplePolyfill.Record)({name:?'01'
});
var?record2?=?(0,?_recordTuplePolyfill.Record)({name:?'02'
});
console.log(tuple1?===?tuple2,?record1?===?record2);

最后執行 compiled.js 即可獲得結果

node?compiled.js
#?Result:?true?false

@babel/plugin-proposal-record-and-tuple 更多用法見 Babel 官方文檔

https://babeljs.io/docs/en/babel-plugin-proposal-record-and-tuple#docsNav

應用場景

了解了那么多的內容,印象最深刻的應該就是 只讀 這個特性,那么基于這個特性,Record 和 Tuple 有哪些應用場景呢?

  • 用于保護一些數據,比如函數的返回值、對象內部的靜態屬性...

  • 既然具有只讀的特性,即不可變對象,那應該也可以作為對象的 key 值吧?

6b6054d1a635bba55e312eda22dbe893.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

73d1b9bb12d1646b2037ff651cf71b2c.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274832.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

axure低保真原型_如何在Google表格中創建低保真原型

axure低保真原型Google Sheets is a spreadsheet, just like Microsoft Excel.Google表格是一個電子表格,就像Microsoft Excel一樣。 Most people associate it with calculating numbers. But Google Sheets is actually great for organizing your ideas, making…

Weblogic EJB 學習筆記(3)精

編輯實體bean的高級課程 1. 怎樣開發主健類 ejb的主健類主要用做持久存儲和ejb容器中的唯一標識符. 通常主健類的字段直接映射到數據庫中的主健字段. 如果主健只是由單個實體bean字段組成.且其數據類型是基本的java類.如string,則bean作者不必開發自定義的主健類. 只需要在配置…

Lerna 運行流程剖析

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列Lerna…

手動創建線程池 效果會更好_創建更好的,可訪問的焦點效果

手動創建線程池 效果會更好Most browsers has their own default, outline style for the :focus psuedo-class.大多數瀏覽器對于:focus psuedo-class具有其默認的輪廓樣式。 Chrome’s default outline styleChrome瀏覽器的默認輪廓樣式 This outline style is cr…

C++builder enum類型

C/C code #pragmaoption push -b-enumTThreadPriority { tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical }; //這是字節型的.理論上說這是可能的最小整形.可以是1Byte, 2Bytes, 4Bytes...#pragmaoption pop#pragmaoption push -benumTThreadPriori…

chrome瀏覽器世界之窗瀏覽器的收藏夾在哪?

今天心血來潮,用一個查重軟件刪除重復文件,結果把chrome瀏覽器和世界之窗瀏覽器的收藏夾給刪除了,導致我保存的好多網頁都沒有了,在瀏覽器本身和網上都沒有找到這兩個瀏覽器默認的收藏夾在哪個位置,只好用DiskGenius 把…

Vue3究竟好在哪里 等推薦

話不多說,這一次花了幾小時精心為大家挑選了30余篇好文,供大家閱讀學習,提升自己的技術視野以及擴展自己的知識儲備。本文閱讀技巧,先粗看標題,感興趣可以都關注一波,一起共同進步。前端從進階到入院框架原…

eazy ui 復選框單選_UI備忘單:單選按鈕,復選框和其他選擇器

eazy ui 復選框單選重點 (Top highlight)Pick me! Pick me! No, pick me! In today’s cheat sheet we will be looking at selectors and how they differ. Unlike most of my other cheat sheets, this will focus on two components (radio buttons and checkboxes) side by…

過濾詞

<?xml version"1.0" encoding"GB2312"?>-<wordList> <word>,</word> <word>.</word> <word><</word> <word>></word> <word>?</word> <word>/</word> <…

VS2010 VC Project的default Include設置

http://blog.csdn.net/jeffchen/article/details/5491435 VS2010與以往的版本一個最大的不同是&#xff1a;VC Directory設置的位置和以前的版本不一樣。VS2010之前&#xff0c;VC Directory的設置都是在IDE的Tools->Options中設置的&#xff1b;VS2010改為&#xff0c;分別…

初級中級高級_初級職位,(半)高級職位

初級中級高級As a recent hire at my new job, as expected, a lot of things seemed scary and overwhelming. The scariest part was not the unfamiliarity with certain tasks or certain tools, but in communicating with higher-level coworkers, managers and bosses. …

如何寫好技術文章(看張鑫旭老師的直播總結

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文是…

Fact Table and Dimension Table In My Opinion

23轉載于:https://www.cnblogs.com/answeryou/archive/2012/05/10/2495122.html

iOS 流媒體 基本使用 和方法注意

項目里面需要添加視頻方法 我自定義 選用的是 avplayer 沒選擇 MediaPlayer 原因很簡單 , avplayer 會更容易擴展 有篇博客 也很好地說明了 使用avplayer的優越性 blog.csdn.net/think12/article/details/8549438在iOS開發上&#xff0c;如果遇到需要播放影片&#xff0c;…

figma下載_遷移至Figma

figma下載Being an intuitive and user-friendly tool and having the possibility of real-time collaboration are some of the main reasons people choose to use Figma. But the migration process to Figma may sometimes be painful or time-consuming. 人們選擇使用Fig…

metaWeblog 相關的參數

Function: Creates a new post on your blog. tags如果沒會自動那一個 但是categroies如果與已經建立的不同,就會忽略掉的 可以用 string.replace(\n,).split(,) Parameters: Blog ID – For use in multisite installations, typically 0 for single sites Username – WordPr…

TypeScript 常用的新玩法

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列上周分…

《Programming in Lua 3》讀書筆記(十二)

日期&#xff1a;2014.7.14 PartⅡ Object-Oriented ProgrammingLua中實現面向對象編程。“如同OOP對象&#xff0c;table擁有狀態&#xff1b;如同OOP對象&#xff0c;table擁有標識符---self&#xff0c;用來與其他變量做區分&#xff0c;而且兩個table擁有同樣的值也是…

(轉)AS3中的stage,this,root的區別

要了解這個問題就要先對flash中的顯示對象結構有一個大概的了解&#xff1a; 第一級&#xff1a;舞臺&#xff1b; 第二級&#xff1a;當前SWF&#xff1b; 第三級&#xff1a;各種容器及可視對象&#xff08;如&#xff1a;文本框&#xff0c;位圖……&#xff09;&#xff1b…

面試官是怎樣高效面試的(面試官的“套路”

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列最近正…