JavaScript必知33个概念系列:原始数据类型和对象属性【WIP】

number、boolean、null、undefined、string、bigint、symbol


前言

这篇文章会总结一下JS的原始类型和对象属性相关的问题。关于类型隐式转换会在后续文章中总结。

本篇文章大致会涉及以下内容:

  • 各种原始数据类型介绍
  • 原始数据类型的自动装箱和拆箱
  • 对象数据属性和对象访问属性
  • 对象属性描述符

原始数据类型

根据MDN的说法,ECMAScript标准定义了8种数据类型:

  • Seven data types that are primitives:
    • Boolean
    • Null
    • Undefined
    • Number
    • BigInt
    • String
    • Symbol
  • and Object

Number Type&BigInt

之前写过一篇文章,是关于JS的number类型的,JS中没有Integer,只有double-float(虽然关于位运算提供了一层32位抽象),关于IEEE754标准已经写过几篇文章了,这篇文章不会再提及。有兴趣的可以看一下这两篇文章:

接下来总结一些常用点:

1
2
3
4
NaN!==NaN//true,规定
NaN===NaN//false
1>NaN//false
1<=NaN//false

Boolean

true or false

1
2
3
4
5
6
7
8
Boolean(false)//false
Boolean("false")//true
Boolean(new Boolean(false))//true
Boolean(true)//true
Boolean({})//true
Boolean(undefined)//false
Boolean(null)//false
Boolean([])//true

Null

null

一般把null考虑为一个对象引用,这个对象引用为空。

1
typeof null//object

Undefined

undefined

一切声明但未初始化的变量值为undefined,对于var声明的变量仅在执行上下文创建时期引起的变量提升初值为undefined

String

immutable,too。不像C语言那样可以改。

1
2
3
let test="abc";
test[0]='d';
test//abc

Symbol

独一无二,不可修改,可用作对象属性的key

Wrapper & Auto-Boxing

原始类型没有对象类型的优点,比如内置属性方法什么的,所以就有了一些原始类型的封装类,称之为Wrapper Object

比如这些:

  • String
  • Boolean
  • Number

就以String函数举例,使用它有两种方式:

  • 以普通函数方式,将入参转换为字符串并返回对应String的原始类型
    1
    2
    3
    4
    5
    6
    7
    String(1337); // "1337"
    String(true); // "true"
    String(null); // "null"
    String(undefined); // "undefined"
    String(); // ""
    String("dog") === "dog" // true
    typeof String("dog"); // "string"
  • 以构造函数方式,创建一个对应类型的封装对象wrapper object
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const pet = new String("dog")
    typeof pet; // "object"
    pet === "dog"; // false
    //pet是一个对象
    /*
    {
    0: "d",
    1: "o",
    2: "g",
    length: 3
    }
    */

Data property & accessor property

Property Descriptor

Reference