这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
知道你对JavaScript的类型很熟了,那以下几个关于类型的问题你能答出几个呢?
- String字符串有最大长度吗?
- 0.1+0.2 == 0.3 是否正确?
- 3和Number(3)是否相同?3和new Number(3)又是否相同?
- typeof null 得到的是什么?
…
快到文中找答案吧!
前言
JavaScript语言规定了以下7种语言类型,JavaScript语言的每一个值都属于某一种数据类型。
基本类型
-
Undefined;
-
Null;
-
Boolean;
-
String;
-
Number;
-
Symbol;(ES6新加)
引用类型
- Object。
Undefined 类型
Undefined 类型表示未定义
- 它只有一个值undefined
- 任何变量在赋值前是 Undefined 类型、值为 undefined
- undefined是运行时创建的一个全局变量,并非JavaScript的关键字
在es5之后undefined这个全局变量已经变成了read-only了,在开头直接写undefined = 123 或 var undefined = 12 并不会生效(除非是老旧浏览器),但如果是node环境下,或者局部作用域下,用var undefined = 123或let undefined = 123重新声明一个undefined全局变量则是允许的
Null 类型
Null 表示的是:“定义了但是为空”,它的语义表示空值。
-
Null 类型也只有一个值,就是 null
-
Null是JavaScript关键字
-
可以通过将变量的值赋值为null将其清空
Boolean 类型
Boolean 类型用于表示逻辑意义上的【真和假】,有关键字 true 和 false 来表示两个值。
String 类型
String 用于表示文本数据。
问:String字符串有最大长度吗?
『答』
String 有最长长度,且长度不是视觉上的返回的字符长度,而是字符串 UTF16 编码码点的长度,String的最大长度是 2^53 – 1。
『注1』
String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt、charCodeAt、length 等方法针对的都是 UTF16 编码。
let a = '?';
a.length
复制代码
『注2』
JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
比如:let a = ‘Axjy’, 你没办法将它变为’Bxjy’,除非重新赋值;
Number 类型
Number 类型表示我们通常意义上的“数字”。JavaScript 中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “双精度浮点数” 来表示一个数字,不区分整数和浮点数 。
问:0.1+0.2 == 0.3 是否正确?
『答』
我们可以看上0.1+0.2 == 0.3
,结果得到的是false,说明它们是不相等的,这是【浮点运算】的特点;
【浮点数运算的精度问题】导致等式左右的结果并不是严格相等,而是相差了个微小的值。
【浮点数运算精度问题】的原因是什么?
『答』
因为我们输入的是十进制的数,但是电脑会把它转为二进制运算,计算完之后再转回十进制,在转化的过程中出现了精度丢失。
任何使用二进制浮点数的编程语言都会有这个问题,只不过因为JavaScript是一门弱类型语言,所以进度误差的问题显得格外突出。
“0.1 + 0.2” 在计算机里的计算过程如下:
特定数值
-
Infinity 代表数学上的无穷大。
-
NaN(非数字)是不正确或未定义的数学运算的结果。
Symbol 类型
Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合。
问:以下代码输出结果是什么?
let A = Symbol("Axjy");let B = Symbol("Axjy");
console.log(A == B) Or console.log(A === B)
复制代码
『答』
不论哪种都是false
,Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。
Object类型
Object 是 JavaScript 中最复杂的类型,也是 JavaScript 的核心机制之一。Object 表示对象的意思,它是一切有形和无形物体的总称。
问:3和Number(3)是否相同?3和new Number(3)又是否相同?
?
?
?
?
?
?
?
?
『答』
3和Number(3)相同;3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生【对象】,当直接调用时,它们表示【强制类型转换】。
其他
关于判断类型
JavaScript 语言中提供了 typeof 这样的运算,用来返回操作数的类型,但 typeof 的运算结果,与运行时类型的规定有的时候并不一致
『注意』
object——Null 和 function——Object
结语
以上如果有错误的地方,请在评论区中指出!?
参考:
ECMAScript Language Specification
小可爱看完点个赞再走吧!?