JavaScript高级特性速成指南:原型链、严格模式、高阶函数、闭包、递归、浅拷贝和深拷贝

如果生活中有什么使你感到快乐,那就去做吧,不要管别人说什么

文章目录

          • 原型链
          • 严格模式
          • 高阶函数
          • 闭包
          • 递归
          • 浅拷贝和深拷贝

原型链
  • 概念:就是串联起来的结构
  • 作用:提供一个成员的查找机制或者查找规则
    在这里插入图片描述
  • Javascript的成员查找机制(规则)
    当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性
    • 如果没有就查找它的原型(也就是__proto__指向的prototype 原型对象)
    • 如果还没有就查找原型对象的原型 (Object的原型对象)
      以此类推一直找到Object为止 (null)
    • __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
    • 如果一个对象查找属性和方法,那么先从自身开始查找
    • 找到的话使用自身的属性方法,如果找不到就会沿着原型链一直查找
    • 只要在原型链上,那么一定可以使用
  • 扩展对象
    可以通过原型对象,对原来的内置对象进行扩展自定义的方法。比如给数组增加自定义求偶数和的功能
    var arr = new Array(1,2,3)
    Array.prototype.sum = function() {
      // 求和
      var he = 0
      // 遍历
      for (var i = 0; i < this.length; i++) {
        he = he + this[i]
      }
      // 返回值
      return he
    }
    console.log(arr.sum())
    
  • 继承
    ES6:通过 构造函数 + 原型对象 模拟实现继承、被称为组合继承
    • call():把父类的this指向子类
    • 属性的继承 (利用构造函数实现子类的继承)
      function Hero(name,age) {
        this.name = name
        this.age = age
      }
      function Star(name,age,hobby,jineng) {
        Hero.call(this,name,age)
        this.hobby = hobby
        this.jineng = jineng
      }
      var  obj = new Star('华晨宇',27,'唱歌','麦克风')
      console.log(obj)
      
    • 方法的继承 (把父类的实例对象保存给子类的原型对象)
      // 父类原型对象
      function Father() { }
      Father.prototype.say = function () {
      	console.log('说话')
      }
      function Son() { }
      // 假设 : 如果子类已经继承下来这个方法,那么这个方法在 prototype
      // Son.prototype = Father.prototype
      // 1. 用父实例对象赋值给子原型对象
      Son.prototype = new Father()
      // 2. 让子原型对象能够找回子构造函数
      Son.prototype.constructor = Son
      var obj = new Son()
      // 有自己的方法
      Son.prototype.hi = function () {
        console.log('哇哈哈哈')
      }
      obj.say()
      obj.hi()
      console.log(Son.prototype)
      console.log(Father.prototype)
      
      一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法
      总结:用构造函数实现属性继承,用原型对象实现方法继承
  • 类的本质
    • class本质还是function
    • 类的所有方法都定义在类的prototype属性上
    • 类创建的实例,里面也有__proto__ 指向类的prototype原型对象
    • ES6的类它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已
    • 语法糖:语法糖就是一种便捷写法。 简单理解,有两种方法可以实现同样的功能,但是一种写法更加清晰、方便,那么这个方法就是语法糖
