mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-09-11 05:03:46 +08:00
57 lines
58 KiB
HTML
57 lines
58 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>ZiuChen</title>
|
||
<meta name="description" content="Unlimited Progress.">
|
||
<meta name="generator" content="VitePress v1.2.2">
|
||
<link rel="preload stylesheet" href="/assets/style.Bk0YqIhq.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.CpgDeAkr.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.Cipf4DbI.js">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.D74JC_TU.js">
|
||
<link rel="modulepreload" href="/assets/article_深入JavaScript数据类型.md.RffYyOqr.lean.js">
|
||
<link rel="icon" href="/logo.png">
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="Layout" data-v-21197ea5><!--[--><!--]--><!--[--><span tabindex="-1" data-v-a12e58e7></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-a12e58e7> Skip to content </a><!--]--><!----><header class="VPNav" data-v-21197ea5 data-v-ae422df0><div class="VPNavBar has-sidebar top" data-v-ae422df0 data-v-5b006e28><div class="wrapper" data-v-5b006e28><div class="container" data-v-5b006e28><div class="title" data-v-5b006e28><div class="VPNavBarTitle has-sidebar" data-v-5b006e28 data-v-7e7df463><a class="title" href="/" data-v-7e7df463><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.png" alt data-v-08e3c15f><!--]--><span data-v-7e7df463>ZiuChen</span><!--[--><!--]--></a></div></div><div class="content" data-v-5b006e28><div class="content-body" data-v-5b006e28><!--[--><!--]--><div class="VPNavBarSearch search" data-v-5b006e28><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-5b006e28 data-v-2500ceaa><span id="main-nav-aria-label" class="visually-hidden" data-v-2500ceaa>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-2500ceaa data-v-298f5c94><!--[--><span data-v-298f5c94>首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-2500ceaa data-v-dbddcd3c><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-dbddcd3c><span class="text" data-v-dbddcd3c><!----><span data-v-dbddcd3c>我的项目</span><span class="vpi-chevron-down text-icon" data-v-dbddcd3c></span></span></button><div class="menu" data-v-dbddcd3c><div class="VPMenu" data-v-dbddcd3c data-v-aabc2c8a><div class="items" data-v-aabc2c8a><!--[--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/project/ClipboardManager/" data-v-42e91a02><!--[-->超级剪贴板<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/project/Markdown/" data-v-42e91a02><!--[-->超级Markdown<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/project/JSRunner/" data-v-42e91a02><!--[-->超级JavaScript<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/project/SmartWordBreak/" data-v-42e91a02><!--[-->超级分词<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-2500ceaa data-v-dbddcd3c><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-dbddcd3c><span class="text" data-v-dbddcd3c><!----><span data-v-dbddcd3c>开源作品</span><span class="vpi-chevron-down text-icon" data-v-dbddcd3c></span></span></button><div class="menu" data-v-dbddcd3c><div class="VPMenu" data-v-dbddcd3c data-v-aabc2c8a><div class="items" data-v-aabc2c8a><!--[--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/works/opensource.html" data-v-42e91a02><!--[-->个人作品<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/works/contribution.html" data-v-42e91a02><!--[-->社区贡献<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-2500ceaa data-v-dbddcd3c><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-dbddcd3c><span class="text" data-v-dbddcd3c><!----><span data-v-dbddcd3c>学习笔记</span><span class="vpi-chevron-down text-icon" data-v-dbddcd3c></span></span></button><div class="menu" data-v-dbddcd3c><div class="VPMenu" data-v-dbddcd3c data-v-aabc2c8a><div class="items" data-v-aabc2c8a><!--[--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/JavaScript.html" data-v-42e91a02><!--[-->JavaScript基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/CSS.html" data-v-42e91a02><!--[-->CSS基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/JavaScriptEnhanced.html" data-v-42e91a02><!--[-->JavaScript进阶<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/Front-end%20Engineering.html" data-v-42e91a02><!--[-->前端工程化<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/SSR.html" data-v-42e91a02><!--[-->服务端渲染<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/React.html" data-v-42e91a02><!--[-->React基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/React%20Hooks.html" data-v-42e91a02><!--[-->React Hooks<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/Redux.html" data-v-42e91a02><!--[-->Redux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/React%20Router.html" data-v-42e91a02><!--[-->React Router<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/MySQL.html" data-v-42e91a02><!--[-->MySQL<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-aabc2c8a data-v-42e91a02><a class="VPLink link" href="/note/Rust.html" data-v-42e91a02><!--[-->Rust<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/self/" tabindex="0" data-v-2500ceaa data-v-298f5c94><!--[--><span data-v-298f5c94>个人介绍</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-5b006e28 data-v-40b30d5f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-40b30d5f data-v-72fccd06 data-v-ff4f6660><span class="check" data-v-ff4f6660><span class="icon" data-v-ff4f6660><!--[--><span class="vpi-sun sun" data-v-72fccd06></span><span class="vpi-moon moon" data-v-72fccd06></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-5b006e28 data-v-4a8ef5f7 data-v-b13ebc2d><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-b13ebc2d data-v-d1dac51e><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-b13ebc2d data-v-d1dac51e><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-5b006e28 data-v-1789b134 data-v-dbddcd3c><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-dbddcd3c><span class="vpi-more-horizontal icon" data-v-dbddcd3c></span></button><div class="menu" data-v-dbddcd3c><div class="VPMenu" data-v-dbddcd3c data-v-aabc2c8a><!----><!--[--><!--[--><!----><div class="group" data-v-1789b134><div class="item appearance" data-v-1789b134><p class="label" data-v-1789b134>Appearance</p><div class="appearance-action" data-v-1789b134><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-1789b134 data-v-72fccd06 data-v-ff4f6660><span class="check" data-v-ff4f6660><span class="icon" data-v-ff4f6660><!--[--><span class="vpi-sun sun" data-v-72fccd06></span><span class="vpi-moon moon" data-v-72fccd06></span><!--]--></span></span></button></div></div></div><div class="group" data-v-1789b134><div class="item social-links" data-v-1789b134><div class="VPSocialLinks social-links-list" data-v-1789b134 data-v-b13ebc2d><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-b13ebc2d data-v-d1dac51e><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-b13ebc2d data-v-d1dac51e><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-5b006e28 data-v-88b67501><span class="container" data-v-88b67501><span class="top" data-v-88b67501></span><span class="middle" data-v-88b67501></span><span class="bottom" data-v-88b67501></span></span></button></div></div></div></div><div class="divider" data-v-5b006e28><div class="divider-line" data-v-5b006e28></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-21197ea5 data-v-4f27ebf5><div class="container" data-v-4f27ebf5><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-4f27ebf5><span class="vpi-align-left menu-icon" data-v-4f27ebf5></span><span class="menu-text" data-v-4f27ebf5>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-4f27ebf5 data-v-edf9ff28><button data-v-edf9ff28>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-21197ea5 data-v-1fa42293><div class="curtain" data-v-1fa42293></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-1fa42293><span class="visually-hidden" id="sidebar-aria-label" data-v-1fa42293> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-1fa42293><section class="VPSidebarItem level-0" data-v-1fa42293 data-v-e96c2f33><div class="item" role="button" tabindex="0" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><h2 class="text" data-v-e96c2f33>我的项目</h2><!----></div><div class="items" data-v-e96c2f33><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/project/ClipboardManager/" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>超级剪贴板</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/project/Markdown/" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>超级Markdown</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/project/JSRunner/" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>超级JavaScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/project/SmartWordBreak/" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>超级分词</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-1fa42293><section class="VPSidebarItem level-0 collapsible collapsed" data-v-1fa42293 data-v-e96c2f33><div class="item" role="button" tabindex="0" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><h2 class="text" data-v-e96c2f33>开源作品</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e96c2f33><span class="vpi-chevron-right caret-icon" data-v-e96c2f33></span></div></div><div class="items" data-v-e96c2f33><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/works/opensource.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>个人作品</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/works/contribution.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>社区贡献</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-1fa42293><section class="VPSidebarItem level-0 collapsible has-active" data-v-1fa42293 data-v-e96c2f33><div class="item" role="button" tabindex="0" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><h2 class="text" data-v-e96c2f33>文章归档</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e96c2f33><span class="vpi-chevron-right caret-icon" data-v-e96c2f33></span></div></div><div class="items" data-v-e96c2f33><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E3%80%902023%E3%80%91%E9%9D%92%E8%AE%AD%E8%90%A5%20-%20%E5%89%8D%E7%AB%AF%E7%BB%83%E4%B9%A0%E9%A2%98%E6%B1%87%E6%80%BB%E8%A7%A3%E6%9E%90.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>【2023】青训营 - 前端练习题汇总解析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E3%80%90%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>【字节跳动】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E3%80%90%E5%BF%AB%E6%89%8B%E3%80%91%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>【快手】深入理解前端面试题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E3%80%90%E7%94%A8%E5%8F%8B%E9%87%91%E8%9E%8D%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>【用友金融】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BA%8B%E4%BB%B6%E5%86%92%E6%B3%A1%E4%B8%8E%E4%BA%8B%E4%BB%B6%E6%8D%95%E8%8E%B7.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>一文读懂事件冒泡与事件捕获</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BC%AA%E7%B1%BB%E4%B8%8E%E4%BC%AA%E5%85%83%E7%B4%A0.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>一文读懂伪类与伪元素</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E5%87%BD%E6%95%B0%E4%B8%ADthis%E6%8C%87%E5%90%91%E9%97%AE%E9%A2%98.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>一文读懂函数中this指向问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E4%BB%8E0%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%B9%B4%E5%BA%A6%E6%8A%A5%E5%91%8A.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>从0实现一个年度报告</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%95%B0%E6%8D%AE%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6%E3%80%81%E5%AD%98%E5%82%A8%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>彻底搞懂对象的数据属性描述符、存储属性描述符</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B5%85%E6%9E%90defineProperty%E4%B8%8EProxy%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>浅析defineProperty与Proxy实现的双向绑定</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5JavaScript%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>深入JavaScript数据类型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5Vue3%E6%BA%90%E7%A0%81%EF%BC%8C%E7%9C%8B%E7%9C%8BVue.use%E5%90%8E%E7%A9%B6%E7%AB%9F%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>深入Vue3源码,看看Vue.use后究竟发生了什么?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Proxy%E4%B8%8EReflect.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>深入理解Proxy与Reflect</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>深入理解浏览器缓存机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e96c2f33 data-v-e96c2f33><div class="item" data-v-e96c2f33><div class="indicator" data-v-e96c2f33></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86.html" data-v-e96c2f33><!--[--><p class="text" data-v-e96c2f33>深入理解浏览器运行原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-21197ea5 data-v-f1f2fe3a><div class="VPDoc has-sidebar has-aside" data-v-f1f2fe3a data-v-68dddeb0><!--[--><!--]--><div class="container" data-v-68dddeb0><div class="aside" data-v-68dddeb0><div class="aside-curtain" data-v-68dddeb0></div><div class="aside-container" data-v-68dddeb0><div class="aside-content" data-v-68dddeb0><div class="VPDocAside" data-v-68dddeb0 data-v-a0d61c69><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-a0d61c69 data-v-6b6b3b01><div class="content" data-v-6b6b3b01><div class="outline-marker" data-v-6b6b3b01></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-6b6b3b01>On this page</div><ul class="VPDocOutlineItem root" data-v-6b6b3b01 data-v-e1f04456><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-a0d61c69></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-68dddeb0><div class="content-container" data-v-68dddeb0><!--[--><!--]--><main class="main" data-v-68dddeb0><div style="position:relative;" class="vp-doc _article_%E6%B7%B1%E5%85%A5JavaScript%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B" data-v-68dddeb0><div><h2 id="深入javascript数据类型" tabindex="-1">深入JavaScript数据类型 <a class="header-anchor" href="#深入javascript数据类型" aria-label="Permalink to "深入JavaScript数据类型""></a></h2><p>JavaScript包含以下几种数据类型:</p><ul><li>Number 数字</li><li>String 字符串</li><li>Boolean 布尔值</li><li>Symbol 符号 (ES6新增)</li><li>Object 对象 <ul><li>Function 函数</li><li>Array 数组</li><li>Date 日期</li><li>RegExp 正则表达式</li><li>...</li></ul></li><li>null 空</li><li>undefined 未定义</li></ul><p>从语言底层值的可变与不可变,可以将JS中的数据分为两种:不可变值(原始类型)和可变值(引用类型)</p><p>除了Object及继承自Object的特殊对象,其他的类型都为<strong>原始类型</strong>。</p><h2 id="typeof运算符" tabindex="-1">typeof运算符 <a class="header-anchor" href="#typeof运算符" aria-label="Permalink to "typeof运算符""></a></h2><p>除了null,所有<strong>原始类型</strong>都可以通过<code>typeof</code>运算符得到不同的结果</p><p>而null与object通过<code>typeof</code>运算符得到的结果都为<code>'object'</code></p><div class="language-javascript vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 除了 null 其他原始类型的变量都可以通过 typeof 得到其类型</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 而 null 与 object 通过 typeof 运算得到的都是 'object'</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> targets</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Ziu'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Symbol</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">), {}, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> targets) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> t) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// number string boolean symbol object object undefined</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="typeof-null-object" tabindex="-1"><code>typeof null === 'object'</code> <a class="header-anchor" href="#typeof-null-object" aria-label="Permalink to "`typeof null === 'object'`""></a></h3><p>这里援引MDN的解释:</p><blockquote><p>在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。</p><p>由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 "object"。</p></blockquote><h3 id="关于new操作符" tabindex="-1">关于new操作符 <a class="header-anchor" href="#关于new操作符" aria-label="Permalink to "关于new操作符""></a></h3><p>所有使用 new 操作符调用的构造函数,都将返回非基本类型(object 或 function)</p><ul><li>大多数返回的是一个对象,即 <code>object</code></li><li>而构造函数Function返回的是 <code>function</code></li></ul><div class="language-javascript vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 针对普通构造函数</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Ziu'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> num</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> str) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 'object'</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> num) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 'object'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 针对 Function 构造函数</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> fun</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> fun) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 'function'</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h3 id="字符串原始值和字符串对象" tabindex="-1">字符串原始值和字符串对象 <a class="header-anchor" href="#字符串原始值和字符串对象" aria-label="Permalink to "字符串原始值和字符串对象""></a></h3><p>typeof 操作符区分 <code>String</code> 对象和原始字符串值:</p><div class="language-javascript vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> s1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ''</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> s2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> s3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(s1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// false</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(s2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// true</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(s3 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// false</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>通过new操作符创建的是一个对象,它将被添加到原型链上(详见new一个对象时发生了什么)</p><p>而直接调用 String 函数,返回的是一个字符串原始值,本质上 <code>s3</code> 和 <code>s1</code> 是相同的</p><p>而<code>s1</code>变量自创建之初,就是原始类型,没有挂载到原型链上,自然也就无法通过<code>instanceof</code>检查一个对象</p><p>而之所以能够在<code>s1</code>上调用字符串的方法,是因为<strong>包装类型</strong>(见下文)</p><blockquote><p>instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。</p><p>在本例中,instanceof用于检查s1变量的原型链上,是否包含构造函数String的显式原型(String.prototype),即:s1是否由String创建</p></blockquote><h2 id="包装类型" tabindex="-1">包装类型 <a class="header-anchor" href="#包装类型" aria-label="Permalink to "包装类型""></a></h2><p>除了null和undefined,所有<strong>原始类型</strong>都有其相应的<strong>对象包装类型</strong>,例如<code>18</code>的对象包装类型是<code>Number</code>,而<code>'Ziu'</code>的对象包装类是<code>String</code></p><p>这为处理原始值提供可用的方法,例如,<code>Number</code>对象提供了<code>toFixed()</code>这样的方法。</p><p>当我们在原始值上访问属性时,JavaScript会<strong>自动将值包装到相应的包装对象中</strong>,并访问对象上的属性:</p><div class="language-javascript vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">18.8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toFixed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// '19'</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Ziu'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toUpperCase</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 'ZIU'</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h2 id="使用tostring检查对象类型" tabindex="-1">使用toString检查对象类型 <a class="header-anchor" href="#使用tostring检查对象类型" aria-label="Permalink to "使用toString检查对象类型""></a></h2><p>由Object派生的每个特殊对象类型都有 <code>toString</code> 方法,而且他们都被不同程度的改写:</p><div class="language-javascript vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 注意,不应当在null或undefined上调用任何方法,这将抛出错误,因为他们没有对应任何包装类型</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> targets</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">18</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Ziu'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Symbol</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">), {}, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()]</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> targets) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(t.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">toString</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// '18' 'Ziu' 'true' 'Symbol()' '[object Object]' Sat Feb 18 2023 20:49:31 GMT+0800 (GMT+08:00)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>这个 <code>toString</code> 方法定义在 Object.prototype 上,被其他特殊对象类型所继承。</p><ul><li>如果我们直接调用 <code>Object.prototype.toString()</code> 那么得到的是 <code>[object Object]</code> 因为这是在Object上调用得到的结果</li><li>如果我们在各自不同的对象上调用 <code>toString</code> ,得到的是不同对象改写后的结果</li></ul><p>因为Object是所有子类的父类,所以任何类型的对象都可以通过this绑定的方式,调用<code>Object.prototype.toString()</code>方法,返回该对象的类型的字符串表示</p><p>这也是大多数情况下判断对象类型的方法:</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> classof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">target</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">prototype</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.toString.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">call</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(target) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// [object xxx]</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> res.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">slice</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">classof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({})) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Object</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="核心原理" tabindex="-1">核心原理 <a class="header-anchor" href="#核心原理" aria-label="Permalink to "核心原理""></a></h3><p><a href="https://juejin.cn/post/6844903477940846600" target="_blank" rel="noreferrer">深入Object.prototype.toString</a></p><p>参考ECMA6规范文档:<a href="https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.prototype.tostring" target="_blank" rel="noreferrer">Object.prototype.toString()</a></p><h4 id="es5标准下-object-prototype-tostring-执行原理" tabindex="-1">ES5标准下 <code>Object.prototype.toString</code> 执行原理 <a class="header-anchor" href="#es5标准下-object-prototype-tostring-执行原理" aria-label="Permalink to "ES5标准下 `Object.prototype.toString` 执行原理""></a></h4><ul><li>如果 <code>this</code> 是 <code>undefined</code><ul><li>返回 <code>[object Undefined]</code></li></ul></li><li>如果 <code>this</code> 是 <code>null </code><ul><li>返回 <code>[object Null]</code></li></ul></li><li>令 <code>O</code> 为以 <code>this</code> 作为参数调用 <code>ToObject</code> 的结果</li><li>令 <code>class</code> 为 <code>O</code> 的内部属性 <code>[[Class]]</code> 的值</li><li>返回三个字符串 <code>"[object"</code> <code>class</code> 以及 <code>"]"</code> 拼接而成的字符串。</li></ul><h4 id="es6标准下-object-prototype-tostring-执行原理" tabindex="-1">ES6标准下 <code>Object.prototype.toString</code> 执行原理 <a class="header-anchor" href="#es6标准下-object-prototype-tostring-执行原理" aria-label="Permalink to "ES6标准下 `Object.prototype.toString` 执行原理""></a></h4><p><code>Object.prototype.toString()</code>被调用时,会进行如下步骤:</p><p><img src="/assets/Object.prototype.toString.CjFLIGI9.png" alt="Object.prototype.toString()" loading="lazy"></p><p>在ES6里,之前的内部属性 <code>[[Class]]</code> 不再使用,取而代之的是一系列的 internal slot</p></div></div></main><footer class="VPDocFooter" data-v-68dddeb0 data-v-0070d511><!--[--><!--]--><div class="edit-info" data-v-0070d511><div class="edit-link" data-v-0070d511><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/article/深入JavaScript数据类型.md" target="_blank" rel="noreferrer" data-v-0070d511><!--[--><span class="vpi-square-pen edit-link-icon" data-v-0070d511></span> Edit this page on GitHub<!--]--></a></div><div class="last-updated" data-v-0070d511><p class="VPLastUpdated" data-v-0070d511 data-v-c8f23e1a>Updated Date: <time datetime="2024-06-02T08:25:35.000Z" data-v-c8f23e1a></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-0070d511><span class="visually-hidden" id="doc-footer-aria-label" data-v-0070d511>Pager</span><div class="pager" data-v-0070d511><a class="VPLink link pager-link prev" href="/article/%E6%B5%85%E6%9E%90defineProperty%E4%B8%8EProxy%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A.html" data-v-0070d511><!--[--><span class="desc" data-v-0070d511>Previous page</span><span class="title" data-v-0070d511>浅析defineProperty与Proxy实现的双向绑定</span><!--]--></a></div><div class="pager" data-v-0070d511><a class="VPLink link pager-link next" href="/article/%E6%B7%B1%E5%85%A5Vue3%E6%BA%90%E7%A0%81%EF%BC%8C%E7%9C%8B%E7%9C%8BVue.use%E5%90%8E%E7%A9%B6%E7%AB%9F%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.html" data-v-0070d511><!--[--><span class="desc" data-v-0070d511>Next page</span><span class="title" data-v-0070d511>深入Vue3源码,看看Vue.use后究竟发生了什么?</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-21197ea5 data-v-885c3058><div class="container" data-v-885c3058><p class="message" data-v-885c3058>Released under the MIT License.</p><p class="copyright" data-v-885c3058>Copyright © 2022-PRESENT ZiuChen</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"article_【字节跳动】前端面试题总结.md\":\"DIhQ96FX\",\"article_【2023】青训营 - 前端练习题汇总解析.md\":\"CvvxGgzf\",\"note_javascript.md\":\"pmoQIavt\",\"article_深入javascript数据类型.md\":\"RffYyOqr\",\"index.md\":\"BVWvAWqB\",\"demos_promiseify-post-message_index.md\":\"CtLJLYW5\",\"article_彻底搞懂对象的数据属性描述符、存储属性描述符.md\":\"DyCx02Jx\",\"article_深入理解浏览器运行原理.md\":\"DnXkGWzL\",\"note_react router.md\":\"DEkUw9Ez\",\"note_css.md\":\"DjCR2_2c\",\"article_深入vue3源码,看看vue.use后究竟发生了什么?.md\":\"CilA_DAB\",\"article_深入理解浏览器缓存机制.md\":\"CtUf-n8a\",\"article_一文读懂事件冒泡与事件捕获.md\":\"CYqO1e2o\",\"note_ssr.md\":\"C2mAXuGP\",\"project_clipboardmanager_log_index.md\":\"Xzx78kOu\",\"project_markdown_index.md\":\"BxrUv1hp\",\"article_一文读懂伪类与伪元素.md\":\"CoJ5W-5S\",\"project_clipboardmanager_guide_index.md\":\"B3JoPm0P\",\"project_clipboardmanager_statement_index.md\":\"BrtlAoBb\",\"article_【快手】深入理解前端面试题.md\":\"ki87wz3Y\",\"project_smartwordbreak_index.md\":\"CKwEmU84\",\"self_index.md\":\"CdApvAcI\",\"project_smartwordbreak_statement_index.md\":\"efveKlHc\",\"works_contribution.md\":\"CQyFJhhe\",\"demos_promiseify-post-message_inner.md\":\"p9EPFtdS\",\"article_【用友金融】前端面试题总结.md\":\"C8TnguDb\",\"article_一文读懂函数中this指向问题.md\":\"D7S4SwAY\",\"note_front-end engineering.md\":\"DC1Nn-em\",\"article_浅析defineproperty与proxy实现的双向绑定.md\":\"DSJ0oroN\",\"note_react hooks.md\":\"Bdo4ISRQ\",\"project_markdown_shortcut_index.md\":\"-uOwjn8x\",\"article_深入理解proxy与reflect.md\":\"lAR8g36B\",\"article_从0实现一个年度报告.md\":\"BaLQLzth\",\"project_clipboardmanager_index.md\":\"DsKLuy7N\",\"project_markdown_log_index.md\":\"NIFQe6tg\",\"project_jsrunner_log_index.md\":\"BZY8S9x3\",\"project_jsrunner_index.md\":\"B9OKmcBw\",\"works_opensource.md\":\"DLEDao51\",\"note_mysql.md\":\"CjnNdv04\",\"project_smartwordbreak_log_index.md\":\"CsliAGK2\",\"note_rust.md\":\"B5lY1C3s\",\"note_react.md\":\"CJtLy_c7\",\"note_javascriptenhanced.md\":\"BBtwHR65\",\"note_redux.md\":\"Xi5YKuLE\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"ZiuChen\",\"description\":\"Unlimited Progress.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"学习笔记\",\"items\":[{\"text\":\"JavaScript基础\",\"link\":\"/note/JavaScript\"},{\"text\":\"CSS基础\",\"link\":\"/note/CSS\"},{\"text\":\"JavaScript进阶\",\"link\":\"/note/JavaScriptEnhanced\"},{\"text\":\"前端工程化\",\"link\":\"/note/Front-end Engineering\"},{\"text\":\"服务端渲染\",\"link\":\"/note/SSR\"},{\"text\":\"React基础\",\"link\":\"/note/React\"},{\"text\":\"React Hooks\",\"link\":\"/note/React Hooks\"},{\"text\":\"Redux\",\"link\":\"/note/Redux\"},{\"text\":\"React Router\",\"link\":\"/note/React Router\"},{\"text\":\"MySQL\",\"link\":\"/note/MySQL\"},{\"text\":\"Rust\",\"link\":\"/note/Rust\"}]},{\"text\":\"个人介绍\",\"link\":\"/self/\"}],\"sidebar\":[{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"collapsed\":true,\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"文章归档\",\"collapsed\":true,\"items\":[{\"text\":\"【2023】青训营 - 前端练习题汇总解析\",\"link\":\"/article/【2023】青训营 - 前端练习题汇总解析.md\"},{\"text\":\"【字节跳动】前端面试题总结\",\"link\":\"/article/【字节跳动】前端面试题总结.md\"},{\"text\":\"【快手】深入理解前端面试题\",\"link\":\"/article/【快手】深入理解前端面试题.md\"},{\"text\":\"【用友金融】前端面试题总结\",\"link\":\"/article/【用友金融】前端面试题总结.md\"},{\"text\":\"一文读懂事件冒泡与事件捕获\",\"link\":\"/article/一文读懂事件冒泡与事件捕获.md\"},{\"text\":\"一文读懂伪类与伪元素\",\"link\":\"/article/一文读懂伪类与伪元素.md\"},{\"text\":\"一文读懂函数中this指向问题\",\"link\":\"/article/一文读懂函数中this指向问题.md\"},{\"text\":\"从0实现一个年度报告\",\"link\":\"/article/从0实现一个年度报告.md\"},{\"text\":\"彻底搞懂对象的数据属性描述符、存储属性描述符\",\"link\":\"/article/彻底搞懂对象的数据属性描述符、存储属性描述符.md\"},{\"text\":\"浅析defineProperty与Proxy实现的双向绑定\",\"link\":\"/article/浅析defineProperty与Proxy实现的双向绑定.md\"},{\"text\":\"深入JavaScript数据类型\",\"link\":\"/article/深入JavaScript数据类型.md\"},{\"text\":\"深入Vue3源码,看看Vue.use后究竟发生了什么?\",\"link\":\"/article/深入Vue3源码,看看Vue.use后究竟发生了什么?.md\"},{\"text\":\"深入理解Proxy与Reflect\",\"link\":\"/article/深入理解Proxy与Reflect.md\"},{\"text\":\"深入理解浏览器缓存机制\",\"link\":\"/article/深入理解浏览器缓存机制.md\"},{\"text\":\"深入理解浏览器运行原理\",\"link\":\"/article/深入理解浏览器运行原理.md\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/ZiuChen\"},{\"icon\":{\"svg\":\"<svg width=\\\"36\\\" height=\\\"28\\\" viewBox=\\\"0 0 36 28\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z\\\" fill=\\\"#1E80FF\\\"/></svg>\"},\"link\":\"https://juejin.cn/user/1887205216238477\"}],\"editLink\":{\"pattern\":\"https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright © 2022-PRESENT ZiuChen\"},\"lastUpdatedText\":\"Updated Date\",\"search\":{\"provider\":\"algolia\",\"options\":{\"appId\":\"LFZ2CPWWUG\",\"apiKey\":\"b4fd296ea5e467b3ac4a582160ff3122\",\"indexName\":\"ziuchenio\"}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||
|
||
</body>
|
||
</html> |