javaScript常用知识点

news2024/10/7 18:24:17

1. this指向问题

在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。

  1. this指向的对象称为函数的上下文对象context;
  2. this的指向取决于函数被调用方式
  3. this的指向不是函数声明是绑定的,而是在函数运行过程中动态绑定的。
 

javascript

复制代码

1.全局环境输出this,指向谁,(window) 2.全局函数输出this,指向谁 (window) 3.对象的方法输出this,指向谁 (this 放在方法中指向调用这个方法的对象) 4.dom事件输出this,指向谁 (DOM 对象) 5.构造函数中的this,指向谁 (用来创建对象) 6.new关键字做了什么 new 会创建对象,将构造函数中的this指向创建的this 指向fn 7.箭头函数中的this指向谁 (没有this) 普通函数谁调用指向谁,箭头函数在哪里定义指向谁 箭头函数外指向谁就指向谁

2. 说说你对闭包的理解。

使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性

  • 函数嵌套函数。

  • 在函数内部可以引用外部的参数和变量

  • 参数和变量不会以垃圾回收机制回收

3. 如何实现浏览器内多个标签页之间的通信?
  • 调用 localstorge、 cookie等数据存储通信方式
4. call()和apply()的区别和作用是什么?

作用:

1 .作用都是在函数执行的时候,动态改变函数的运行环境(执行上下文)。 2 .call和 apply的第一个参数都是改变运行环境的对象。 3 .call()和apply()都是function 原型上的方法 用来改变this指向 4 .和它功能相似的还有bind()改变this指向,但bind()并没有立即执行,只是预先处理改变 this

区别:

call从第二个参数开始,每一个参数会依次传递给调用函数;apply的第二个参数是数组,数组的每一个成员会依次传递给调用函数。 call()比apply()性能更好些

 

javascript

复制代码

// call可以改变this指向,主要作用可以实现继承 let o = { name: "andy", }; function fn(a, b) { console.log(this); console.log(a + b); } fn.call(o, 3, 5); // apply 可以调用函数,改变this指向,第二个参数必须是数组形式 let arr = [1, 2, 3, 4, 5]; let max = Math.max.apply(Math, arr); console.log(max); //5 // 1.bind() 方法不会调用函数,但是能改变函数内部的this指向 // 2.返回由指定的this值和初始化参数改造的原函数拷贝 // 3.返回的是原函数改变this之后的新函数 // 4.如果有的函数我们不需要立即调用,但是又想改变函数内部的this指向此时用bind

5. 请解释一下 JavaScript的同源策略。

同源策略指的是协议、域名、端口相同。同源策略是一种安全协议。指一段脚本只能读取来自同一来源的窗口和文档的属性 同源策略是为了保证用户信息的安全,防止恶意的网站窃取数据,最初的同源策略是指不同网站下的cookie设置。

同源策略是浏览器给予Ajax技术的限制,服务器端是不存在同源政策的限制的。

6. 如何判断一个对象是否属于某个类?

使用 instanceof关键字,判断一个对象是否是类的实例化对象;使用 constructor属性,判断一个对象是否是类的构造函数。

7. 什么是事件代理(事件委托)?

事件代理( Event Delegation),又称为事件委托,是 JavaScript中绑定事件的常用技巧。顾名思义,“事件代理”就是把原本需要绑定的事件委托给父元素,让父元素负責事件监听。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能。

8.说明如何使用 JavaScript提交表单。

document .form [0] .submit();

9. 哪些关键字用于处理异常?
 

javascript

复制代码

