javascript 数据类型

值类型(基本类型)

字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol、BigInt。

引用数据类型

对象(Object)、数组(Array)、函数(Function)。

字符串方法

  1. charAt() 方法可返回指定位置的字符。
  2. substring() 方法用于提取字符串中介于两个指定下标之间的字符。
  3. toUpperCase() 方法用于把字符串转换为大写。

数组方法

  1. sort() 方法用于对数组的元素进行排序。
  2. concat() 方法用于连接两个或多个数组。concat 会返回一个新数组
  3. reverse() 方法用于颠倒数组中元素的顺序。
  4. splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。(该方法会改变原始数组。)
  5. shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。(该方法会改变数组的长度。)
  6. resort 逆向排列已废弃;

js 判断数据类型

typeof

typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括 number,string,boolean,undefined,object,function,symbol 等。

1
2
3
4
5
6
7
8
9
10
11
typeof ""; //string
typeof 1; //number
typeof false; //boolean
typeof undefined; //undefined
typeof function () {}; //function
typeof {}; //object
typeof Symbol(); //symbol
typeof null; //object
typeof []; //object
typeof new Date(); //object
typeof new RegExp(); //object

instanceof

instanceof 用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。instanceof 检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。

1
2
3
4
5
{} instanceof Object; //true
[] instanceof Array; //true
[] instanceof Object; //true
"123" instanceof String; //false
new String(123) instanceof String; //true

instanceof 方法封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function instance(left, right) {
let prototype = right.prototype; //获取类型的原型
let proto = left.__proto__; //获取对象的原型
while (true) {
//循环判断对象的原型是否等于类型的原型,直到对象原型为null,因为原型链最终为null
if (proto === null || proto === undefined) {
return false;
}
if (proto === prototype) {
return true;
}
proto = proto.__proto__;
}
}
console.log(instance({}, Object)); //true
console.log(instance([], Number)); //false

constructor

当一个函数 F 被定义时,JS 引擎会为 F 添加 prototype 原型,然后在 prototype 上添加一个 constructor 属性,并让其指向 F 的引用,F 利用原型对象的 constructor 属性引用了自身,当 F 作为构造函数创建对象时,原型上的 constructor 属性被遗传到了新创建的对象上,从原型链角度讲,构造函数 F 就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型。

1
2
3
4
5
6
7
8
9
"".constructor == String; // true
new Number(1).constructor == Number; // true
true.constructor == Boolean; //true
new Function().constructor == Function; // true
new Date().constructor == Date; // true
new Error().constructor == Error; // true
[].constructor == Array; // true
document.constructor == HTMLDocument; // true
window.constructor == Window; // true

Object.prototype.toString()

toString()是 Object 的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中 Xxx 就是对象的类型。

对于 Object 对象,直接调用 toString()就能返回[object Object],而对于其他对象,则需要通过 call、apply 来调用才能返回正确的类型信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Object.prototype.toString.call(""); // [object String]

Object.prototype.toString.call(1); // [object Number]

Object.prototype.toString.call(true); // [object Boolean]

Object.prototype.toString.call(Symbol()); // [object Symbol]

Object.prototype.toString.call(undefined); // [object Undefined]

Object.prototype.toString.call(null); // [object Null]

Object.prototype.toString.call(new Function()); // [object Function]

Object.prototype.toString.call(new Date()); // [object Date]

Object.prototype.toString.call([]); // [object Array]

Object.prototype.toString.call(new RegExp()); // [object RegExp]

Object.prototype.toString.call(new Error()); // [object Error]

Object.prototype.toString.call(document); // [object HTMLDocument]

Object.prototype.toString.call(window); // [object Window] window是全局对象g1oba1的引用

封装一个准确判断数据类型的函数

1
2
3
4
5
6
7
function getType(obj) {
let type = typeof obj;
if (type != "object") {
return type;
}
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, "$1");
}