JavaScript学习笔记-数据结构和类型

183 阅读2分钟

数据类型

最新的 ECMAScript 标准定义了8种数据类型:

// 基本数据类型
Boolean // true false
String // 字符串是一串表示文本值的字符序列,例如 'vuejs'
Number // 整数或浮点数,例如:42 或者 3.14159
BigInt // 可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制
undefined // undefined 表示变量未定义时的属性
null // 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同
Symbol // 一种实例是唯一且不可改变的数据类型
// obj
Object // 对象

数据类型的转换


四则运算符

// 加法
1 + '1' // 11
true + true // 2
4 + [1,2,3] // 41,2,3
'a' + + 'b' // aNaN

// 其他运算符
4 * '3' // 12
4 * [] // 0
4 * [1, 2] // NaN
  • 加法
  1. 运算中其中一方为字符串,那么就会把另一方也转换为字符串。
  2. 如果一方不是字符串或者数字,那么会将它转换为数字或者字符串。
  3. 另外对于加法还需要注意这个表达式 'a' + + 'b' ,因为 + 'b '等于 NaN,所以结果为 aNaN,你可能也会在一些代码中看到过 + ‘1’ 的形式来快速获取 number 类型。
  • 其他运算符
  1.  只要其中一方是数字,那么另一方就会被转为数字。

对象转原始类型

对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:

  1. 如果已经是原始类型了,那就不需要转换了
  2. 调用valueof(),如果转换为基础类型,就返回转换的值
  3. 调用toString(),如果转换为基础类型,就返回转换的值
  4. 如果都没有返回原始类型,就会报错

当然你也可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。

let a = {
    valueof() {
	return 0;
    },
    toString() {
	return '1';
    },
    [Symbol.toPrimitive]() {
        return 2;
    }
}
console.log(1 + a) // 3

比较运算符

  1. 如果是对象,就通过 toPrimitive 转换对象
  2. 如果是字符串,就通过 unicode 字符索引来比较

let a = {
    toString(){
        return 0;
    },
    vauleOf(){
        return 1;
    }
}
console.log(a > -1); // true

转Boolean

在条件判断时,除了 undefinednullfalseNaN''0-0,其他所有值都转为 true,包括所有对象。