首页 > 其他分享 >基础面试题

基础面试题

时间:2022-11-21 20:15:38浏览次数:46  
标签:面试题 obj 基础 原型 typeof var null true

面试题

数据类型

什么是引用类型,值类型

值类型key与value存储在栈中(量小)
引用类型在栈存储的引用地址,在堆中存储是数据(量大)把引用类型赋值给一个变量,是吧变量的引用地址指向引用类型堆中地址

哪些值类型

String字符,Number数字,Boolean布尔,undefined未定义null空(特殊)Symbol符号

哪些引用类型

Object对象Array数字Function函数Map图Set集合

判断数据类型

typeof 类型

instanceof 实例

constructor 构造函数

Array.isArray()是否为数组

Object.prototype.toString.call(obj)原型

typeof判断

typeof "abc" string
typeof 123 number
typeof true boolean
typeof undefined undefined
typeof null object
typeof Symbol() symbol
typeof {} object
typeof [] object
typeof function(){} function
typeof new Map() object
typeof new Set() object

适合判断值与引用类型 不能判断具体引用类型

instanceof判断

[]instanceof Array true
[]instanceof Object true
{}instanceof Array false
{}instanceof Object true

判断是否是其原型链上的实例 只要这个构造函数在原型链都返回true

([]由Array创建的,Array是Object的子类,instanceof Array和Object都返回true)

constructor判断

判断实例对象构造函数

[].constructor===Array true

最精确

Object.prototype.toString.call(obj).slice(8,-1)

深拷贝和浅拷贝

浅拷贝

三种实现方法

var obj1 = {
      name: "mumu",
      age: 18,
      friend: ["小红", "小绿", { name: "小蓝", job: "teacher" }],
    };
var obj2 = { ...obj1 }; //如果属性值是引用类型,两个变量的属性都指向同一内存地址
var obj3 = {};
    for (var k in obj1) {
      obj3[k] = obj1[k];
    }
 //将参数的两个对象进行合并,属性相同后面覆盖前面
    var obj4 = Object.assign(obj1, {});

深拷贝

  1. JSON.parse(JSON.stringify(数据))

json数据类只支持 布尔,字符串,数字 null,undefined array object
会忽略函数 等其他类型数据

  1. 通过判断类型 递归深拷贝

递归就是函数调用自己
一定要有结束条件

  var obj1 = {
      name: "mumu",
      age: 18,
      friend: ["小红", "小绿", { name: "小蓝", job: "teacher" }],
      say() {
        alert("你好我是" + this.name);
      },
    };
    function deepCopy(obj) {
      if (typeof obj == "object" && obj != null) {
        var temp = null;
        if (obj instanceof Array) {
          temp = [];
          for (var i = 0; i < obj.length; i++) {
            temp[i] = deepCopy(obj[i]);
          }
        } else {
          temp = {};
          for (var k in obj) {
            temp[k] = deepCopy(obj[k]);
          }
        }
        return temp;
      } else {
        return obj;
      }
    }
    var obj2 = deepCopy(obj1);

隐式转换

看符号

  • +字符串连接符号 会尝试把其他类型转换为 字符串

  • +-*/ == 会尝试把其他类型转换为数字

    转换失败 NaN

    false 转换为 0
    true 转换 1

  • ><>= <= ! != == 判断与逻辑返回会尝试把其他类型转换布尔值

严格等于

  • ===判断类型和值是否都相对

  • 应该在任何时候都使用===
    (当判断是否为null或者为undefined可以为特例)

  • ==
    判断隐式转换后的值
    “100” == 100 // true
    null == undefined //true
    0 == false //true
    特例:NaN === null // false

  • null === null true

  • {} == {} // false
    [] == {} //false
    指向不同的内存地址

if判断

if()中判断的是否为truely变量

falsely变量:false “” 0 NaN undefined null
两次取反 !!a得到结果为false

除了falsely变量其他都为truely变量

逻辑且逻辑或

A||B

A为真(truely) 结果为A ,否则结果为B

A&&B

A为假(falsely) 结果为A,否则结果为B

判断对象

if(a&&a.b&&a.b.c){}

