数据类型

PPG007 ... 2021-12-25 About 5 min

# 数据类型

# 概述

确定一个值是什么类型:

  • typeof 运算符:

    console.log(typeof '123');// string
    console.log(typeof 123);// number
    
    1
    2
  • instanceof 运算符:

    instanceof 运算符返回一个布尔值,表示对象是否是某个构造函数的实例。运算符左边是实例对象,右边是构造函数,检查右边构造函数的原型对象是否在左边对象的原型链上,等价于 Constructor.prototype.isPrototypeOf(instance)

  • Object.prototype.toString 方法:

# 布尔值、null、undefined

null 在转换为数值时会转换为 0,undefined 会转换为 NaN。

布尔值转换规则:

下面这些内容会被转为 false:

  • undefined。
  • null。
  • false。
  • 0。
  • NaN。
  • "" 或 ''。

注意:空数组、空对象都会转为 true。

# 数值

JavaScript 中所有数字都是以 64 位浮点数形式储存,即使是整数。

关于 NaN:

  • NaN 不是独立的数据类型,仍然是 number。
  • NaN 不等于任何值,包括自己。
  • NaN 与任何数运算得到的都是NaN。

一些与数值相关的全局方法:

  • parseInt:将字符串转为整数。
    • 如果字符串头部有空格,空格会被自动去除。
    • 如果参数不是字符串则会先转换为字符串。
    • 转换时是一个个字符依次转换,如果遇到不能转为数字的字符,就不在进行下去,只返回已转好的部分。
    • parseInt 的返回值要么是一个十进制整数,要么是 NaN。
    • parseInt 可以接受第二个参数,表示被解析的值的进制,返回对应的十进制数。
  • parseFloat:将一个字符串转为浮点数。
  • isNaN:用来判断一个值是否为 NaN。此方法只对数值有效,如果传入其他值会被先转成数值,字符串会被转为 NaN 导致结果为 true。对于对象和数组同样返回 true,但是如果是空数组或者是只有一个数值成员的数组会返回 false。
  • isFinite:返回一个布尔值,表示某个值是否为正常的数值。

# 字符串

Base64 转码:

  • btoa():任意值转为 Base64 编码。
  • atob():Base64 编码转为原来的值。

非 ASCII 码字符转为 Base64 编码中间必须插入一个转码环节。通过 encodeURIComponent() 进行编码,通过 decodeURIComponent() 进行解码。

在 Node.js 中无法使用 btoa-atob 两个方法,需要使用 Buffer.from(str).toString('base64') 将字符串转换为 Base64 编码,使用 Buffer.from(str,'base64').toString() 将 Base64 编码转为字符串。

# 对象

定义对象时,键加不加引号都可以,最后都会被转成字符串,如果键名不符合标识名的条件,例如第一个字符是数字,或者含有空格或运算符而且也不是数字,必须加引号。

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,指向同一块内存,修改一个变量,会影响所有变量;如果取消某个变量对于原对象的引用,不会影响到另一个变量。

查看一个对象本身的所有属性:Object.keys 方法。

删除对象的属性:delete,删除成功返回 true,如果删除一个不存在的属性也是返回 true。

属性是否存在:in,包含就返回 true,不包含就返回 false,但是这个运算符不会区分哪些属性是继承的,哪些是自己的。

判断是否是自身的属性:hasOwnProperty

属性的遍历:使用 for...in 可以对属性进行遍历,它遍历的是对象所有可遍历的属性,会跳过不可遍历的属性。不仅遍历对象自身的属性,还遍历继承的属性,一般结合 hasOwnProperties 方法使用:

for (const key in user) {
  if (user.hasOwnProperty(key)) {
    console.log(`键:${key}`)
    console.log(`值:${user[key]}`)
  }
}
1
2
3
4
5
6

with 语句:操作一个对象的多个属性时提供方便,如果在 with 语句块内部进行赋值操作,必须是对象已有的属性,否则会创造一个当前作用域的全局变量

# 函数

函数的声明:

  • function 命令。
  • 函数表达式:将函数匿名赋给一个变量,结尾要加分号。
  • Function 构造函数。

函数的属性和方法:

  • name 属性:返回函数的名字,如果是通过变量赋值定义的匿名函数,那么返回变量名。
  • length 属性:返回函数预期传入的参数个数。
  • toString():返回一个字符串,内容是函数的源码。

参数的传递:如果参数是原始类型的值,传递方式是值传递,函数体内修改参数值不会影响到函数外部,如果参数是符合类型的值,传递方式是传址传递,传入的是原始值地址,如果函数体中修改对象、数组是整体替换那将不会影响原来的对象,因为只是修改了一个引用。

如果存在重名的参数,取最后的值。如果一个函数有两个重名参数,传入两个参数时,通过变量名只能获取第二个参数,如果传一个参数,则会变成 undefined。

arguments 对象:

这个对象包含了函数运行时的所有参数,可以通过下标对参数进行访问,这个对象只能在函数体内部使用,在严格模式下,修改 arguments 对象不会影响到实际的函数参数,通过 length 属性可以判断调用时带几个参数。

虽然这个对象看起来很像数组,但它是一个对象,数组专有的方法不能在这个对象上使用。

闭包:能够读取其他函数内部变量的函数,由于 JavaScript 的特点,这个函数就是一个函数的子函数,闭包将函数内部和函数外部连接起来一座桥梁。闭包使得内部变量记住上一次调用时的运算结果,每一次调用都是在上一次调用的基础上进行计算。闭包还可以封装对象的私有属性和私有方法。

# 数组

length 属性:如果认为扩大 length,那么新出来的位置上都是空的。

通过 in 运算符检查某个键名是否存在。

使用 delete 命令删除数组中的某个元素时,不会影响 length 属性,length 属性不过滤空位。

Last update: December 25, 2021 14:08
Contributors: PPG007