💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # JavaScript 的数据类型 数据类型决定了一个数据的特征,即限定了该数据必须按照一定的规则进行操作。 JavaScript 中一共有5中基本数据类型: 1. 字符串型 2. 数值型 3. 布尔型 4. null 型 5. undefined 型 ## 內建数据类型概要 在 ECMAScript 标准中,内建数据类型分为5种基本数据类型以及 Object 类型。 ## 字符串型 字符串字面量需要用双引号(")或单引号(')括起来。 ```javascript var str1 = "abc"; var str2 = 'abc'; ``` ### 字符串的运算 由于 JavaScript 的字符串类型是不可变类型,所以字符串值本质上是不能改变的。 ```javascript var str1 = 'abc'; var str2 = 'def'; var str3 = str1 + str2; // 'abcdef' str1 += '123'; // 'abc123' ``` ### 字符串型的比较 JavaScript 有两种等值运算,即 === 和 ==。 ```javascript var str1 = 'abc'; var str2 = str1; str1 === str2 // true 字符串内容相同 ``` 还能对字符串进行大小比较,基于 Unicode 字符的编码值 ```javascript var str1 = 'abc'; var str2 = 'def'; str1 < str2 // true ``` ### 字符串类(String 类) 字符串型和 String 类之间支持隐式类型转换。 ```javascript var str = '123'; str.length // 3; ``` 点运算符的含义是一般意义上的对类方法的调用。上面的代码中,字符串值会先被隐式的转换为字符串对象,然后再读取字符串对象的 length 属性。 ### 字符串对象 可以用 `new` 运算符,来显式地生成一个字符串对象。 ```javascript var str = new String('123'); ``` 字符串值和字符串对象之间可以进行隐式类型。一般来说并不需要在意值和对象之间的区别,字符串对象的比较运算,判断的是两者是否引用了同一个对象,而非两者的内容是否相同。 ```javascript var str1 = new String('123'); var str2 = new String('123'); str1 === str2 // false ``` ### 避免混用字符串值和字符串对象 在必要的时候,可以使用 `typeof` 运算来判别一个字符串是字符串值还是字符串对象。字符串对象的运算结果为 object ```javascript var str1 = new String('123'); typeof str1 // object ``` 应该避免显式地生成字符串对象,积极使用隐式数据类型变换,将字符串值转换为字符串对象。 ### 调用 String 函数 通过 `new` 运算符调用字符串容易引起混淆,仅通过调用 String 函数就可以生成字符串值。一般来说,使用 String 函数是为了进行显式的数据类型转换。 ```javascript var str = String(47); typeof str // string ``` ### 非破坏性的方法 字符串对象和字符串值一样,是不可变的。不能改写字符串的内容。所有要改变字符串内容的方法,都会生成一个新的字符串对象然后将其返回。 ## 数值型 数值的内部结构为64位的浮点小数。 ### 数值型的运算 对数值可以进行`+`(加法)、`-`(减法)、`*`(乘法)、`/`(除法)四则运算。通过`%`符号则可以进行求模运算(即计算除法运算后的余数) ### 有关浮点数的常见注意事项 ```javascript 0.1 + 0.2 //0.30000000000004 ``` ### 数值类(Number 类) 经过数据类型转换之后,数值和数值对象也能被视为等价的。 可以通过 `new` 运算符来显式地生成数值对象。如果没有特殊的理由,不建议使用显式的数值对象 ```javascript var num1 = new Number(1); var num2 = new Number(2); num1 === num2 // false typeof num1 // object ``` ### 调用 Number 函数 调用 Number 函数的话,将返回对应的数值。需要显示地进行数据类型转换的时候,可以使用 Number 函数。 ```javascript var num1 = Number('1'); typeof num1 // number ``` ### 边界值与特殊数值 通过 Number 对象的属性值来获知64位浮点数所支持的最大正值和最小正值。 ```javascript Number.MAX_VALUE // 1.7976931348623157e+308 Number.MIN_VALUE // 5e-324 Number.POSITIVE_INFINITY // Infinity 正无穷大 Number.NEGATIVE_INFINITY // -Infinity 负无穷大 ``` ### NaN 对 NaN 进行任何运算,其结果都是 NaN。如果在计算过程中出现了一次 NaN,最终的结果就一定会是 NaN。 NaN 不但不与其他任何数值相等,就算是两个 NaN 的等值判断也为 false。 JavaScript 中预定义了一个全局函数 isNaN。来判断一个对象是否为 NaN ```javascript isNaN({}) // true isNaN(1) // false ``` ## 布尔型 布尔型也被称为逻辑值类型或真假值类型。布尔型只能够取 true 和 false。 ### 布尔类(Boolean 类) 通过 Boolean 函数可以将任意值显式地转换为布尔值。 ```javascript var b = Boolean(true); typeof b // boolean ``` ## null 型 null 值的意义存在于对象引用之中。null 值最初的含义为“没有引用任何对象”。null 型只能够取 null 这一个值。null 值是一个字面量。对 null 进行 `typeof` 运算得到的结果是 “object”。要对 null 进行判断,就必须通过和 null 值的等值判断才能确定其类型。 ```javascript typeof null // object ``` null 型没有对应的 Null 类。 ## undefined 型 undefined 型只能够取 undefined 这一个值。对 undefined 值进行 `typeof` 运算,其结果为“undefined”。 ```javascript typeof undefined // undefined ``` 出现 undefined 的情况 - 为初始化的变量的值 - 不存在属性的值 - 在没有传入实参而调用函数时,该函数内相应参数的值 - 没有 return 语句或是 return 语句中不含表达式的函数的返回值 - 对 void 运算符求值的结果 ## Object 类型 除了基本类型之外,其它的所有类型都是 Object 类型。对 Object 类型进行 `typeof` 运算,得到的结果是 “object”。 对一个函数进行 `typeof`运算时,得到的结果为 “function”。 ## 数据类型转换 JavaScript 注重的是灵活运用隐式数据类型转换,以写出简洁的代码。 ### 从字符串值转换为数值 ```javascript Number('100'); parseInt('100', 10); // 第二个参数为转换时所采用的基数,默认为10 parseInt('100x', 10); // NaN parseFloat('0.1'); // 0.1 ``` 在数值运算操作数的位置上书写字符串值,该值就将被隐式地转换为数值类型。 ```javascript '100' - 1 // 99 '100' - '1' // 99 '100' - '' // 100 // 如果操作数中含有字符串值,它就将变为字符串连接运算。这是操作数将被转换为数值类型 '100' + 1 // 1001 1 + '100' // 1100 ``` ### 从数值转换为字符串值 通常的做法是使用 String 函数,或是在对数值对象进行了隐式数据类型转换之后,再对其调用 toString 方法。 ```javascript typeof String(100); // string typeof (100).toString(); // string 'foo' + 100 // foo100 100 + 'foo' // 100foo ``` ## 转换为布尔型 除以下类型转换后结果 false,其它都为 true。 - 数值0 - 数值 NaN - null 值 - undefined 值 - 空字符串值 也可使用 `!!` 进行隐式转换 ```javascript !!1 // true !!0 // false ``` Object 类型再被转换为布尔型之后结果必定为 true