SingleFile is software to save a complete web page into a single HTML file(via browser extension and a CLI tool). The CLI version “single-file-cil“ can be used as below.
Note that the instructions below show how to install and use this CLI tool with Docker which is the simplest way, however it requires you have Docker installed. You can also run from code without Docker, but it requires more work to do, such as installing the dependencies manually.
1 | # Pull the Docker image of "single-file-cil". |
To better understand how the Docker image works, you can read the “Dockerfile” here.
]]>1 | # Create a new local branch based on an existing remote branch. |
Go to “Settings” to enable the “Background App Refreshing” for this app.
Open the app, check the photos which are NOT be uploaded, open some of them can tap upload manually.
Check the videos which are not uploaded and do the same thing as step 2.
After that the app started the upload process. Some other tricks such as “enable cellular backup” mentioned here may also work.
]]>In Xcode, when you press “Shift + Command + O” to use the “Open Quickly” feature to open a file, by default the file will be opened in the existing tab instead of a new tab. However I want to change this behavior to open the file in a new tab. This can be done by the following configuration:
Press “Command + ,” to open “Settings”. Go to the “Navigation” tab.
Update the “Optional Navigation” by setting its value as “Uses Tab”.
Done.
Now when you press “Shift + Command + O” to use the “Open Quickly” feature to open a file, after searching and selecting the file, press “Option + Enter” to open it. Now the file will be opened in a new tab.
]]>1 | cd ~/Library/Mobile\ Documents/iCloud\~com\~apple\~iBooks/Documents |
1 | # Method 1. |
Please following the following file content to set multiple index URLs in “~/.pip/pip.conf”.
1 | [list] |
1 | # Download the target Youbube video. |
The “mp4 -> mp3” converting tip comes from here.
The Youtube video in the command is “Super Mario World 2: Yoshi’s Island OST”.
1 | Super Mario World 2: Yoshi's Island (1995) was developed and published by Nintendo. |
To make Hexo be able to render the math formula written in TeX/LaTeX notation, we need to add the “hexo-filter-mathjax” plugin.
First, update the “pacakge.json” file by adding the following line in the “dependencies” section:
1 | "hexo-filter-mathjax": "^0.9.0", |
Then run “npm install” to install it.
Second, update the “_config.yaml” file to add the corresponding configuration:
1 | mathjax: |
The last step is to add the following “front-matter” line into the post which contains the math formula written in TeX/LaTeX notation:
1 | mathjax: true |
After that in the post you can write the formula like below:
1 | # https://en.wikibooks.org/wiki/LaTeX/Mathematics |
The rendered result looks like:
Done.
]]>DOF = depth of field
u = distance to subject
N = f-Number
c = circle of confusion
f = focal length
The formula comes from Google result.
The method how to write mathematical expressions in markdown format(GitHub style) comes from here.
The “c” values of different camera can be found from the web page here which provides an online DoF calculator implementation. Here are some examples:
1 | <option value="0.005">Nikon Coolpix S8000</option> |
From the list you can see that, for a “full frame(35mm)” cemara the “c” value is “0.030” while for a “APS-C frame” camera the “c” value is “0.020”. These two values cover most of the user scenarios.
]]>TTF is the short form for TrueType font. This is a product of coordinated efforts between Apple and Microsoft in the 1980s. TTF font was created because both Apple and Microsoft had a common goal: create a font that was capable of working across Windows and Mac and could be deciphered by most printers by default.
TTF puts both screen and printer font data in the same file. This makeup simplified the installation of new fonts and acted as an early hybrid platform font format that was compatible with most users’ devices.
OpenType font, abbreviated OTF was also a product of collaboration between Adobe and Microsoft. OTF was also a hybrid creation with display font and printer font data packaged in a single platform.
OTF was designed to enable more functions than TTF. An example being that the former has a format capable of storing as much as 65,000 characters. The ability to keep extra characters besides the usual ones (A-Z, 0-9, punctuations, and symbols) gave designers a platform to add more character to OTF, such as:
When using TTF, these had to be added as extra fonts but using OTF, they are all kept in a single file as the default typeface and can be accessed easily to consumers. Using OTF is a better option when it comes to designing, and it is, therefore, the preferred font by professional designers and hobbyists.
The most significant difference between OTF and TTF for both rookie and professional designers lies in the advanced typesetting programs. Another big difference is that OTF has provisions like glyphs and ligatures that present a designer with multiple options to use.
These extra options are usually not used by non-designers. In simpler terms, OTF is the better of the two where designers are concerned due to the additional features. However, for regular daily computer use, the difference between OTF and TTF is not consequential.
When comparing OTF and TTF, the more robust of the two is the former due to its additional features. OTF is designed with more features to help designers and typesetters have the flexibility they need to make adjustments to a piece and make it look better. For non-designers who use computers for typical day-to-day tasks, the many features added to OTF don’t make a difference since they have no use.
If you have to choose between the two, OTF is the choice to make, but if you cannot access OTF, there is no harm in using TTF.
]]>1 | ~/Library/Fonts> ls -la |
What does the “@” sign here mean? The following answer comes from the post here.
That means the file has Extended file attributes. What is Extended Attribute?
Standard Attributes. For example, creation date, modification date, permission.
Extended Attributes. Stores extra, customizable, small info. For example, author name, file character encoding, short comments, security status.
Resource Fork. Widely used before Mac OS X , can be considered as a more elaborate extended attribute system, and may also hold main data of the file. (See: Mac OS X Resource Fork Tips)
Some related commands are listed below:
1 | # View Extended Attribute with ls. |
What to Put in Extended Attribute? Extended Attributes are name/value pairs. The names are Unicode characters of less than 128 bytes. (they are probably encoded in utf-8 or utf-16) The values can be text or binary, recommended to be less than 4 kibibit.
There’s no standardize structure for names. Anyone can add a attribute named for example “xyz” to a particular file. Apple recommends the use of reverse DNS naming scheme to prevent name clash. This is the same scheme adopted by Java. Example:
1 | com.apple.FinderInfo |
If you have a domain name, such as “example.com” then your attribute name for file of author can be “com.example.author”. If you don’t have a domain name, just make sure the name is not likely used by others.
In some case, if we want to remove all the extended attributes, such as removing the warnings that “the app is not from verified developer”, we can run the following command(from here):
1 | xattr -cr <file_or_dir> |
Source Code Pro: you can download it from here which is part of Google Fonts.
IntelOne Mono: you can download it from here.
Please refer this post.
]]>Let’s say we have the following Scala code which runs properly without any issue.
1 | class Duck { |
The problem happens when I want to refact the code by combining the 3 greeting functions into one:
1 | scala> def greeting(someone: Object): Unit = { |
Scala compiler expects the method “getName()” to be found in the declared type of the given “someone” argument. However the types “Duck/Eagle/Walrus” have no common parent class or interface where the “getName()” method is defined at. In dynamic type languages like “Python/Ruby/JavaScript” this is not an issue since there’s no type checking at compiling time. In static type languages like Java, the “getName()” must be declared at some common parent class or interface which the 3 classes extend or implement. So it seems Scala is one of the static type languages, right? no?
Fortunately, we can do something like below in Scala which doesn’t need to modify the definition of the classes(to add common parent class or interface).
1 | def greeting(someone: Object): Unit = { |
Note the “{def getName: String}” part which plays the trick here. It casts the given instance from the “Object” type to one which has the “getName()” method defined. To me it seems like a placebo to comfort the compiler. Anyway, by doing so the code works as expected. This feature needs “import reflect.Selectable.reflectiveSelectable”. The full code looks like:
1 | import reflect.Selectable.reflectiveSelectable |
Unlike traditional “static typing” languages(like “Java”) or “dynamic typing” languages(like “Python/Ruby/JavaScript”), Scala wants to take advantages from both of them. However, this makes it more complicated than both of them in many scenarios. I think that’s one of the reasons why it’s not very popular nowadays.
]]>The URL is “https://gitlab.com/username/projectname/-/settings/access_tokens“. It seems this token is used in a project only. With this configuation set in service and used in client, the automatic CI pipeline building cannot be triggered properly.
The URL is “https://gitlab.com/-/profile/personal_access_tokens“. this token is used accorss GitLab. With this configuation set in service and used in client, the automatic CI pipeline building CAN be triggered properly.
Please make sure you use the second “personal access token” when you want to push commit to GitLab which is able to trigger the CI build. For example, if your “personal access token” value is “abcdefg”, you should execute the following commands:
1 | # Remove the existing "origin" remote repository. |
First, you can use “drutil”. drutil“ is a command line tool for Mac which interacts with CD/DVD disc, including burn, erase and eject. You can use the following commands to erase your “CD-RW/DVD±RW” discs.
1 | # "drutil" is a powerful tool far more than just erasing disc. You can use |
Second, you can use “Finder” directly. In Finder, right click (or Ctrl + left click) on a “CD-RW/DVD±RW” disc, you will find an option to erase the disc in the contextual menu. Select it to proceed.
]]>1 | # From: https://github.com/scateu/PyWGS84ToGCJ02 |
1 | # Create a directory and run the following command |
Then you should be able to run it such as:
1 | # Indicate the browser application location with the "--browser-executable-path" argument. |
Note that, to run the commands above, you need to have “chrome” or “chromium” installed, and set the application location in the command.
For Firefox, I didn’t get a command to run successfully, even with the web driver. Here is the content I tried.
If you don’t want to use browser, you can use WebDriver instead, such as “geckodriver“. Download it from here. The command looks like below:
1 | npx single-file https://github.com/gildas-lormeau/single-file-cli single-file-cli.html \ |
Download “webdriver-chromium” from here.
1 | npx single-file https://github.com/gildas-lormeau/single-file-cli single-file-cli.html \ |
There is another “libarchive“ pip package written in Python which is a Python wrapper of the C version “libarchive”. You can use this pip package if you want to use Python to manipulate different compression/archive formats.
To install the “libarchive“ Python pip package, you need to install the native C “libarchive” library first if you didn’t have it.
For Debian/Ubuntu:
1 | sudo apt-get install libarchive-dev |
For Mac:
1 | brew install libarchive |
Now for Linux, you can run pip to install the Python “libarchive” pip package:
1 | pip install libarchive |
For Mac, you need one more step to set the “libarchive.dylib” path first, otherwise the installation will fail.
1 | # From: https://github.com/dsoprea/PyEasyArchive/issues/16 |
Now you should be able to use the Python “libarchive” pip package now. For example:
1 | import libarchive.public |
More code samples can be found here.
]]>Erasing a BD-RE, DVD-RW, or CD-RW disc on a Linux system can be as easy as entering one line command using the “wodim“ utility.
1 | # 1. Install. |
“wodim” can also be used to write data to CD/DVD. For example, write an “iso” image file to disc:
1 | # Burn your ISO image to the CD/DVD. |
You can also use “wodim” to write audio CD with the following steps. From here and here.
1 | # 1. Install packages. |
Here is the sample output:
1 | > wodim -v -nofix -eject dev='/dev/sg0' -audio -pad *.wav |
The conclusion is, you don’t need to do anything since this is a feature rather than a problem.
The root cause is Ubuntu’s “phased updates“ feature.
To give the end user a more stable and reliable system, Ubuntu introduced phased updates in 2013.
Whenever a new package update is published, it is rolled out in phases. Only some users get that update initially. Ubuntu then waits for the crash reports generated by the Apport tool.
If it notices significant crash reports for the recently updated package, it will pause the update rollout on the package and work on fixing the issue.
If no significant crash reports are collected, more and more users get that package update, until the update is finally “fully phased” and everyone gets that package update.
When you see ‘xyz package has been kept back’ message, it means that update on xyz package is being phased and your system is not getting it in the present rollout.
If you wait for a few hours or run the system update the next day, you’ll notice that xyz package is now upgradable and some other package has been kept back.
The phase updates were introduced in 2013 but you probably never encountered this ‘package kept back’ issue until recently.
It’s because phased updates were only rolled out through the update-manager tool(The GUI tool “Software Updater”). But this was changed in Ubuntu 21.04 with a new version of APT: “Phased updates” started to roll out through “apt/apt-get” CLI tools as well. So if you updating Ubuntu from a version before “21.04” to “22.04(LTS)”, and you use “apt/apt-get”, you will see this happens recently.
]]>After install Ubuntu 22.04, I found there’s not configuration item is available in “System Settings” to make Ubuntu not go in suspend when lid is closed. Here is the solution.
1 | sudo apt install gnome-tweaks |
Once installed, start the Tweaks application. In the General tab from the sidebar, toggle off the “Suspend when laptop lid is closed” button.
Open “/etc/systemd/logind.conf” and update it’s content:
1 | # Find the following items, uncomment if necessary: |
1 | ffmpeg -i my-video.mov -vcodec h264 -acodec mp2 my-video.mp4 |
If you want to remove some installed pip pacakge, most likely you also want to remove the pip packages it depends and installed with it. Unfortunately, “pip” itself doesn’t provide such option. However, you can still do this with some other useful pip packages, “pipdeptree“ and “pip-autoremove“.
1 | pip install pip-autoremove |
First you can run the following command to check the dependency tree of your current installed pip packages:
1 | pipdeptree |
If you want to remove some pip package and the ones it depends, you can run:
1 | pip-autoremove ndfilter -y |
1 | SLF4J_VERSION = 2.0.+ |
It you do so, the Gradle build will download the latest build of “2.0.X”, let’s say currently it’s “2.0.1”, and use it to build the project.
However as time goes, if the dependency has a newer version like “2.0.2”, be default the Gradle build won’t know that so it will still used the cached local “2.0.1” version dependency to do the build. In this case, how could we force Gradle to get the lastest “2.0.2” vesion to build the project?
The answer comes from here. You can run the following command to force Gradle NOT to use the cache and download the latest dependency before building:
1 | gradle clean build --refresh-dependencies |
1 |
|
If I remove the “response.headers.items()” part, it works although the content type is incorrect. First I think the original “response.headers” is not accepted by the Flask response instance. I print the headers content and it looks like:
1 | {'Date': 'Wed, 21 Sep 2022 10:01:02 GMT', 'Content-Type': 'application/octet-stream', 'Content-Length': '1393351', 'Connection': 'keep-alive', 'vary': 'origin', 'content-encoding': 'gzip', 'x-envoy-upstream-service-time': '22', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains;'} |
It took me a lot of time on it. The turning point came after I printed the length of “response.content” and found the value was “1,581,568”, while the length in header output was “1,393,351”. That made me realize that the length of “response.content” was not the original length of the response of “requests”. I guessed the reason was that the original response of “requests” was gzip content, but after “requests” got the response, it extracted the full content. So if I tried to set the Flask response header with “Content-Length = 1393351”, it doesn’t match the actual size of the response content which was “1581568”. When the browser got such value and found the problem, it refused to save the downloaded content. That’s why the server didn’t report any error, while the browser didn’t download the content successfully. This is confirmed by the official document here.
After that I got the solution “here“ by googling “flask wrapper response”. The post provides the code which fixes the issue exactly.
1 |
|
Note that, the “requests.get()” method is invoked inside “requester_offline_data.request(args)” which sets “stream=True” as the post mentioned.
]]>The solution is simple. Go to “File -> Project Structure -> Project Settings -> Modules”, in the existing default module, select “main”, click the “+ Add Content Root” link. In the pop-up file selector window, select the “
Today after I upgraded an Ubuntu vm from “20.04” to “22.04”, I got the following error when running “apt-get dist-upgrade” in the vm:
1 | The following packages have been kept back: |
To fix this issue, as told in the post above, run the following command to install the package explicitly:
1 | sudo apt-get install <list of packages kept back> |
According to an article on “debian-administration.org“:
]]>If the dependencies have changed on one of the packages you have installed so that a new package must be installed to perform the upgrade then that will be listed as “kept-back”.
Run the “pip install pipenv” command to install the “pipenv” package. Since the new Python “3.10” version doesn’t have this package yet.
Remove the existing virtual environment created by the previous “pipenv” execution, and then run the “pipenv shell” again to regenerate it.
Running “pipenv shell” to enter the virtual environment, then run “pip install …” to install the dependencies. Note that, for the “protobuf“ package, the version number should be set explicitly as “pip install protobuf~=3.19.4”. The reason is that the latest “4.21.x” version “protobuf” package cannot work properly with the auto-generated Python code in the project which was generated by the protoc version “3.9.2”.
Run “pipenv lock” to generate the “Pipfile.lock” file.
Done.
]]>Use the following command to convert the “flac” format audio files into the “mp3” format, with keeping the metadata.
1 | for file in *.flac; do ffmpeg -i $file -ab 320k -map_metadata 0 -id3v2_version 3 ${file:r}.mp3; done |
1 | # 1. List all the branches(both local and remote). |
Let’s check the following code first:
1 | Scanner scanner = null; |
This is a common case when we’re dealing with some resource need to be closed after using it. If you know “with” in Python, you can see that the code above in Java is more verbose than Python. Fortunately, the “try-with-resources” feature, which was introduced in Java 7, allows us to declare resources to be used in a try block with the assurance that the resources will be closed after the execution of that block. For example:
1 | try (Scanner scanner = new Scanner(new File("test.txt"))) { |
Multiple resources are also supported:
1 | try (Scanner scanner = new Scanner(new File("testRead.txt")); |
In Python, you need to make the resource object be a “context manager“ object in order to use it in the “with” statement. Correspondingly, in Java you need to make the resource object be an instance which implements the “Closeable“ or “AutoCloseable“ interface and overrides the “close” method, which will be automatically invoked by the “try-with-resources” feature in Java after it’s used.
]]>1 | int padding = ((size + 3) & ~(3)) - size; |
Here is the answer.
The symbol “&” denotes the bitwise AND operator. It evaluates the binary value of given numbers. The binary result of these numbers will be returned to us in base 10. When the & operator starts its operation, it will evaluate the value of characters in both numbers starting from the left. From “here“.
1 | System.out.println(10 & 12); |
The symbol “~” is unary operator for “Bitwise Complement”. It returns the one’s complement representation of the input value, i.e., with all bits inverted, which means it makes every 0 to 1, and every 1 to 0. From “here“.
1 | a = 5 = 0101 (In Binary) |
The purpose of the original expression is to make it return the following values:
1 | If the last 2 bits is "00", return 0; |
For me a more understandable(less efficient maybe?) expression to get the same result is:
1 | int padding = (4 - size % 4) % 4 |
Not sure how the expression was made and the logic behind it.
]]>[Code] Why “abstract” is added into a method signature which is defined in an interface?
[Code] Why an abstract class is not defined as an interface when every method in it is abstract?
Both of the class files above was created more than 11 years ago.
]]>To make it work, you need some dictionary files as well. For example, this project provides some dictionary files for Chinese.
After install the program, go to “Edit -> Dictionaries -> Sources -> Files”, add the path which contains the dictionary files and check the “Recursive” option, then click the “Rescan now” button. If everything works, the program will import the dictionary files and you’re good to go.
]]>1 | wget http://ftp.us.debian.org/debian/pool/main/n/netselect/netselect_0.3.ds1-29_amd64.deb |
1 | sudo netselect -v -s10 -t20 `wget -q -O- https://launchpad.net/ubuntu/+archivemirrors | grep -P -B8 "statusUP|statusSIX" | grep -o -P "(f|ht)tp://[^\"]*"` |
1 | sudo vi /etc/apt/sources.list |
1 | sudo apt-get update |
1 | # Download and install "single-file-cli". |
By setting ManKier as a search engine in browser, we can easily search Linux commands when browsing web pages. Currently both Firfox and Chrome are supported. For example, we can type “man grep -e” in the browser search bar and open the “grep” command man page in HTML provided by ManKier directly in the browser.
Go to “Settings -> Search”. In the “Search Bar” section, choose “Add search bar in toolbar”.
Open a new tab, go to “https://www.mankier.com“.
Tap the “Add search engine” icon in the search bar and add the “ManKier” item.
Go back to the “Settings -> Search”, in the “Search Shortcuts” section, find the “ManKier” item and add the “man” keyword value.
In the “Search Bar” section, choose “Use the address bar for search and navigation”.
Go to “Settings -> Search engine -> Manage search engines and site search”. In the “Search engines” section, click the “Add” button.
In the pop-up window, set the following content and click “add”:
Search engine: “ManKier”
Shortcut: “man”
URL with %s in place of query: “https://www.mankier.com/?q=%s“
After finishing the settings above, open a browser tab(either Firefox or Chrome), you can type something like “man ps -ef” to get the detailed help information of the target command.
]]>Concise means you take out unnecessary words. For example, write “daily,” not “on a daily basis.”
Terse means you take out too many words. Terseness introduces ambiguity.
This makes me think of ancient Chinese, such as:
民可使由之不可使知之 (《论语泰伯第八》)
Obviously, this statement is terse but not concise.
]]>1 |
|
1 | /* |
The Ubuntu MATE team offers a bespoke images for UMPCs like GPD Pocket. You can download the ISO files here. The direct downloading link for “GPD Pocket” is this.
The hot keys to access the boot menu & BIOS are:
1 | GPD Pocket: "Fn + F7" |
So all you need to do is to download the ISO file, dump it to a flash drive, and install it.
]]>1 | sudo apt-get install tmux |
The default prefix key is “C-b”, which means the “Ctrl key” and “b”. In tmux, modifier keys are shown by prefixing a key with “C-“” for the control key, “M-“ for the meta key (normally Alt on modern computers) and “S-“ for the shift key. These may be combined together, so “C-M-x” means pressing the control key, meta key and “x” together. Use “C-b ?” to show the help keys information.
1 | Ctrl+b d:detach the current session. |
More “pane” and “window” related operations, please check the post here.
]]>]]>By submitting or posting a Submission, You grant Apple (including its partners or licensees) a worldwide, royalty-free, non-exclusive license to use, host, store, distribute, index, transmit, copy, comment on, transform, create derivative works based upon, exhibit, reproduce, modify, adapt, publish, translate, publicly perform, publicly display, make available, communicate to the public and otherwise exploit such Submission without further notice to You, without attribution (to the extent this does not contradict mandatory provisions of applicable law) and without any compensation or obligation to You, for use in or in connection with Apple Maps (including, without limitation, related marketing and promotional materials).
The basic functionality of require is:
it reads a JavaScript file,
executes the file,
and then proceeds to return the exports object. An example module:
1 | console.log("evaluating example.js"); |
So if you run var example = require(‘./example.js’), then example.js will get evaluated and then example be an object equal to:
1 | { |
1 | if (path.startsWith('./')) { |
For more detailed information, see the official docs.
]]>Some more evidences of my guessing:
A “dozen“ equals to 12.
A “gross“ equals to 12 dozens(144).
A “great gross (or grand gross)“ equals to 12 grosses(1728).
A foot equals to 12 inches.
Is it obvious?
Correspondingly, in the Chinese language, since the ones who invented the names of “11/12” were using the “decimal” number system just like us today, for them “11/12” were concepts deriving from “1/2”. For “1/2” were named “一/二”, they named “11/12” as “十一/十二”. As you may already realize, yes, in Chinese “十” means “10”.
]]>To install Google service framework and Google play store, you need to install some apk files. Go to “APKMirror“, search the following keywords and download the 3 apk files for your Android device.
“Google Service Framework”
“Google Play Services”
“Google Play Store”
For each apk, there are multiple versions for different “Architecture/Minimum Version/Screen DPI” combinations. Select them by the following priciples:
1 | { |
1 | # Install. |
The default argument is evaluated at call time. So, unlike (for example) Python, a new object is created each time the function is called.
This is something I didn’t know before. I tested it and that’s true.
1 | def test(x, y = []): |
So I tried searching why this happens and I got some answers here.
It is a feature that pretty much all Python users run into once or twice. The main usage is for caches and the like to avoid repetitive lengthy calculations (simple memoizing, really), although I am sure people have found other uses for it.
The reason for this is that the def statement only gets executed once, which is when the function is defined. Thus the initializer value only gets created once. For a reference type (as opposed to an immutable type which cannot change) like a list or a dictionary, this ends up as a visible and surprising pitfall, whereas for value types, it goes unnoticed.
Usually, people work around it like this:
1 | def test(a=None): |
The key difference between Python and JavaScript is that, for Python expressions in default arguments are calculated when the function is defined, while for JavaScript they’re calculated when the function is called.
]]>The term “global objects” (or standard built-in objects) here is not to be confused with the global object. Here, “global objects” refer to objects in the global scope.
The global object itself can be accessed using the this operator in the global scope. In fact, the global scope consists of the properties of the global object, including inherited properties, if any.
Other objects in the global scope are either created by the user script or provided by the host application. The host objects available in browser contexts are documented in the API reference.
For more information about the distinction between the DOM and core JavaScript, see JavaScript technologies overview.
These global properties return a simple value. They have no properties or methods.
Infinity
NaN
undefined
globalThis
These global functions—functions which are called globally, rather than on an object—directly return their results to the caller.
eval()
👎 uneval()
isFinite()
isNaN()
parseFloat()
parseInt()
encodeURI()
encodeURIComponent()
decodeURI()
decodeURIComponent()
Deprecated
🗑️ escape()
🗑️ unescape()
These are the fundamental, basic objects upon which all other objects are based. This includes general objects, booleans, functions, and symbols.
Object
Function
Boolean
Symbol
Error objects are a special type of fundamental object. They include the basic Error type, as well as several specialized error types.
Omitted.
These are the base objects representing numbers, dates, and mathematical calculations.
Omitted.
These objects represent strings and support manipulating them.
Omitted.
These objects represent collections of data which are ordered by an index value. This includes (typed) arrays and array-like constructs.
Omitted.
These objects represent collections which use keys. The iterable collections (Map and Set) contain elements which are easily iterated in the order of insertion.
Omitted.
These objects represent and interact with structured data buffers and data coded using JavaScript Object Notation (JSON).
Omitted.
Control abstractions can help to structure code, especially async code (without using deeply nested callbacks, for example).
Omitted.
Additions to the ECMAScript core for language-sensitive functionalities.
Omitted.
WebAssembly.Module
WebAssembly.Instance
WebAssembly.Memory
WebAssembly.Table
WebAssembly.CompileError
WebAssembly.LinkError
WebAssembly.RuntimeError