关于 js 数据类型

赋值

  • 基本类型变量赋值
  • 引用类型变量赋值

前言

在 es6 出现以前,js 有六大数据类型,由五大基本类型+一个引用类型所组成,五大基本类型分别为undefinednullbooleannumberstring,一大引用类型为object

但随着 es6 的普及(从新知识变成基本知识),新添一位成员名叫 symbol,js 的数据类型格局变为六大基本类型+一大引用类型,symbol 的出现被列入基本类型队列,而引用类型并无变化

基本类型变量(primitive value)

  1. undefined
  2. null
  3. boolean
  4. number
  5. string
  6. symbol object

另附以上六种基本类型在chrome71控制台中实际输出

undefined

typeof undefined;
("undefined");

undefined首字母不大写

null

typeof null;
("object");

空对象的类型当然是对象

boolean

typeof Boolean(true);
("boolean");

boolean首字母不大写

Booleanwindow对象提供的 js 全局方法,用于将一个值转换为布尔类型,以下是我能想到比较有代表的转换 case:

Boolean();
false;
Boolean(false);
false;
Boolean(0);
false;
Boolean(111);
true;
Boolean("");
false;
Boolean(undefined);
false;
Boolean(null);
false;
Boolean("false");
true;

number

typeof Number();
("number");

Boolean()Number()是将变量转换为 number 类型的内置方法,以下为示例:

Number();
0;
Number(1);
1;
Number(false);
0;
Number(true);
1;
Number("");
0;
Number("false");
NaN;
Number("true");
NaN;
Number("1");
1;
Number(undefined);
NaN;
Number(null);
0;
Number("1str");
NaN;
Number("str1");
NaN;

以上看出,Number()方法在转换字符串时,会尽量把数字字符串顺利转换为 number 类型,但包含字符串或干脆就是是纯字符串的字符串类型变量显得无能为力,经过 Number()方法处理的返回值是得到一个特殊的变量NaN,它是 js 内置的一个用以表示非数字的 number 类型常量,为什么说它是变量,而不是类型呢,因为:

typeof NaN;
("number");

string

typeof String();
("string");

同样,string类型首字母不大写,首字母大写的是 js 内置的用以将某个值转换为该类型的方法,同Boolean()Number(),也有String(),case 如下:

String();
("");
String("boolean");
("boolean");
String("number");
("number");
String(Number("false"));
("NaN");
String(1);
("1");
String(undefined);
("undefined");
String(null);
("null");
typeof String(undefined);
("string");
typeof String(null);
("string");

以上看出,“万物皆可字符串化”,NaNundefinednull也难逃于此,它们被 String()大法转变后,都乖乖套上了双引号,用typeof一照都是字符串类型

symbol

typeof Symbol(1);
("symbol");
typeof Symbol();
("symbol");

以上就是传统主流 js(es5 标准实现下的 js)的六大基本类型

引用类型变量(reference value)

首先所有的引用类型都隶属于 object 类型,细分有arrayfunctionobjectdateregexp

注意:引用类型无法再通过 typeof 进行判断,因为引用类型都衍生与 object,typeof 引用于判断基本类型的区分

typeof Array();
("object");
typeof new Date();
("object");
typeof function a() {};
("function");
typeof [];
("object");

object

typeof Object();
("object");

同样object首字母也不大写,同样 js 内置了Object()方法将一切转换为 js 对象,但这和String()Boolean()Number()不可同日而语,因为Object可以说是 js 的根、源头,一切生自Object,没有它就没有 js 的其他一切

typeof Object()
"object"
Object()
{}
typeof new Date()
"object"
typeof Object()
"object"
Object(1)
Number {1}
typeof Number(1)
"number"
Object(null)
{}
typeof Object(null)
"object"
typeof Object(false)
"object"
Object(false)
Boolean {false}

特性

引用类型的值是可变的,区分于基本类型不可变,所以对于基本类型的数据进行拷贝,就真的是拷贝出了一份类型相同的一个新值。但引用类型的变量只是指向一片内存空间的指针,所以对引用类型的直接拷贝得到的只是一个指向同一片内存空间的另一个指针而已,但拷贝前后所表示的值是相同的,所以此时如果改变原引用变量的值,会同时改变拷贝出的变量的值,举个例子:

var x = { name: "hello" };
undefined;
var y = x;
undefined;
x;
{
  name: "hello";
}
y;
{
  name: "hello";
}
x.name = "world";
("world");
x;
{
  name: "world";
}
y;
{
  name: "world";
}

补充

instanceof见名知意,判断某个对象实例是否是某种对象的实例,(晦涩版:用来判断某个构造函数的 prototype 属性所指向的对象是否存在于另外一个要检测对象的原型链上,这里牵扯到构造函数ptototype属性原型链重要概念,需要后面一一详解)

({}) instanceof Object;
true([]) instanceof Array;
true(/a/) instanceof RegExp;
true(function () {}) instanceof Function;

true;

本篇系整合各篇优质内容并加以个人理解整理而成,参考文章如下: