重学前端总结
JavaScript
关于类型,有哪些你不知道的细节?
JavaScript 语言的每一个值都属于某一种数据类型。JavaScript 语言规定了 7 种语言类型。语言类型广泛用于变量、函数参数、表达式、函数返回值等场合。根据最新的语言标准,这 7 种语言类型是:
Undefined
、Null
、Boolean
、String
、Number
、Symbol
。(ES2020新增了Bigint
)Object
。
Undefined、Null
任何变量在赋值前是 Undefined
类型、值为 undefined
,一般我们可以用全局变量 undefined
(就是名为 undefined
的这个变量)来表达这个值,或者 void
运算来把任意一个表达式变成 undefined
值。Undefined
跟 Null
有一定的表意差别,Null
表示的是:“定义了但是为空”。所以,在实际编程时,我们一般不会把变量赋值为 undefined
,这样可以保证所有值为 undefined
的变量,都是从未赋值的自然状态。Null
类型也只有一个值,就是 null
,它的语义表示空值,与 undefined
不同,null
是 JavaScript
关键字,所以在任何代码中,你都可以放心用 null
关键字来获取 null
值。
Boolean
Boolean 类型有两个值, true 和 false,它用于表示逻辑意义上的真和假,同样有关键字 true 和 false 来表示两个值。这个类型很简单,我就不做过多介绍了。
String
我们来看看字符串是否有最大长度。String
用于表示文本数据。String
有最大长度是 2^53 - 1,这在一般开发中都是够用的,但是有趣的是,这个所谓最大长度,并不完全是你理解中的字符数。因为 String
的意义并非“字符串”,而是字符串的 UTF16
编码,我们字符串的操作 charAt
、charCodeAt
、length
等方法针对的都是 UTF16
编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。Note:现行的字符集国际标准,字符是以 Unicode
的方式表示的,每一个 Unicode
的码点表示一个字符,理论上,Unicode
的范围是无限的。UTF 是 Unicode
的编码方式,规定了码点在计算机中的表示方法,常见的有 UTF16
和 UTF8。 Unicode
的码点通常用 U+??? 来表示,其中 ??? 是十六进制的码点值。 0-65536(U+0000 - U+FFFF)的码点被称为基本字符区域(BMP)。JavaScript
中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。JavaScript
字符串把每个 UTF16
单元当作一个字符来处理,所以处理非 BMP(超出 U+0000 - U+FFFF 范围)的字符时,你应该格外小心。JavaScript
这个设计继承自 Java,最新标准中是这样解释的,这样设计是为了“性能和尽可能实现起来简单”。因为现实中很少用到 BMP 之外的字符。
Number
下面,我们来说说 Number
类型。Number
类型表示我们通常意义上的“数字”。这个数字大致对应数学中的有理数,当然,在计算机中,我们有一定的精度限制。JavaScript
中的 Number
类型有 18437736874454810627(即 2^64-2^53+3) 个值。JavaScript
中的 Number
类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript
为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;Infinity,无穷大;-Infinity,负无穷大。
根据双精度浮点数的定义,Number
类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,所以 Number
无法精确表示此范围外的整数。同样根据浮点数的定义,非整数的 Number
类型无法用 ==(=== 也不行) 来比较,一段著名的代码,这也正是我们第三题的问题,为什么在 JavaScript
中,0.1+0.2 不能 =0.3:
正确的比较方法是使用 JavaScript
提供的最小精度值:
1 |
|
Symbol
Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。在后面的文章中,我会详细叙述 Symbol 跟对象系统。这里我们只介绍 Symbol 类型本身:它有哪些部分,它表示什么意思,以及如何创建 Symbol 类型。Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。
Object
Object 是 JavaScript 中最复杂的类型,也是 JavaScript 的核心机制之一。Object 表示对象的意思,它是一切有形和无形物体的总称。
在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。
我们必须认识到 3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。
HTML&CSS
浏览器实现原理与API
前端综合应用
极好的Javascript面经
https://github.com/nieyafei/front-end-interview-js
前端面试interview的Js题目收集 https://github.com/jimuyouyou/node-interview-questions
Node.js面试题,侧重后端应用与对Node核心的理解 https://github.com/paddingme/Front-end-Web-Development-Interview-Question
前端开发面试题大收集 https://github.com/huruji/FE-Interview
前端面试题大合集 https://github.com/CyC2018/CS-Notes
技术面试必备基础知识 https://github.com/doocs/coding-interview
代码面试题集 https://zhuanlan.zhihu.com/p/57302141
大厂前端高频面试问题与答案精选 https://juejin.im/post/5c8f30606fb9a070ef60996d
寒冬中的前端社招面试 https://zhuanlan.zhihu.com/p/53703176 Vue问得最多的面试题 https://juejin.im/post/5d13436f6fb9a07eca698ba0
你要的Vue面试题都在这里 https://juejin.im/post/5d153267e51d4510624f9809
vue 220+个知识点(面试题)为你保驾护航 https://juejin.im/entry/5d06ce32e51d4510a50335bd
[译] 送你 43 道 JavaScript 面试题 https://juejin.im/post/5d1d52aff265da1bb2774de0
面试官到底想看什么样的简历? https://github.com/Advanced-Frontend/Daily-Interview-Question/blob/master/datum/summary.md
前端面试题及答案汇总 https://github.com/pwstrick/daily
一份搜集的前端面试题目清单+面试相关的文章 https://segmentfault.com/a/1190000020181662
Vue面试中,经常会被问到的面试题/知识点(2019改进版) https://juejin.im/post/5d7596055188253e4b2f0c29
36 个JS 面试题为你助力金九银十(面试必读) https://github.com/0voice/interview_internal_reference
2019年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总 https://juejin.im/entry/5db1c186518825646b111a4d
2019年最新经典web前端面试题超全面细节 https://q.shanyue.tech/fe/ 前端面试题小记 https://q.shanyue.tech/interview.html
前端大厂面经大全集 https://q.shanyue.tech/base/
计算机基础面试题小计 https://fecommunity.github.io/front-end-interview/
前端工程师面试宝典 https://juejin.im/post/6893856813247266823