if(a?.b?.c){}

如果有a并且有a.b并且有a.b.c

if(a.b.c){}

原型与原型链

名词

(创建对象实例的模板)

本质上就是函数

构造函数用new来执行的函数

class xxx()

实例

由类创建的对象

(本质上就是对象)

显示原型

类/构造函数都有一个显示原型protype

本质就是对象

隐式原型

每个实例都要一个隐式原型__proto__

显与隐关系

类显示原型protype等于其创建的实例的隐式原型__proto__

原型链

查找对象实例的方法和属性时,先在自身找,找不到则沿着__proto__向上查找,__proto__形成的链条关系我们称为原型链(实现了js继承)

原型与原型链的作用

实现了js的继承

实现了实例的公用属性和方法

显与隐关系

var arr = [];
arr.proto === Array.prototype

类显示原型protype等于其创建的实例的隐式原型__proto__

js实现继承

class 的 extends方法

class Student extends People{
    constructor(name,age,no){
     //类中继承构造函数
     super(name,age)
     ....
   }
}

使用原型链

  1. Stuent构造函数中继承People
    function Student(name,age,no){
      People.call(this,name,age)
      ....
    }
    
  2. 继承原型链
    Student.prototype = Object.create(People.prototype)

  3. 修正Student构造函数
    Stuent.prototype.constructor = Student

实例公用方法

Array.prototype.max = function(){return Math.max(...this))}
所有数组将拥有max方法

String.prototype.reverse = function(){ return this.split("").reverse().join("")}
所有字符串将拥有 reverse  方法

注意:一般不要修改默认对象上的方法,扩展也谨慎

标签:面试题,obj,基础,原型,typeof,var,null,true
From: https://www.cnblogs.com/aureazjl/p/16913021.html

相关文章

  • ZooKeeper 面试题
    1.ZooKeeper是什么?ZooKeeper是一个分布式协调服务 ,由Apache进行维护。ZooKeeper可以视为一个高可用的文件系统。ZooKeeper可以用于发布/订阅、负载均衡、命令服务......
  • DB面试题目
    MyBatis面试题1、什么是Mybatis?答:MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获......
  • JavaScript基础(二)
    JavaScript基础第04天笔记1-数组1.1数组的概念数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。数组是指一组数据的集合,其中的每个数据被称作元素,在......
  • 软件详细设计基础
    概述任务中层设计的:过程、调用;类、协作低层设计的全部:数据结构、算法;类型、语句、控制结构结构化设计设计思想:按算法分解。(因为此时项目以编程为驱动)把系......
  • 软件技术基础随笔3
    软件技术基础首页-22软件基础-浙江理工大学-班级博客-博客园本次作业的目标结对任务,简单录制一段电梯演讲小组成员褚原宇——2020330301194陈宇豪——20......
  • Python基础之网络编程:6、网络并发编程理论与实操(二)
    Python基础之网络并发编程目录Python基础之网络并发编程一、任务运行的多种方式1、同步与异步2、阻塞与非阻塞3、综合使用二、创建进程的多种方式1、代码创建进程方式一......
  • ASP.NET Core 基础知识--环境变量,不同环境自动采用不同配置文件
    在一个项目当中,我们经常会有很多不同的环境的参数需要配置,比如以登录cookie要写的domain为例吧开发环境的配置:一般是localhost测试环境:内部解析的测试域名UAT用户验收测......
  • Python基础之网络编程:7、网络并发编程理论与实操(三)
    Python基础之网路并发编程目录Python基础之网路并发编程一、线程1、线程理论2、创建线程的两种方式2、1.继承类创建2、2.使用函数创建3、线程的诸多特性二、GIL全局解释......
  • 资深java面试题及答案整理
     8.如果你的Serializable类包含一个不可序列化的成员,会发生什么?你是如何解决的?任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在Java中为st......
  • 路由交换基础(中小型网络)
    接入交换机与核心交换机通过Eth-Trunk组网保证可靠性。每个部门业务划分到一个VLAN中,部门间的业务在CORE上通过VLANIF三层互通。核心交换机作为DHCPServer,为园区用户分配IP......