try { // 执行代码 } catch { // 捕获异常 }

10. 数据类型

在这里插入图片描述

11. 暂时性死区

var 命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。 let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

12. 请求的发送方法:

AJAX概述:

AJAX 可以使网页实现异步更新,可以在不重新加载整个网页的情况系,对网页某个部分进行更新 XMLHttpRequest 是 AJAX 的基础

请求发送:

 

javascript

复制代码

/* 创建 XMLHttpRequest 对象使用 xhr.open(method,url,async) 方法发送到请求服务器, 一般传递三个参数: method:发送请求的类型 url:发送的地址 async:true(异步)或者false(同步) */ const xhr = new XMLHttpRequest(); /* 定义请求方法和路径 get 方式:请求参数在URL后边拼接,send()方法为空参 post 方式:请求参数在send()方法中定义 */ xhr.open("GET", "http://localhost:8000/home"); // 请求发送 xhr.send(); /*指定回调函数,由回调函数处理请求后的响应问题*/ xhr.onreadystatechange = function () { // 请求完成且响应正常 if (xhr.readyState === 4 && xhr.status === 200) { // 成功处理 let res = xhr.responseText } }

13. 把字符串中的字母大小写互换
 

javascript

复制代码

let str = 'FIRSTNAME是张,lastname是三' str = str.replace(/[a-zA-Z]/g, content => { // content是每一次正则匹配的结果 //验证方式把字母转换为大写后看和之前是否一样,如果一样之前就是大写 return content.toUpperCase() === content ? content.toLowerCase() : content.toUpperCase() }) console.log(str)

14. 字符串中的查找
 

javascript

复制代码

let str = "abcdefghijklmn"; let test = "gh"; ~(function () { // 遍历查找 // function myIndexOf(test) { // let lenT = test.length; // let lenS = this.length; // let res = -1; // // 判断被检测的test子符串长度是否大于str子符串长度 // if (lenT > lenS) { // return -1; // } // for (let i = 0; i < lenS - lenT; i++) { // if (this.substr(i, lenT) === test) { // res = i; // break; // } // } // return res; // } // 正则 function myIndexOf(test) { // console.log(this, "str字符串"); let reg = new RegExp(test); let res = reg.exec(this); return res === null ? -1 : res.index; } String.prototype.myIndexOf = myIndexOf; })(); console.log(str.myIndexOf(test));

15. 数组扁平化
 

javascript

复制代码

//使用 Infinity,可展开任意深度的嵌套数组 // flat会去除空项 var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]; arr4.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var arr = [1, 2, [3, 4]]; // 展开一层数组 arr.flat(); // 等效于 arr.reduce((acc, val) => acc.concat(val), []); // [1, 2, 3, 4] // 使用扩展运算符 ... const flattened = arr => [].concat(...arr);

16. 多维数组去重
 

javascript

复制代码

// 先把数组展开再去重 let arr = [1, 2, [1, 2, 3], [3, 5, [5, 8, [4, 5]]]]; arr = new Set( arr .toString() .split("") .map((item) => Number(item)) ); console.log(arr);

17. 数组中求最大值
 

javascript

复制代码

function getMax(arr) { let max = arr[0]; for (let i = 0; i <= arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } let res = getMax([2, 5, 6, 48, 8]); console.log(res); // 方法2 利用内置对象Math和es6的展开运算符 console.log(Math.max(...[2, 5, 6, 48, 8]));

18. 函数判断是否是闰年
 

javascript

复制代码

function isRunYear(year) { let flag = false; if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) { flag = true; } return flag; } console.log(isRunYear(2020));

19. 作用域链
  • 写在函数内部的是局部作用域
  • 如果函数中还有函数,那么在这个作用域中又诞生了一个作用域
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为作用域链
20. 预解析

javaScript代码是由浏览器中 javaScript 解析器来执行的,javaScript 解析器在运行 javaScript 代码的时候分为两步: 预解析和代码执行

  1. 预解析:会把所有 var 和 function 提升到当前作用域中的最前面

  2. 预解析分为两步: 变量提升:把所有的变量声明提升到当前作用域最前面, 不提升赋值操作 函数提升:把所有的函数声明提升到当前作用域最前面, 不调用函数

  3. 代码执行:按照代码的书写顺序从上往下执行

 

javascript

复制代码

//案列1 var num = 10; fun(); function fun() { console.log(num); // undefined var num = 20; } //案列2 var num = 10; function fun() { console.log(num);// undefined var num = 20; console.log(num);//20 } fun(); //案列3 var a = 10; fun(); function fun() { var b = 9; console.log(a);// undefined var a = "123"; console.log(b);//9 } //案例4 fun(); console.log(c); //9 console.log(b); //9 console.log(a); // 报错 function fun() { var a = (b = c = 9); // 相当于 var a=9,b=9,c=9 b和c直接赋值没有var当全局变量看 console.log(a); //9 console.log(b); //9 console.log(c); //9 }

21. 暂时性死区

var 命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。 let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

22. new关键字执行过程
  1. 在内存中创建一个新的空对象
  2. 让this指向这个新的对象
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法
  4. 返回这个新对象(所以构造函数里不需要return)
23. 从一个数组中随机出一个不重复的N个项的数组
 

javascript

复制代码

function getList(array) { let len = array.length; let t = null; let i = null; while (len) { i = Math.floor(Math.random() * len--); t = array[len]; array[len] = array[i]; array[i] = t; } return array; } let currentList=[1,2,3,4,5,6,7,8,9,10]; let newCurrentList = JSON.parse(JSON.stringify(currentList)); let res = getList(newCurrentList); console.log(res.slice(0, 5));

24.数组的插入排序
 

javascript

复制代码

function insertSort(arr) { var len = arr.length; for (var i = 1; i < len; i++) { var temp = arr[i]; var j = i - 1; //默认已排序的元素 while (j >= 0 && arr[j] > temp) { //在已排序好的队列中从后向前扫描 arr[j + 1] = arr[j]; //已排序的元素大于新元素,将该元素移到一下个位置 j--; } arr[j + 1] = temp; } return arr; } const arr = [4, 9, 2, 6, 7, 5]; console.log(insertSort(arr))

25.数组的二分插入排序(效率比插入排序高)
 

javascript

复制代码

function binaryInsertSort(arr) { var len = arr.length; for (var i = 1; i < len; i++) { var key = arr[i], left = 0, right = i - 1; while (left <= right) { //在已排序的元素中二分查找第一个比它大的值 var mid = parseInt((left + right) / 2); //二分查找的中间值 if (key < arr[mid]) { //当前值比中间值小 则在左边的子数组中继续寻找 right = mid - 1; } else { left = mid + 1; //当前值比中间值大 在右边的子数组继续寻找 } } for (var j = i - 1; j >= left; j--) { arr[j + 1] = arr[j]; } arr[left] = key; } return arr; } console.log(binaryInsertSort(arr));

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】小波变换在特征提取中的实践与应用

小波变换在特征提取中的实践与应用 一、小波变换的基本原理与数学表达二、基于小波变换的特征提取方法与实例三、小波变换在特征提取中的优势与展望 在信号处理与数据分析领域&#xff0c;小波变换作为一种强大的数学工具&#xff0c;其多尺度分析特性使得它在特征提取中扮演着…

云服务器部署Springboot项目

前端项目打包 修改ip地址 在控制台输入npm run build:prod 会产生dist文件 将dist文件中的内容移动至/usr/local/nginx/html目录下 后端项目打包 修改ip地址 执行clean操作 执行install操作 将生成的target文件中的jar包移动至/usr/local/src目录下 启动 注意⚠️&#xff…

【linux】Ubuntu 修改用户名

第一次打开Ubuntu时不小心把初始用户名“siriusiot”写成“siriousiot”&#xff08;多了一个o&#xff09; 。作为技术人&#xff0c;我们要保持严谨&#xff0c;我们要纠正过来&#xff08;其实就是单词拼错了怕被笑话&#xff09;。 打开终端&#xff0c;输入&#xff1a; …

Redis key(BigKey、MoreKey)的存储策略

1. MoreKey 案例 1.1 大批量往 redis 里面 插入2000w 测试数据key (1) Linux Bash 下面执行&#xff0c;插入 100w rootspray:~# for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt; done; 查看 rootspray:~# more /tmp/redisTest.…

ABAP报表开发总结---采购排产表

1.动态创建内表 1.1首先维护好一个子例程 FORM frm_add_fcat USING value1 value2 value3 value4.wa_fcat-fieldname value1.wa_fcat-inttype value2.wa_fcat-reptext value3.wa_fcat-intlen value4.APPEND wa_fcat TO it_fcat.CLEAR: wa_fcat. ENDFORM. "frm_add_f…

win/mac达芬奇19下载:DaVinci Resolve Studio 19

DaVinci Resolve Studio 19 是一款功能强大的视频编辑和调色软件&#xff0c;广泛应用于电影、电视和网络节目的后期制作。这款软件不仅提供了专业的剪辑、调色和音频处理工具&#xff0c;还引入了全新的DaVinci Neural Engine AI工具&#xff0c;对100多项功能进行了大规模升级…

Mamba 学习

Vision Mamba U-Mamba 以后的趋势&#xff1a; 1.Mamba模型机机制上和transform一样&#xff0c;但是参数量上做了改进&#xff0c;可以直接替代 2.vision上可以实时处理

游戏登录界面制作

登录界面制作 1.导入模块和初始化窗口 import subprocessimport tkinter as tkimport picklefrom tkinter import messageboxwindow tk.Tk()window.title(Welcome)window.geometry(450x300) 导入必要的模块&#xff0c;并初始化了主窗口window&#xff0c;设置了窗口的标题和…

一 Mybatis简介

一 Mybatis简介 1.1 简介 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 **MyBatis 是一款优秀…

JavaSE备忘录(未完)

文章目录 基本数据类型println 小知识除法( / ) 和 Infinity(无穷) 小知识除法InfinityInfinity 在除法中正负判断 求余(%) 小知识 基本数据类型 除 int、char 的包装类分别为 Integer、Character 外&#xff0c;其余基本数据类型的第一个字母大写就是它的包装类。 println 小…

微信小程序使用 Vant Weapp 中 Collapse 折叠面板 的问题!

需求&#xff1a;结合Tab 标签页 和 Collapse 折叠面板 组合成显示课本和章节内容&#xff0c;并且用户体验要好点&#xff01; 如下图展示&#xff1a; 问题&#xff1a;如何使用Collapse 折叠面板 将内容循环展示出来&#xff1f; js中的数据是这样的 代码实现&#xff1…

第二证券今日投资参考:人形机器再迎催化 钙钛矿电池产业化提速

昨日&#xff0c;沪指盘中在金融等板块的带动下强势拉升&#xff0c;一举打破3100点&#xff1b;但午后涨幅逐渐收窄。截至收盘&#xff0c;沪指微涨0.09%报3074.22点&#xff0c;深证成指跌0.05%报9376.81点&#xff0c;创业板指跌0.55%报1787.49点&#xff0c;上证50指数涨0.…

“We Need Structured Output”: 以用户为中心的大模型输出

发表机构&#xff1a;Google Research 这篇论文的核心是设计了一种系统&#xff0c;可以让开发者和用户对大型语言模型的输出施加结构性约束。系统的主要部分包括&#xff1a; 1. 用户界面&#xff08;GUI&#xff09;&#xff1a;允许用户通过图形界面来定义他们希望LLM遵守…

Meta Llama3 炸裂登场:一夜刷屏AI界,基准测试中一骑绝尘,GPT-4 Turbo遭遇强劲对手

在 2024年4月19 日&#xff0c;AI界迎来了一项重大突破&#xff1a;Meta 公司宣布推出了迄今为止最强大的新一代开源大语言模型 Llama3。这一消息无疑为我国AI产业的发展带来了新的希望和机遇。 &#x1f3af; Llama3 系列语言模型&#xff08;LLM&#xff09;包括 Llama3 8B …

深度剖析Gateway在微服务治理中的关键角色

目录 一、多层网关 二、Gateway 路由规则 2.1 路由 2.2 谓词 2.3 过滤器 三、路由声明规则 3.1 谓词 寻址谓词 请求参数谓词 时间谓词 自定义谓词 一、多层网关 首先我们先了解下一个请求是如何到达服务端并得到相应的。过程如图所示&#xff1a; 首先网址解析的第一步是 DN…

2024年分享酷我音乐如何下载mp3的方法

这里教大家用酷我音乐小程序的下载方法,小程序下载资源的方法有3种 1.利用专业的抓包工具(Fiddler/Charles)进行获取,然后分析数据包,最后直接用下载器下载分析出来的链接。强烈不推荐,因为大部分人并非程序员出身 2.录屏,录屏效率太慢,所以也不推荐 3. 利用专门的下载资源的…

第49篇:简易处理器<三>

Q&#xff1a;本期我们来设计实现以上介绍的简易处理器&#xff0c;并进行仿真。 A&#xff1a;简易处理器顶层.v文件代码&#xff0c;顶层文件中例化实现处理器的子模块3-8译码器以及寄存器。 仿真示例&#xff1a;DIN (100)8在30 ns时加载到 IR中&#xff0c;而DIN (100)8对…

基于LSTM的负荷预测

长短 期 记 忆 网 络 ( long short term memory&#xff0c; LSTM) &#xff3b;11-12&#xff3d;作为一种特殊的循环神经网络( recurrent neural network&#xff0c;&#xff32;NN) &#xff0c;主要用于解决长序列训 练过程中的梯度消失和梯度爆炸问题。典型的 LSTM 结构如…

高中数学:三角函数之考点精华-对称性相关问题

一、对称性的几种情况 1、1个对称点/对称轴 此种情况&#xff0c;用整体换元法解题 参考&#xff1a;三角函数的整体换元法 2、2个对称点 画图 如果两个对称点之间的距离是a&#xff0c;则函数周期T2a 3、2个对称轴 画图 如果两个对称轴之间的距离是a&#xff0c;则函数…

[Python开发问题] Selenium ERROR: Unable to find a matching set of capabilities

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…