JavaScript的数据类型及计算

118 阅读2分钟

js的数据类型及计算

js总共有七个类型:

  • null
  • undefined
  • number(整数+浮点数,Infinity,-Infinity,NaN)
  • (+BigInt,“number” 类型无法表示大于 (253-1)(即 9007199254740991),或小于 -(253-1) 的整数。这是其内部表示形式导致的技术限制。使用BigInt可以表示超过number表示范围的数字)
  • string(``模板字符串,'${变量名}'以变量值做字符串)
  • symbol(用于创建对象的唯一标识符)
  • object
  • boolen

💎typeof 判断 null 为 object

{},[],null 都被 typeof 判断为 object

typeof null 的结果是 "object"。这是官方承认的 typeof 的行为上的错误,这个问题来自于 JavaScript 语言的早期,并为了兼容性而保留了下来。null 绝对不是一个 object。null 有自己的类型,它是一个特殊值。

函数隶属于 object 类型。但是 typeof 会对函数区分对待,并返回 "function"。这也是来自于 JavaScript 语言早期的问题。

💎JavaScript中的会导致强制数据类型转换的操作

number + string

100 + '10' = 10010 if want 110 -> 100 + parseInt('10') = 110

'string' + 10 = 'string10'

== 运算符(会尽量让两者相等)

如 10 == '10'的情况下,返回为true,进行了不期望的强制类型转化。

  • 对 null/undefined 且只对这俩来说,== 不会进行类型转换。 对undefined而言,只有 null 可以让 null == undefined (true)
  • 在实际应用中,除非判断 obj == null 使用 == ,其他情况一律使用 ===。(obj == null 也可写作 obj === null || obj === undefined)。
  • 当使用数学运算以及< > <= >= 等运算时,null/undefined 被转换为数字,null 为 0, undefined 为 NaN。 ··· alert( null > 0 ); // (1) false null转化为0 alert( null == 0 ); // (2) false null不转化 alert( null >= 0 ); // (3) true undefined 和 null,他俩互等外与别的任何类型不等

alert( undefined > 0 ); // false (1) alert( undefined < 0 ); // false (2) alert( undefined == 0 ); // false (3) ···

注意:除非判断 obj == null 使用 == ,其他情况一律使用 ===。

原始类型中的类型转换

类型转换

💎手写深拷贝

关于深拷贝还应该看一下这篇文章,下面提供的这种只是比json.parse略优但没有解决实际问题。 面试官:请你实现一个深克隆

深拷贝代码:

function deepclone() {
  const obj1 = {
  age: 20,
  name: 'xxx',
  address: {
      city: 'beijing'
  },
  arr: ['a', 'b', 'c']
  }

  const obj2 = deepClone(obj1)
  obj2.address.city = 'shanghai'
  obj2.arr[0] = 'a1'
  console.log(obj1);

  function deepClone (obj = {}) {

    if(typeof obj !== 'object' || obj == null) {
      //如果obj不是object类型或是object但是是null,都直接返回
      return obj
    }

    let result

    if(obj instanceof Array) {
      result = []
    } else {
      result = {}
    }

    for(let key in obj) {
      if(obj.hasOwnProperty(key)) {
        //筛选掉是继承自原型的属性
        result[key] = deepClone(obj[key])
      }
    }

    return result
  }
}

还有一些关于数据类型与运算符的知识点

||寻找第一个真值,||短路求值;&&寻找第一个假值

var,let,const,与块级作用域

本文使用 mdnice 排版