严格模式
  • 作用
    • 消除了Javascript语法的一些不合理、不严谨之处,减少了一些怪异行为。【例如变量,不声明就报错】
    • 消除代码运行的一些不安全之处,保证代码运行的安全。
    • 提高编译器效率,增加运行速度
    • 禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的Javascript做好铺垫。比如一些保留字如:class, enum, export, extends, import, super 不能做变量名
  • 开启严格模式:"use strict"
    • 为脚本开启严格模式 <script>"use strict"</script>
      <script>
      	"use strict"
      	function fn () {
      		n = 6
      		console.log(n)
      	}
      	fn()
       </script>
      因为"use strict"加了引号,所以老版本的浏览器会把它当作一行普通字符串而忽略
      
    • 为函数开启严格模式 <script>function fn () {"use strict"}</script>
      function fn() {
      	"use strict"
      	//  var n = 9
      	n = 9
      	console.log (n)
      }
      // fn()
      function fn () {
      	n = 9
      	console.log(n)
      }
      fn()"use strict"放在函数体的第一行,则整个函数以"严格模式"运行
      
  • 严格模式中的变化
    • 变量规定
      • 变量申明必须加var,而且不准删除变量
      • 在正常模式下,如果一个变量没有声明就赋值,默认是全部变量。严格模式禁止这种用法,变量都必须先用var命令声明,然后再使用
      • 严禁删除已经声明变量 例如: delete x; 语法是错误的
    • 函数变化
      • 参数不能重名
      • 函数不能有重名的参数
      • 函数必须声明在顶层,新版本的JavaScript 会引入“块级作用域”(ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。【if,for等里面定义函数也可以,但是现在不可以】
      • 错误写法:function fn(a, a) {console.log(a + a)} fn(1,2)
    • 严格模式下this指向问题
      • 严格模式下,普通函数this是undefined
      • 以前在全局作用域函数中的this指向 window 对象;严格模式下全局作用域中函数的this是undefined
      • 以前构造函数时不加new也可以调用,普通函数,this 指向全局对象;严格模式下,如果构造函数不加new调用, this 指向的是undefined ,如果给他赋值则会报错
      • new实例化的构造函数指向创建的对象实例
      • 定时器this还是指向window
      • 事件、对象还是指向调用者
高阶函数
  • 概念:把函数作为参数,或者把函数作为返回值的函数
var n = function () { console.log(123) }
// 把函数当参数的函数是高阶函数
function fn(m) {
	console.log(m)
  m()
}
var n = function () { console.log('娃哈哈') }
fn(n)
// 把函数当做返回值的函数是高阶函数
function fun() {
	var n = function () { console.log('娃哈哈') }
	return n
}
// 函数的返回值是返回函数调用的位置
var re = fun()
console.log(re)
re()
function fn(f) {
	f && f()
}
var  n  = function () {console.log(123) }
fn(n)
闭包
  • 概念:有权访问另一个函数作用域中变量的函数
  • 作用:延伸(局部)变量的作用范围
function fn1() {
	var n = 3  // 父作用域
	function fn2() {
		console.log(n)
	}
	fn2() // 闭包函数    //子作用域
}
fn1()
// 如何在函数外面访问到函数内部的变量
function fn() {
	var num = 6
	return function fun() {
		console.log(num)
	}
	// fun()
}
var n = fn()
console.log(n)
n()
递归
  • 概念:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
  • 注意:递归函数的作用和循环效果一样,由于递归很容易发生"栈溢出"错误(stack overflow),所以必须要加退出条件
// 利用递归求1~n的任意一个数的阶乘
function fn(n) {
	// 判断
	if (n == 1) {  // 结束条件
		return 1
	}
	return n * fn(n - 1);
} 
console.log(fn(3))
// 利用递归求斐波那契数列
function fb(n) {
  if (n === 1 || n === 2) {
        return 1
  }
  return fb(n - 1) + fb(n - 2)
}
console.log(fb(3))
// 利用递归函数求斐波那契数列(兔子序列)  1、1、2、3、5、8、13、21...
// 用户输入一个数字 n 就可以求出 这个数字对应的兔子序列值
// 我们只需要知道用户输入的n 的前面两项(n-1 n-2)就可以计算出n 对应的序列值
// 利用递归遍历数据
var data = [
	{
		id: 1,
		name: '家电'
	},
	{
		id: 2,
		name: '服饰'
	}
]
// 写一个程序, 可以从指定数组中获取指定id的数据
function fn(arr, id) {
	// arr : 代表数据的数组
	// id : 代表要取出来的商品id
	var obj = {}
	// 遍历数组
	arr.forEach(function (item) {
		// item = {id : 1,name : '家电'}
		if (item.id == id) {
			obj = item
  	}
	})
	// 返回值
  return obj
}
console.log(fn(data))
浅拷贝和深拷贝
  • 浅拷贝
var obj = {
	name : '张三丰',
	age : 22
}
var newObj = {}
for (key in obj) {
  newObj[key] = obj[key]
}
console.log(newObj)
  • 深拷贝
var obj = {
	name: '1张三丰',
	age: 22,
	messige: {
		sex: '男',
		score: 16
	},
	color: ['red', 'purple', 'qing']
}
var newObj = {}
function kaobei(newObj, obj) {
	for (key in obj) {
	if (obj[key] instanceof Array) {
		newObj[key] = []
		kaobei(newObj[key], obj[key])
	} else if (obj[key] instanceof Object) {
		newObj[key] = {};
		kaobei(newObj[key], obj[key])
	} else {
		newObj[key] = obj[key]
		}
	}
}
obj.messige.sex = 99
kaobei(newObj, obj)
console.log(newObj)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

resources下lib文件中的jar包怎么添加到git

这里讲怎么处理这部分的问题&#xff1a; 1&#xff1a;java maven resource 目录下的jar无法被添加到git 2&#xff1a;使用git命令添加jar包时报错&#xff1a;The following paths are ignored by one of your .gitignore files: ***&#xff0c;use -if **** 上面都是相同…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

Spring Boot技术中小企业设备管理系统设计与实践

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1

启动springboot项目时&#xff0c;出现了以下报错&#xff1a; defaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDjava.lang.IllegalStateException: Failed to load property source from location classpath:/application-local.yamlat o…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

【Sublime Text】设置中文 最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…

【Git】将本地代码提交到github仓库

一、创建仓库 复制这里的HTTP连接码 二、仓库初始化 进入你要提交的代码文件夹 右键选择 Git Bach Here 输入命令 git clone [HTTP连接码] 此时文件夹里会出现一个新的文件夹&#xff0c;将原来的文件当今这个新的文件夹 三、上传代码 执行命令 cd [新文件夹] 将所有文件放…

蓝牙技术的多种模式详解

蓝牙作为一种广泛应用的无线通信技术&#xff0c;已经在我们的日常生活中无处不在。随着技术的发展&#xff0c;蓝牙已经不再仅限于传统的音频传输&#xff0c;而是扩展到了各种应用领域。本文将深入探讨蓝牙的各种模式及其应用场景。 1. 经典蓝牙&#xff08;BR/EDR&#xff…

重生之“我打数据结构,真的假的?”--3.栈和队列(无习题)

栈和队列 C语言中的栈和队列总结 在C语言中&#xff0c;**栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;**是两种非常重要的数据结构。它们广泛用于各种应用中&#xff0c;比如内存管理、任务调度、表达式求值等。本文将对这两种数据结构进行详细的介…

从零开始的Go语言之旅(2 Go by Example: Values)

Go 语言有多种值类型&#xff0c;包括字符串、整数、浮点数、布尔值等。以下是一些基本示例。 package mainimport "fmt"func main() {fmt.Println("go" "lang")fmt.Println("11 ", 11)fmt.Println("7.0/3.0 ", 7.0/3.0)f…

深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)

