可以用JavaScript创建新的数据类型吗?

可以用JavaScript创建新的数据类型吗?,javascript,Javascript,是否可以在JavaScript中创建新的数据类型,如字符串 示例:我有一个变量person,我想声明该变量的类型是person 像这样: var person = "idk" console.log(typeof person) 输出:“Person”只有少数返回值为typeof,如下所示: 未定义“未定义” 空“对象”(见下文) 布尔“布尔” 数字“数字” BigInt(ECMAScript 2020中新增)“BigInt” 字符串“字符串” 符号(ECMAScript

是否可以在JavaScript中创建新的数据类型,如字符串

示例:我有一个变量person,我想声明该变量的类型是person

像这样:

var person = "idk"
console.log(typeof person) 

输出:“Person”

只有少数返回值为
typeof
,如下所示:

未定义“未定义”
空“对象”(见下文)
布尔“布尔”
数字“数字”
BigInt(ECMAScript 2020中新增)“BigInt”
字符串“字符串”
符号(ECMAScript 2015中新增)“符号”
函数对象(实现ECMA-262术语中的[[Call]]“函数”
任何其他对象“对象”

因此,根据您的问题,您不能为
typeof
运算符设置自己的值。如果您使用
函数()
创建自己的对象,则其类型将是
对象

最接近您所描述的是测试instanceof,或使用instanceof创建自己的类型检查函数:

班级人员{
建造师(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
}
}
const bill=新人(“bill”,40);
函数检查类型(数据){
如果(Person的数据实例)返回“Person”;
返回数据类型;
}
console.log(个人账单实例);
控制台日志(支票类型(票据));

控制台日志(支票类型(“票据”))您可以使用类来创建自定义对象。 但是,对于自定义数据类型,您不能真正做到这一点

以下是一个基本示例:

班级人员{
建造商(姓名、年龄、国籍){
这个。_name=name;
这个。_年龄=年龄;
这._国籍=国籍;
}
信息(){
返回'Hi${this.\u name},您是${this.\u age}岁,您的国籍是${this.\u national}`
};
};
const person=新人(“约翰”,15岁,“英国”);
console.log(person.info())
控制台日志(人员类型)
必须在类中具有
构造函数
函数;如果没有,JavaScript将插入一个空的


我对类不是很有经验(我刚刚开始使用它们),我建议你对它们做进一步的研究——它们非常有用。

我想我会指出,“我可以创建自定义类型吗?”的答案是肯定的。但是,您不能邀请
typeof
参加聚会

以下是使用
typeof
的一些变通方法和替代方法

typeof
已损坏? 运算符的类型可能会被认为有点损坏。。。所以对于“自定义”类型来说,它实际上不起作用。。。实际上,它并不像您对JavaScript原语所期望的那样工作

typeof null//“对象”?!好的…
,虽然发生这种情况有其原因

检查自定义类型的理想且“安全”的方法是在自定义对象上定义并调用自定义toString方法

您可以在上阅读更多有关此的信息

instanceof
救援 <>而不是使用Type,可以考虑使用<代码>实例< /COD>。因为这将立即与您的“自定义”类一起工作,而无需执行任何其他操作,例如实现您自己的.toString方法

这里是一个简单的操场,展示了基本的想法

class-Person{}
p=新的人员//人员的实例
console.log(typeof p)//对象:(
console.log(p instanceof Person)//true:p
//并使用custom.toString方法
Person.prototype.toString=function(){return'Person'}
console.log(p.toString())/“person”
console.log(字符串(p))/“person”

console.log(p+“”)/“person”听起来像是在找TypeScript!TypeScript是一种编译成JavaScript的语言

以下是文档中创建人员类型的示例:

interface Person {
    firstName: string;
    lastName: string;
}

let user: Person = { firstName: "Jane", lastName: "User" };

在JavaScript世界中,
类型与其他OOP语言不同

ECMA和JavaScript之间有一个细微的区别:

在中,只有八种数据类型:
未定义、Null、Boolean、String、Symbol、Number、BigInt和Object。

也就是说,ECMA将
函数
视为
对象
的一个子类型

在JavaScript中,我们几乎总是将
Function
视为一个单独的类型,因为
typeof(Function(){})
为我们提供了
Function
将为我们提供
数组
,因此我们将
数组
视为对象的一个子类型,同样的事情发生在
集合、映射、日期等
,这些数据可能在某些OOP语言(如Python)中作为一个单独的类型存在,但在JavaScript中,它们都是
对象
的子类型

因此,这就是我们在JavaScript中谈论
type
时所面临的真实情况

但是,如果我们不只是关注
typeof
,我们就有更好的方法来创建和检测JavaScript中的新数据类型

准确地说,我们可以创建新的数据子类型sub
Object
type,而且在大多数情况下,我们还应该在JavaScript中检测数据的子类型

关键是
Object.prototype.toString
symbol.toStringTag

下面是演示代码:

职能人员(){
}
const person=新人员()
const getObjTag=(obj)=>Object.prototype.toString.call(obj.slice)(8,-1)
console.log(getObjTag(person))//日志对象
Person.prototype[Symbol.toStringTag]=Person.name
console.log(getObjTag(person))//log person
//这种方法在JS中是合理的,因为
console.log(getObjTag([])//日志数组

console.log(getObjTag(new Set([]))//log Set
您可以定义一个类。
typeof
用于“纯”javascript类型。是的,在类中可以这样做,尽管对于任何类,
typeof
都将返回
object