细读 JS | 数据类型详解
今天又又又...又整理了一下,那些 JavaScript 里不清不楚的知识点。
一、数据类型的分类
截止发文日期,ECMAScript 标准的数据类型仅有 8 种(ECMAScript Language Types)。可以分为两类:
- 原始类型(Primitives),我们也称作基本数据类型。
- Undefined
- Null(一种特殊的原始类型,
typeof(instance) === 'object'
) - Boolean
- String
- Symbol(
typeof(instance) === 'symbol'
) - Number
- BigInt(
typeof(instance) === 'bigint'
)
- 引用类型(Objects)
- Object(包括从 Object 派生出来的结构类型,如 Object、Array、Map、Set、Date 等)
关于使用
typeof
判断以上数据类型的话题,老生常谈了。例如,为什么typeof null === 'object'
、typeof(() => {}) === 'function'
呢?这里不展开赘述了,请移步:JavaScript 的迷惑行为大赏。
原始类型的比较的是值,只有两者的值相等,那么它们被认为是相等的,否则不相等。而引用类型比较的是地址,当两者的标识符同时指向内存的同一个地址,则被认为是相等的,否则不相等。
console.log({} == {}) // false console.log([] == []) // false
二、原始类型与原始值
所有基本类型的值(即原始值,Primitive Values)都是不可改变(immutable)的,而且不含任何属性和方法的。
到这里可能会有小伙伴打问号了???
Q1:原始类型与原始值有什么区别?
原始类型的值称为原始值。例如原始类型 Boolean 有两个(原始)值
true
和false
。同样的原始类型 Undefined(Null),只有一个原始值undefined
(null
)。其他的就有很多个了...
Q2:原始值不可改变?这样不是改变了吗?
var foo = true foo = false console.log(foo) // false
其实不然,以上示例是原始类型和一个赋值为原始类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
基本类型值可以被替换,但不能被改变。
// 使用字符串方法不会改变一个字符串 var foo = 'foo' foo.toUpperCase() console.log(foo) // "foo" // 赋值行为可以给基本类型一个新值,而不是改变它 foo = foo.toUpperCase() // "FOO"
再有示例:
var num = 1 function add(num) { num += 1 console.log(num) } add(num) // 2 console.log(num) // 1 // ************************** 华丽的分割线 ************************** // 如果没有看上面的一些概念,单纯地看上面的例子,我相信百分百都能得到正确答案。 // 但看完上面一些的概念之后,再结合例子,不知道会不会有人对 “原始类型的值不可改变” 这句话产生怀疑? // 如果有怀疑就继续往下看
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论