目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但是作为基准数据集过于简单&#xff0c;在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…

你了解的spring框架有哪些

列举一些重要的Spring模块&#xff1f; Spring Core&#xff1a; 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IOC 依赖注入功能。**Spring Aspects ** &#xff1a; 该模块为与AspectJ的集成提供支持。Spring AOP &#xff1a;提供了面向方面的编程实现。…

logback 如何将日志输出到文件

如何作 将日志输出到文件需要使用 RollingFileAppender&#xff0c;该 Appender 必须定义 rollingPolicy &#xff0c;另外 rollingPollicy 下必须定义 fileNamePattern 和 encoder <appender name"fileAppender" class"ch.qos.logback.core.rolling.Rollin…

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…

Elliott Wave Prophet,艾略特波浪预测指标!预测未来走势!免费公式!(指标教程)

指标名称&#xff1a;艾略特波浪预测 Elliott Wave Prophet 版本&#xff1a;MT4 ver. 2.0 Elliott Wave Prophet &#xff0c;艾略特波浪预测指标是一款创新的外汇指标&#xff0c;旨在帮助进行波浪分析&#xff0c;并基于已形成的波浪来一定程度上预测未来的价格走势。Elli…

【设计模式-状态模式】

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在内部状态改变时改变它的行为。换句话说&#xff0c;这种模式让对象在不同的状态下能够表现出不同的行为&#xff0c;而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…

江协科技STM32学习- P21 ADC模数转换器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频

FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…

多线程初阶(七):单例模式指令重排序

目录 1. 单例模式 1.1 饿汉模式 1.2 懒汉模式 2. 懒汉模式下的问题 2.1 线程安全问题 2.2 如何解决 --- 加锁 2.3 加锁引入的新问题 --- 性能问题 2.4 指令重排序问题 2.4.1 指令重排序 2.4.2 指令重排序引发的问题 1. 单例模式 单例模式, 是设计模式中最典型的一种模…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…