js基础面试题

一、深拷贝

// 深拷贝
var a = [1,2,3,4,5,"张三"]
var b = JSON.parse(JSON.stringify(a))
b.push("王五")
console.log(a,b);

二、递归

var m;
// 递归
function add(n){
	if(n==1){
		return 1 
	}
	m = n+add(n-1)
	return m
}
add(5)
console.log(m);

// 递归完成斐波拉契数列
function fib(n){
	if(n==0||n==1){return 1}
	else{
		return fib(n-1)+fib(n-2)
	}
}
console.log(fib(10));

三、隐式转换

// 数据类型转换 强制转换 隐式转换
	// 强制转换Number()转换为数字  String()转换为字符砖  Boolean()转换为布尔值
	// 隐式转换符号
	// + 字符串连接符号  隐式转换为字符串
	 // + - * / 数学运算(隐式转换为数字)
	 // > < >= <= == === || && ! 比较逻辑运算符  (隐式转换为布尔值)
	 // var a = "100";
	 // var b = 10;
	 // var c = a+b; c==10010
	 
	 // 01 字符串和任意数据+连接都会转换为字符串
	 // var a = "10";
	 // var a = "abc10";
	 // var a = true;
	 // var a = false;
	 // var b = 2;
	 // var c = a*b;//20
	 // 02数学运算符 会尝试饮食转换为数字  
	 // 如果没有转换成功就是 nana  (not a num的检测)  
	 // true 转换为数字默认转换为1  false默认转换为0
	 
	 // var a = "";
	 // alert(!!a)
	 // 03 逻辑与比较运算符 会把变量转换为布尔值 
	 // 空字符串 0 , null ,undefined  NaN  false 才会被转换为false  其他都会被转换为true
	 // 把以上变量成为flasely变量值  其他的变量都成为truely 变量值


// == 判断隐式转换后的值是否相等
	// === 判断类型与值是否都相等
	
	// ==
	// alert(100=="100") //true (如果两边类似数字会有限心事先换为数字)
	// alert(""==false)//true
	// alert(1==true)//true
	// alert(null==undefined)//true  隐式转换后都为fase
	alert(null == null)//true 空指针都指向一个地方(空)
	// alert(undefined == undefined)//true 
	
	// alter(null==NaN) false 特殊 数字不等于空
	// alert([]==[])  //false 两块不同的内存地址
	// alert({}=={})  //false 两块不同的内存地址
	
	// ===严格等于
	alert(0==="") //false
	alert([]===[])//false
	alert({}==={})//false
	alert(null===undefined)//false
	alert(null===null)//true 
	// 什么时候用=== 怎么用
	// 应该都用=== 严格等于
	// 判断是位 null 还是 undefined 可以用 ===

// || 或 如果前面的变量为triely  最终的结果为第一个 如果为falely结果为第二个
	var a = 15 ||0;//15转换结果为true  a的值就是15
	var b = false||50;false转换结果为false b的值是
	var c = false ||false;
	
	// num 取不到或者为0 或者为null 最终为5
	var re = localStorage.getItem("num")||5;

四、原型与原型链

// 原型与原型链有什么作用
	// 01 在js中实现继承
	// 02 实现类的实例方法扩展
	
	// 怎样让所有数组求最大值最小值的通用方法
	// 数组Array的实例都拥有最大值最小值方法
	// 把自定义方法挂载到类的原型上
	Array.prototype.max=function(){
		// this就是当前数组  展开求最大值
		return Math.max(...this)
	}
	// 可以在所有数组实例上访问max方法
	// 准则 不要修改js默认对象原型上的方法
	// 准则 进行不要在js默认对象的原型上添加方法
	// vue2 数组的双向绑定 劫持就是重写了数组的原型上的方法实现的
	
	Array.prototype.min=function(){
		// this就是当前数组  展开求最大值
		return Math.min(...this)
	}
	// 可以在所有数组实例上访问min方法
	
	// 怎样让字符串有通用翻转方法
	String.prototype.reverse=function(){
		return this.split("").reverse().join("")
	}
	// 什么是类  什么是实例
	// 类是 构造对象的一个模板 Array  Objcet  String
	// 实例  就是由类创建的对象  [1,2,3]  {name:"张三"}  "abc"
	// 本质上讲 类是一个函数 实例是一个由函数创建的对象
	
	// 什么是原型  什么是原型链
	// 每一个类(构造函数) 都有一个显示原型prototype
	// 每一个实例都有一个饮食原型 __proto__
	// 类的prototype等于其实例的__proto__
	// var arr = [1,2,3]
	// Array.prototype === arr.__proto__
	
	// 什么是原型链(实现js继承)
	// 当查找一个对象的属性是先在自身查找找不到则沿着__proto__向上查找
	// __proto__形成的链条关系  我们成为原型链
	// var arr = [1,2,3]
	// arr.toString() 在arr.__proto__有这个方法
	// arr.__proto__ === Array.prototype  arr继承了Array的prototype上所有方法
	// Array.prototype.__proto__ === Object.prototype  继承了object的prototype上的所有方法
	// arr.prototype.__proto__ === Object.prototype  继承了object的prototype上的所有方法
	
	
	// 通过创建类解释原型链
	// 01 创建People类
	function People(name,age){
		this.name = name;
		this.age = age;
	}
	// 02 给people的显示选型添加eat方法
	People.prototype.eat=function(){
		console.log(this.name+"正在吃饭");
	}
	
	// 03创建学生类继承people类
	function Student(name,age,no){
		People.call(this,name,age)
		this.no=no
	}
	// 04让student原型链继承people的原型链
	Student.prototype = Object.create(People.prototype)
	// 05修正student 显示原型上的构造函数
	Student.prototype.constuctor=Student;
	// 06 在student显示原型链添加方法
	Student.prototype.study=function(){
		console.log(this.name+"正在好好学习");
	}

原型链逻辑图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值