JavaScript类型
关于前端工程师成长,需要两个视角:
- 立足标准,系统性总结和整理前端知识,建立自己的认知和方法论;
- 放眼团队,从业务和工程角度思考前端团队的价值和发展需要。只有这样做,才能够持续发展,在高速发展的技术和工程浪潮中稳稳立足。
两个前端学习方法:
-
建立知识架构
是建立自己的知识架构,并且在这个架构上,不断地进行优化。
-
追本溯源,找到知识的源头。
JavaScript类型
运行时类型是代码实际执行过程中我们用到的类型。所有的类型数据都会属于 7 个类型之一。从变量、参数、返回值到表达式中间结果,任何 JavaScript 代码运行过程中产生的数据,都具有运行时类型。
类型:
JavaScript 语言的每一个值都属于某一种数据类型。 JavaScript 语言规定了 7 种语言类型:
- Undefined;
- Null;
- Boolean;
- String;
- Number;
- Symbol;
- Object。
- Undefined、Null
Undefined 、Null
-
undefined
:未定义,如果一个变量只声明但是未赋值,默认值就是undefinedvar a; console.log ( a );//undefined 变量的值 console.log ( typeof a );//undefined 变量值的数据类型
-
null
:空值 ,null这个值只能手动去设置,一个变量在任何情况下它的值都不会主动是nullvar b = null; console.log ( b );//null console.log ( typeof b );//object 注意:null这个数据类型在使用typeof检测的时候得到object
-
undefined与null的区别:
console.log ( undefined == null );//true 它们的值是一样都是没有值得意思 console.log ( undefined === null );//false 它们的值一样但是数据类型不一样
-
为什么有的编程规范要求用
void 0
代替undefined
?因为 JavaScript 的代码 undefined 是一个变量,而并非是一个关键字,这是 JavaScript 语言公认的设计失误之一,所以,我们为了避免无意中被篡改,我建议使用 void 0 来获取 undefined 值。
Boolean
Boolean 类型有两个值,true
和false
,它用于表示逻辑意义上的真和假,同样有关键字 true 和 false 来表示两个值。
String
String 用于表示文本数据。String 有最大长度是 2^53 - 1,这在一般开发中都是够用的,但是这个所谓最大长度,并不完全是你理解中的字符数。因为 String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt
、charCodeAt
、length
等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。
- JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
- JavaScript 字符串把每个 UTF16 单元当作一个字符来处理,所以处理非 BMP(超出 U+0000 - U+FFFF 范围)的字符时,你应该格外小心。
- JavaScript 这个设计继承自 Java,最新标准中是这样解释的,这样设计是为了“性能和尽可能实现起来简单”。因为现实中很少用到 BMP 之外的字符。
Number
-
JavaScript 中的 Number 类型有
18437736874454810627
(即2^64-2^53+3
) 个值。 -
JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript 为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:
NaN
,占用了9007199254740990
,这原本是符合 IEEE 规则的数字;Infinity
,无穷大;
--Infinity
,负无穷大。
-
JavaScript 中有
+0
和-0
,在加法类运算中它们没有区别,但是除法的场合则需要特别留意区分,“忘记检测除以 -0,而得到负无穷大”的情况经常会导致错误,而区分 +0 和 -0的方式,正是检测1/x
是Infinity 还是 -Infinity。 -
同样根据浮点数的定义,非整数的 Number 类型无法用
==
(===
也不行) 来比较,一段著名的代码,这也正是,为什么在 JavaScript 中,0.1+0.2
不能=0.3
;的原因。console.log( 0.1 + 0.2 == 0.3); //false
所以实际上,这里错误的不是结论,而是比较的方法,正确的比较方法是使用 JavaScript 提供的最小精度值:
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。这段代码结果就是 true 。
Symbol
Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。
Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。
Object
在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。
-
JavaScript 中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:
- Number
- String
- Boolean
- Symbol
所以,我们必须认识到
3
与new Number(3)
是完全不同的值,它们一个是 Number 类型, 一个是对象类型 -
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。
类型转换
- StringToNumber
- NumberToString
- 装箱转换
- 拆箱转换
事实上,“类型”在 JavaScript 中是一个有争议的概念。一方面,标准中规定了运行时数据类型; 另一方面,JS 语言中提供了typeof
这样的运算,用来返回操作
数的类型,但 typeof 的运算结果,与运行时类型的规定有很多不一致的地方。我们可以看下表来对照一下。