前端面试关于js的面试题

数据类型

a. 什么是引用类型/值类型?

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

b.有那些值类型?

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

c. 有那些引用类型?

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

d.如何判断数据类型?
  1. typeof 类型
typeof “abc” ----------- string
typeof 123 ----------- number
typeof true ----------- boolean
typeof undefined ----------- undefined
typeof null ----------- object(null空指针)
typeof {
    
    } ----------- object
typeof [] ----------- object
typeof function() ----------- function
//引用类型出函数外 返回的是object
//适合判断值类型与引用类型,不能判断具体引用类型
  1. instanceof 实例
[] instanceof Array ----------- true
[] instanceof Object ----------- true
{
    
    } instanceof Array ----------- false
{
    
    } instanceof Object ----------- true
//判断是否是其原型链上的实例,只要构造函数在原型链上都返回true
//[]由Array创建的,Array是Object的子类,instanceof Array和Object都返回true

  1. constructor 构造函数
//判断实例对象构造函数 
[] constantor === Array  true                                                                  
  1. Array.isArray()是否为数组
  2. Object.prototype.toString.call(obj)原型
  3. 最精准判断
Object,prototype.toString.call(obj).slice(8,-1)                                        
//返回最精准的数据类型

浅拷贝与深拷贝

你能举几个浅拷贝的方法?
  1. 扩展{…obj}
  2. for遍历(浅拷贝(如果属性值是引用类型,两个变量的属性都指向同一内存地址))
  3. Object.assign() (把参数的两个对象进行合并,属性相同后面覆盖前面)
// js拷贝对象
    // 浅拷贝,只能拷贝值类型,引用类型数据还是指向地址
    var obj1 = {
    
    
        name:"mumu",
        age:18,
        friend:["小红","小蓝",{
    
    
            name:"小绿",
            job:"teacher"
        }]
    }
    // ES6扩展
    var obj2 = {
    
    ...obj1}
    // 循环
    var obj3 = {
    
    }
    for(var k in obj1){
    
    
        obj3[k] = obj1[k];
    }
    // Object.assign把参数的两个对象进行合并,属性相同后面覆盖前面
    var obj4 = Object.assign(obj1,{
    
    });
b.你对深拷贝的了解?

深拷贝,目标对象与源对象相互之间切断联系

  1. JSON.parse(JSON.stringify(数据)):
    json数据类型只支持不二,字符串,数字,null,undefined,array,object会忽略函数等其它类型数据
  2. 通过判断类型 递归深拷贝(递归就是函数自己调用自己,一定要有结束条件)
// js拷贝对象
    // 深拷贝,目标对象与元对象相互之间切断联系
    var obj1 = {
    
    
        name:"mumu",
        age:18,
        friend:["小红","小蓝",{
    
    
            name:"小绿",
            job:"teacher",
            say(){
    
    
                alert("你好,我是"+this.name)
            }
        }]
    }
    // JSON转字符串,字符串转对象
    var obj2 = JSON.parse(JSON.stringify(obj1))
    // json字符串的值指挥保留数组、对象、字符串、数字、null、undefined
    // 对象中的函数会被过滤掉(一般数据也是不带函数的)
//通过递归自己调用自己
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);

隐式转换

tip:数据类型转换分为:强制转换,隐式转换;

a.强调转换有哪些?:
  • Number()转换为数字
  • String()转换为字符串 Boolear()
    转换为布尔值
b.隐式转换符号有哪些?:
  • +字符串连接符号 会尝试把其他类型转换为 字符串;
  • ± * / == 会尝试把其他类型转换为数字;
    转换失败 NaN;
  • false 转换为 0 ;true 转换 1;
  • <,>,>= ,<=, ! !,= = = 判断与逻辑返回会尝试把其他类型转换布尔值(falsely变量转换为false ;空字符串,null,NaN,undefined,0,转换为false)
c.严格等于与相对等于含义?
  • = = =
    判断类型和值是否都相对
    应该在任何时候都使用= = =(当判断是否为null或者为undefined可以为特例)
    null === null true

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

  • 特例:NaN === null // false
    {} == {} // false
    [] == {} //false
    指向不同的内存地址

if判断是干什么的?

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

  2. falsely变量:false 空字符串 0 NaN undefined null (两次取反 !!a得到结果为false)

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

逻辑且 逻辑或 执行区别?

1. A||B

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

2. A&&B

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

3. 判断对象

if(a&&a.b&&a.b.c){}
if(a?.b?.c){}
如果有a并且有a.b并且有a.b.c
if(a.b.c){} 这样写是错误的

原型与原型链

a.什么是原型,什么是原型链?
  1. 显示原型:类/构造函数都是一个显式原型ptotype,本质上就是个对象
  2. 隐式原型:每个实例都有一个隐式原型__proto__
  3. 显与隐的关系:类显示原型protype等于其创建的实例的隐式原型__proro__
b.什么是原型链?(可以绘制图标)
  1. 查找对象实例的方法和属性时,先在自身找,找不到则沿着__proro__向上查找,__proro__形成的链条关系我们称之为原型链
    在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>原型</title>
	</head>
	<body>
		<script>
			// 01 创建People类
			function People(name,age){
      
      
				this.name = name;
				this.age = age;
			}
			// 02 给pepole显示原型添加 eat方法
			People.prototype.eat = function(){
      
      
				console.log(this.name+"正在吃饭")
			}
			
			// 03  创建学生类继承 People类
			function Student(name,age,no){
      
      
				// 执行People构造按函数(执行people函数并把当前的this传入函数,当前peoplethis)
				People.call(this,name,age);
				// 定义学号
				this.no =no;
			}
			// 04 让Student原型链继承People的原型链
			Student.prototype = Object.create(People.prototype);
			// 05  修正 Student 显示原型上的构造函数
			Student.prototype.constructor = Student;
			// 06 在Student显示原型链添加方法
			Student.prototype.study = function(){
      
      
				console.log(this.name+"正在好好学习,dayday up");
			}
			// 07 构建Student的实例 s1
			var s1 = new Student("小曾",18,9527);		
		</script>
	</body>
</html>
c.原型与原型链的作用?
  1. 实现了js的继承
    1.1class 的 extends方法
//- class 的 extends方法
class Student extends People{
    
    
constructor(name,age,no){
    
    
//类中继承构造函数
super(name,age)}
}

1.2 使用原型链

1. Stuent构造函数中继承
function Student(name,age,no){
    
     People.call(this,name,age) .... }
2.继承原型链
Student.prototype = Object.create(People.prototype)
2. 修正Student构造函数
Stuent.prototype.constructor = Student
  1. 实现类的实例方法扩展
  • Array.prototype.max = function(){return Math.max(…this))}
    所有数组将拥有max方法
  • String.prototype.reverse = function(){ return this.split(“”).reverse().join(“”)}
    所有字符串将拥有 reverse 方法
    注意:一般不要修改默认对象上的方法,扩展也谨慎

猜你喜欢

转载自blog.csdn.net/promise466/article/details/127975279