一、深拷贝
// 深拷贝
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+"正在好好学习");
}
原型链逻辑图