javaScript 基本数据类型

image20220617132941105.png

在javaScript中,变量 没有类型。js中的类型指的变量的值的类型。

typeof 判断数据类型

Undefined

当使用 var 或 let 声明的变量没有初始化,就相当于给变量赋值了 undefined 值。

目的:增加这个特殊值的目的就是为了正式明确 对象指针 和 未初始化变量 的区别。也就是null 和 undefined的区别。

let s;
console.log(s);			// undefined

Null

任何时候,只要变量保存对象,而当时又没有那个对象可保存,就要用null来填充该变量。这样就可以保持null时空对象指针的语义,并与undefined 区分开来。

// 当确定当前变量,以后将赋值为对象
let obj = null;
console.log(obj); 	  // null

// 赋值对象
obj = {
    name: "acwink",
    age: 18
};

console.log(obj); 	  // { name: 'acwink', age: 18 }

Boolean

布尔类型 true 表示真,false 表示 假。

let boolean = false;
boolean = true;

Number

进制

  • 二进制 以 0b开头

  • 八进制 以 0o开头

  • 十进制 正常表示

  • 十六进制 以 0x

浮点值

  • 定义浮点值的方法
    • 数值中必须包含小数
    • 而且小数点后面必须至少又一位小数
    • 因为存浮点值使用的内存空间是整数数值的两倍,所以ECMAScript 总是想把值转换成整数
  • 科学技术法
    • 当小数点后面至少包含6个0的时候,浮点值将会转换为科学计数法
  • 精确度
    • 精准度最高17位小数
    • 小数不能直接进行运算符比较运算,因为,小数有误差。

值的范围

  • 最大值和最小值
    • Number.MIN_VALUE
    • Number.MAX_VALUE
  • Infinity(无穷) 和 -Infinity(负无穷)
    • 表示这个值超出了 JavaScript 可表示值的范围
  • isFinite(arg)
    • 用来判断当前值是否超出表示范围

NAN

  • 表示不是数值
  • isNaN(arg)
    • 用于判断该当前变量是否是 NaN
  • NaN === NaN // false

String 类型

字符串特点

  • 字符串是不可变的,一旦创建,它们的值就不能改变了。要修改某个变量中的字符串,只能从新赋值。因为原来的字符串相当于一个常量。

定义字符串

let firstName = "ac";
let lastName = 'wink';
let fillName = `${firstName} | ${lastName}`;  // 字符串插值表达式

字符串插值

  • 从技术的角度讲,模板字面量不是字符串,而是一种特殊的句法表达式,只不过求值后得到的是字符串。

  • 以下面代码为例

    • let a = 6;
      let b = 9;
      // strings 是以 ${} 分格的字符串数组, expressions 是 大括号里面的参数值的数组
      function simpleTag(strings, ...expressions) {
          return strings[0] + 
              expressions.map((e, i) => (e + strings[i + 1]))
              .join('');
      }
      
      let untaggedResult = `${a} + ${b} = ${a + b}`;
      let taggedResult = simpleTag`${a} + ${b} = ${a + b}`
      
      console.log(untaggedResult);    // 6 + 9 = 15
      console.log(taggedResult);      // 6 + 9 = 15
      

获取原始字符串

  • 通过raw,也就是字符串中字符不经过转移按原始输出。

    • String.raw`asdfasdff`;
      
  • function printRaw(strings, ...rest) {
      /*
      	[ '©', '\n' ]
        [ '\\u00A9', '\\n' ]
        and
      */
      console.log(strings); // [ '©', '\n' ]
    
      console.log(strings.raw);  // [ '\\u00A9', '\\n' ]
      console.log(rest);       // ['and']
    }
    
    printRaw`\u00A9${"and"}\n`;
    

Symbol 类型

用于创建一个独一无二的标识。

let symbol1 = Symbol();
let symbol2 = Symbol();
console.log(symbol1 === symbol2); // false

// 这两种方法等价,创建独一无二的符号,并为符号添加描述符
let s1 = Symbol.for("aa");
let s2 = Symbol('s2');

// 获取 s1 的描述符
console.log(Symbol.keyFor(s1));

使用Symbol作为对象的属性

ES6 新增的数据类型,符号是原始值,且符号实例时唯一、不可变的。

let symbolName = Symbol("name");
let symbolAge = Symbol("age");
const obj1 = {
  [symbolName]: "acwink",
  [symbolAge]: 18,
};

const obj2 = {};
Object.defineProperty(obj2, symbolName, {
  value: "james",
  enumerable: true,
  configurable: true,
  writable: true,
});
Object.defineProperty(obj2, symbolAge, {
  value: 10,
  enumerable: true,
  configurable: true,
  writable: true,
});



console.log(obj1); // { [Symbol(name)]: 'acwink', [Symbol(age)]: 18 }
console.log(obj2); // { [Symbol(name)]: 'james', [Symbol(age)]: 30 }



console.log(obj1[symbolName], obj1[symbolAge]); // acwink 10
console.log(obj2[symbolName], obj2[symbolAge]); // james  30

Symbol常用内置符号

  • Symbol.asyncIterator
  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.iterator
  • Symbol.match
  • Symbol.replace
  • Symbol.search
  • Symbol.species
  • Symbol.split
  • Symbol.toPrimitive

BigInt

用于存储更打的数

  • 注意该类型没有表达式隐式转换,所以都是 bigint 类型才能进行运算
let bigNumber1 = BigInt(99999999999);
console.log(bigNumber1);
let bigNumber2 = 19999n;
console.log(bigNumber2);

console.log(bigNumber1 + 1); // TypeError: Cannot mix BigInt and other types, use explicit conversions

Object

创建对象有两种方式

  • 字面量

    • const obj = {
        name: "acwink",
        age: 18
      };
      
  • 构造函数

    • const obj = new Object();
      obj.name = "acwink";
      obj.age = 18;