javascript面试必备知识(1)变量基础

js面试必备知识,关注作者查看系列js知识体系

导语:变量是学习每一门语言都必须要学习的一个重要的知识点,基础但是又特别重要。

本文的目录

    • 1, 引用类型和值类型
    • 2, 值类型和引用类型有哪些?
    • 3, 深拷贝和浅拷贝。
    • 4,== 运算符的坑

1, 引用类型和值类型

我们先来看一段非常简单的代码,你觉得他会输出什么?这就是值类型

let a = 1
let b = a
b = 100
console.log(a,b) //1,100 

那么再来看一段代码,引用类型

let a = { num: 1 }
let b = a
b.num = 100
console.log(a.num) //100

咦,这是为什么呢??为什么a和b的属性一样了呢?

because,值类型是一个简单的变量,它的值被自动生成保存在栈中,当再定义一个相同的变量,也会保存在栈中。但是引用类型可不是这样的,当你定义的不是一个简单的变量,是一个对象时候,就还会在上生成一个空间,并且把它的地址保存在栈中,我们的a就是相当于一个地址去指向堆。当你再定义一个变量去等于a,就相当于又指向了原来的a堆上的数据。所以它们本质上是指向了同一个地址,修改值后当然都会改变了。

2, 值类型和引用类型有哪些?

值类型一共有5种,undefined数字字符串布尔值Symbol

引用类型一共有3种,对象null数组

3, 深拷贝和浅拷贝。

正是有值类型和引用类型的存在,才会出现浅拷贝和深拷贝,其中深拷贝是面试的常考题目,经常让你手写深拷贝函数。

首先我们得先引入一个运算符typeof,这是可以判断变量的类型的一个运算符。

typeof 判断值类型,能够全部判断。

let a;              typeof a      //undefined
let b = '123';      typeof b      //string
let c = 100;        typeof c      //number
let d = true;       typeof d      //boolean
let e = Symbol('e');typeof e      //symbol

typeof判断引用类型,不能够全部。

typeof	null	//object
typeof	['a']	//object
typeof	{ a: 1}	//object

那么我们还想再把数组和对象再细分出来就要使用instanceof,能够给完美解决。

instanceof	['a']	//Array

然后我们来了解一下,浅拷贝只是指向了那个堆上的地址,但本质上还是同一个东西;而深拷贝就是要完全的再拷贝一份。

至此,我们已经具备深拷贝的所有条件了,直接来手撸深拷贝吧!!!!

function deepClone(obj = {}) {
  if (typeof obj !== 'object' || obj == {}) {
    return obj  // 如果不是对象或者数组,或者等于null就返回
  }

  let result  //判断obj的具体类型
  if (obj instanceof Array) {
    result = []
  } else {
    result = {}
  }

  for (let i in obj) {
    if (obj.hasOwnProperty(i)) {  //查看obj[i]是不是还是需要深拷贝
      result[i] = deepClone(obj[i])		//递归
    }
  }

  return result
}

4,== 运算符的坑

先来看一下一段代码,你觉得它们分别输出什么。

123 == '123'
false == ''
'' == 0
0 == false
undefined == null

其实它们都输出true,这些坑,就经常导致一些不可预料的问题。那么这里有一个比较好的办法,就是除了 == null之外,其他的一律用===。

你可能感兴趣的:(js)