JS数据类型
在JavaScript中,常见的数据类型包括以下几种:
- 原始数据类型(Primitive Types):
- 数字(Number): 表示数值,例如:42, 3.14。
- 字符串(String): 表示文本数据,例如:“Hello, world!”。
- 布尔值(Boolean): 表示逻辑值,即true或false。
- 空值(Null): 表示一个空值或缺少值。
- 未定义(Undefined): 表示一个未定义的值。
- 引用数据类型(Reference Types):
- 对象(Object): 表示键值对的集合,例如:{ name: ‘John’, age: 25 }。
- 数组(Array): 表示有序的值的集合,例如:[1, 2, 3]。
- 函数(Function): 表示可重复执行的代码块,例如:function() { … }。
- 正则表达式(RegExp): 表示用于模式匹配的正则表达式,例如:/\d+/。
判断数据类型的方法有多种,可以使用以下方法之一:
- typeof运算符:可以用于判断一个值的数据类型。例如:
typeof 42
返回 “number”typeof "Hello"
返回 “string”typeof true
返回 “boolean”typeof { name: 'John' }
返回 “object”typeof [1, 2, 3]
返回 “object”typeof function() {}
返回 “function”typeof null
返回 “object” (注意这是一个历史遗留问题,实际上null是一个原始数据类型)
- instanceof运算符:可以用于判断一个对象的具体类型。例如:
[] instanceof Array
返回 true{ name: 'John' } instanceof Object
返回 true- 此方法对于判断原始数据类型的有效性有限,而且对于不同的执行环境可能会有不同的结果。
- Object.prototype.toString方法:可以获取一个对象的内部属性[[Class]],从而判断其具体类型。例如:
Object.prototype.toString.call(42)
返回 “[object Number]”Object.prototype.toString.call("Hello")
返回 “[object String]”Object.prototype.toString.call(true)
返回 “[object Boolean]”Object.prototype.toString.call({ name: 'John' })
返回 “[object Object]”Object.prototype.toString.call([1, 2, 3])
返回 “[object Array]”Object.prototype.toString.call(function() {})
返回 “[object Function]”Object.prototype.toString.call(null)
返回 “[object Null]”Object.prototype.toString.call(undefined)
返回 “[object Undefined]”
请注意,不同的方法有其特定的使用场景和限制。typeof运算符通常用于判断原始数据类型,而instanceof运算符和Object.prototype.toString方法常用于判断对象的具体类型。自定义的类型(例如,通过构造函数创建的对象)可能需要使用其他方式进行判断。
TS常用的内置类型
在 TypeScript 中,内置的常用类型包括以下几种:
number
:表示数字类型,包括整数和浮点数。string
:表示字符串类型,用于表示文本数据。boolean
:表示布尔类型,即true
或false
。array
:表示数组类型,用于存储多个相同类型的值。可以使用泛型形式Array
或者简写形式ElementType[]
表示数组。tuple
:表示元组类型,是指定长度和类型的数组。enum
:表示枚举类型,用于定义一组命名的常量值。any
:表示任意类型,相当于放宽了类型限制,可接受任意类型的值。void
:表示空值,常用于函数返回值表示没有返回值。null
和undefined
:表示空和未定义的值。object
:表示非原始类型的值,包括函数、数组、对象等。never
:表示永远不存在的值的类型,常用于表示抛出异常或永远不会返回的函数。unknown
:表示未知类型的值,类似于any
,但对它的使用有更严格的限制。
除了这些常用的内置类型之外,还有其他高级类型,如联合类型(Union Types)、交叉类型(Intersection Types)、类型字面量(Literal Types)、类型别名(Type Aliases)、类型推断(Type Inference)等等,这些类型可以更精确地表达数据的结构和约束。
总体而言,TypeScript 提供了丰富的内置类型,可以帮助开发者在开发过程中更好地对数据进行类型约束和类型推导,以提高代码的可靠性和可维护性。
==和===
在JavaScript和TypeScript中,==
和 ===
都是用于比较两个值是否相等的比较运算符,但它们在比较时有一些差别。
==
(相等运算符)会进行类型转换,并尝试将两个操作数转换为相同类型后再进行比较。如果两个操作数的值相等,但类型不同,==
会尝试进行类型转换后再比较它们。比较时的类型转换规则非常复杂,根据操作数的类型和具体情况有所不同,这可能导致一些令人意想不到的结果。
例如:
console.log(5 == "5"); // true,会将字符串转换为数字进行比较 console.log(null == undefined); // true,它们被视为相等的特殊情况 console.log(true == 1); // true,将布尔值转换为数字进行比较 console.log([] == ""); // true,数组会转换为空字符串再进行比较
===
(严格相等运算符)在比较时不进行类型转换。它要求操作数的值和类型都相等才会返回 true
。只有在值和类型都相同的情况下,===
才会返回 true
。
例如:
console.log(5 === "5"); // false,类型不同 console.log(null === undefined); // false,类型不同 console.log(true === 1); // false,类型不同 console.log([] === ""); // false,类型不同
对于大多数情况,建议优先使用 ===
运算符进行严格相等比较,因为它更直观和可预测。只有在明确需要进行类型转换的情况下,才使用 ==
运算符。
在 TypeScript 中,类型检查会更加严格,使用 ===
运算符进行类型和值的比较可以更好地遵循静态类型检查的原则。