Javascript知识点锦集

news2025/1/24 1:34:00

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/135165704
出自【进步*于辰的博客】

文章目录

  • 1、其他知识点链接
  • 7、关于 false
  • 8、关于 null 与 undefined
  • 9、关于js类、对象
    • 9.1 概述
    • 9.2 对象使用示例
  • 10、关于 var 与 let
    • 10.1 var
    • 10.2 let
    • 9.3 区别
  • 11、为什么js语句不需要分号结尾?
  • 12、关于js内置函数
    • 12.1 通用函数
    • 12.2 document对象函数
    • 12.3 Global对象函数
  • 13、如何解决“跨域”问题?
  • 14、关于js解构
  • 15、关于循环中的事件问题
  • 16、关于下拉框
  • 17、关于入口函数
  • 18、关于js对象相关
    • 18.1 创建对象
    • 18.2 建立继承关系
  • 19、阻止特殊行为
    • 19.1 默认行为
    • 19.2 冒泡行为
  • 最后

1、其他知识点链接

  1. Node.js;
  2. jsonp;

7、关于 false

参考笔记一,P10.3;笔记二,P46.2。

  1. 0、false、undefined、null、""''、NaN 的 boolean 值都是 false,即0;其他为 true;
  2. [][null][undefined]都会隐式转换成'',且无论[]嵌套几层,都视为一层。与0比较,都为 true,因为''0的 boolean 值都是 false;

8、关于 null 与 undefined

参考笔记一,P10.9;笔记二,P43.1。

定义:

  1. undefined:全局变量、属性;
  2. null:字面量,不会被隐式赋值给对象,表示尚未创建的对象。

区别:

  1. undefined 派生于 null,都表示“无效的值”,故相等。但属于不同的原始数据类型,故不全等;
  2. null 与 number 作算术运算,会将 null 视为0;而 undefined 与 number 作算术运算,得NaN
  3. typeof null为 Object,typeof undefined为 undefined。

注意:

  1. 若变量已声明而未定义,则为 undefined。故若想变量为 null,必须定义为 null;
  2. function()无返回值时,强行调用获取返回值,得 undefined。

一个小技巧: \color{orange}{一个小技巧:} 一个小技巧:
定义变量为 null,表示“空对象引用”。当需要将一个变量xx作为对象时,可如下:

var xx = null;// 初始化
......
xx = new Object;// 创建对象
......
if(xx == null)
......
xx = null;// 清除对象

通过比较变量xx是否为null来判断对象是否创建成功。

9、关于js类、对象

参考笔记一,P12.2/9。

9.1 概述

在js中,类与对象的界限没有那么明确。一般大写开头的是类,小写的是对象。

内置类: \color{green}{内置类:} 内置类:
Array、Boolean、Date、Function、Global、Math、Number、Object、RegExp、String以及各种错误类。
错误类包括:Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。
其中,Global 和 Math 在脚本程序初始化时创建,无需实例化。

内置对象: \color{purple}{内置对象:} 内置对象:
arguments,自动封装function中所有实参,类型为Array

宿主对象: \color{blue}{宿主对象:} 宿主对象:
“宿主对象”指由执行js脚本的环境提供的对象。

例如:将js脚本嵌入到html文件中,则宿主对象是浏览器对象,如:window、document、element、form 和 image。

9.2 对象使用示例

1、document。

// 创建标签
var script = document.createElement('script')// 引号内必须是标签名
// 创建文本节点(标签)
var text = document.createTextNode("console.log('这是一个js脚本')")
// 添加文本标签
script.appendChild(text)
// 添加标签
document.body.appendChild(script)

// 结果是在控制台打印“这是一个js脚本”

// createTextNode()与appendChild()的结果与innerHtml相同
script.innerHtml = '这是一个js脚本'

还有:

// 将新标签插入到<body>的第2个位置(作为第2个子标签)
document.body.insertBefore(script, 1)

// 删除<body>的第1个子标签
document.body.removeChild(0)

// 复制标签
var script2 = document.body.script.cloneNode()
// 若是(true),则表示可同时复制内容,但不能事件

// 替换标签
var div = document.createElement('div')
div.innerText = '这是一个div'
document.body.replaceNode(div, 1)
// 将刚刚创建的<script>替换成<div>

// 结果是页面显示“这是一个div”

10、关于 var 与 let

关于编译与解释,详述可查阅博文《Java知识点锦集》的第17项。
变量提升机制的一个小结:变量提升机制的本质就是声明与定义不同步的错觉
参考笔记二,P43.3、P46.1。

10.1 var

在解释时,解释器先扫描所有js脚本,将所有声明(包括变量和函数)移动到作用域顶端,且函数优先级高于变量。

示例:

console.log(str)
console.log(append)
// console.log(append(str))// 报错
var str = '中'
var append = function(str) {
    return str + '国'
}
console.log(str)
console.log(append(str))

经变量提升机制:

var append;
var str;
console.log(str)-----------------------A
console.log(append)--------------------B
// console.log(append(str))------------C
str = '中'
append = function(str) {
    return str + '国'
}
console.log(str)// 打印:中
console.log(append(str))// 打印:中国

输出结果:
在这里插入图片描述

变量提升机制将strappend()的声明移动到作用域顶部,故 A 和 B 的打印结果都是undefined
由于函数的优先级高于变量,所以append()先于str声明。但毕竟只是声明而非定义,因此在执行 C 时,append只是一个未知变量,还不是函数,故 解释 解释 解释报错。

为什么函数也会变量提升? \color{grey}{为什么函数也会变量提升?} 为什么函数也会变量提升?
因为函数也是一种变量。(1)、js中有一种 内部对象 \color{green}{内部对象} 内部对象Function;(2)、从函数声明var xx = function()可以看出。

10.2 let

let 与 var 具有相同的变量提升机制。不同的是,let 声明的变量在定义之前,存在 “暂时性死区” \color{red}{“暂时性死区”} 暂时性死区,即在定义前访问或赋值会报错。

示例:
将上一个示例稍作修改,var → let。(let 与 var 的变量提升机制相同,故经变量提升机制修改后的脚本相同,看上面)

console.log(str)
console.log(append)
let str = '中'
let append = function(str) {
    return str + '国'
}
console.log(str)
console.log(append(str))

输出结果:
在这里插入图片描述
意思是在初始化之前,不能访问。
初始化就是上述所说的定义。因此,从变量声明let append;到变量定义append = function(str) {}之间的代码区就是 “暂时性死区” \color{red}{“暂时性死区”} 暂时性死区

9.3 区别

  1. var 允许重复声明和定义,let 不允许;(重复声明和定义的本质其实变量提升后被覆盖
  2. 作用域不同;(因为 let 存在“暂时性死区”)
  3. let 不允许重复声明和定义是包括 var 和 let。(变量名相同就是同一个变量)

11、为什么js语句不需要分号结尾?

推荐一篇博文《js语句末尾是否需要加分号?》(转发)。
参考笔记二,P43.4。

因为在解释时会自动在行尾添加分号,除非下一行以(、[、/、+、-开头,且若下一行与下下一行仍能衔接,则继续拼接。

12、关于js内置函数

参考笔记一,P10.4、P11.3、P13.2;笔记三,P48.1/2。

12.1 通用函数

1parseInt(str):将字符串中的数字部分转换成数字,以字符截止,可用于去除小数。若首字符不是数字,得NaN

2Number(str):将字符串转换成数字,若字符串中包含非数字,得NaN

3list.find(item => {}):返回匹配的数组元素。
示例:

var platform = [{
    id: 1,
    name: 'C站'
}, {
    id: 2,
    name: 'B站'
}]

var result = platform.find(item => {// item 是数组元素,作为参数传入函数作为返回值
    if(item.id == '1')
        return true
})
console.log(result)// { id: 1, name: 'C站' }

var result = platform.find(item => {
    if (item.id == 3)
        return true
})
console.log(result)// undefined

var result = platform.find(item => {
    if (item.id == '1')
        return false
})
console.log(result)// undefined

var result = platform.find(item => {
    if (item.id == 3)
        return false
})
console.log(result)// undefined

四个示例中的if...使用的是’==‘(相等),而不是’==='(全等)。当然,也可以使用===,只是需要留意彼此类型(拿一个字符串去一组数字中查找,那肯定找不到,返回undefined)。

注意: \color{red}{注意:} 注意:这里的return的作用是终止循环,其返回值用于判断匹配的元素是否作为检索结果的依据,并不是检索结果(result)。

4str.slice(i):截取字符串。

5with():任何对变量或函数的引用都被认为是此对象的属性。
示例。

document.write(Math.sin())
// 等价于:
with(Math) {
	document.write(sin())
}

12.2 document对象函数

1innerHTML / innerText:设置盒子内容,前者会识别内容中的标签。
示例。

// 显示文字“content”,盒子<content>因没有样式而无法看出
document.body.innerHTML = "<content>China</content>";

// 显示文字“<content>China</content>”
document.body.innerText = "<content>China</content>";

2querySelector() / querySelectorAll():通过盒子名获取盒子。前者返回第一个,后者返回所有。

12.3 Global对象函数

  1. encodeURI(url) / decodeURI(url):对URI进行编码或解码,作用对象:不属于URI的特殊字符,如:特殊符号、汉字。
  2. encodeURIComponent(url) / decodeURIComponent(url):对URI进行编码或解码,作用对象:任何非标准字符(即非字母)。

示例:

var url = 'https://blog.csdn.net/m0_69908381?type=blog&name=进步*于辰'
var enurl1 = encodeURI(url)
var enurl2 = encodeURIComponent(url)
console.log(enurl1)
console.log(enurl2)

var deurl1 = decodeURI(enurl1)
console.log(deurl1)
var deurl2 = decodeURIComponent(enurl2)
console.log(deurl2)

打印结果:
在这里插入图片描述

13、如何解决“跨域”问题?

参考笔记三,P47.1。

1、设置请求允许范围。

response.setHeader("Access-Control-Allow-Origin", "*")
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081/g1")

大致如此,因语言而异。

2、jsonp:见第二个知识点;

3、配置代理(后续补充);

14、关于js解构

推荐一篇博文《js中的解构》(转发)。
参考笔记二,P47.3。

小结:(以var [a, b] = [1, 2]为例)

  1. 解构时格式必须相同;
  2. 当有重命名时,新变量才保留声明;
  3. 扩展运算符只能放在最后,如var [a, ...b]
  4. 变量个数与元素个数不必相同,取对应值,且可设置默认值;
  5. 解构对象时,若新变量已声明,则解构语句必须用()包裹,因为js规定括号才是一个语句块。

15、关于循环中的事件问题

参考笔记一,P10.11/12。

1、若事件在循环中,由于for一直执行,而事件在触发时才执行,故直接控制arr[i]无效(arr是盒子数组),需this

示例。

// 当时此循环用于设置一批<img>的src
$("#section3 .nav img").each(function(i,e){
	$(this).attr("src",arr2[i]);// arr记录着图片的路径
})

2、使用arr[i].index可设置盒子数组元素的索引(数组元素只是对应索引i,本身无索引),index可用于“链接”。(这个词的意思忘了,大家自行揣摩哈。。。)

示例。

$("#section3 .nav img").each(function(i,e){
	$(this).attr('index', i)
	// 为前5张图添加点击事件,点击时修改路径
	if($(this).attr('index') < 5) {// 需要使用index进行判断,而不能是 i < 5
		$("#section3 .nav img").eq(i).click(function(){\
			$(this).attr("src",arr2[i]);
		})
	}
})

16、关于下拉框

参考笔记一,P12.1。

示例。

<select name="platform">
	<option value="p1">CSDN</option>
	<option value="p2">bilibili</option>
</select>

获取。

var sel = $("select[name=platform]")
var seli = sel.attr('selectedIndex')// 选中项的索引
var options = sel.attr('options')// 所有option的数组

17、关于入口函数

参考笔记一,P13.1。

页面加载的顺序是自上而下,步骤是先将标签载入 D O M 树 \color{green}{DOM树} DOM,再加载内容。
示例。

<script>
    var img = document.querySelector('img')
    img.src = 'img/2.jfif'
</script>
<img src="" alt="">

在执行querySelector()时,由于还未加载<img>,故找不到,则imgundefinedimg.src报错。

解决办法:
1、js原生语法:window.onload = function() {}。控制函数内代码在所有内容加载完成后执行。即:

<script>
    window.onload = function() {
        var img = document.querySelector('img')
        img.src = 'img/2.jfif'
    }
</script>
<img src="" alt="">

2、jq语法:$(document).ready(function() {})。控制函数内代码在DOM树加载完成后执行。即:

<script>
    $(document).ready(function() {
        var img = document.querySelector('img')
        img.src = 'img/2.jfif'
    })
</script>
<img src="" alt="">

或简写:

<script>
    $(function() {
        var img = document.querySelector('img')
        img.src = 'img/2.jfif'
    })
</script>
<img src="" alt="">

后者较前者延迟少,前者较后者可靠性高,前者在一个页面中只能有一个,后者可多个。

至于可靠性,一般情况下两者差别不大(加载完DOM树与加载完内容的确差别不大)。不过,例如图片较大,需要较长时间加载,而js脚本中包含对图片像素层面的处理,这种情况下使用$(function() {})就可能有问题。

18、关于js对象相关

参考笔记一,P13.3、P14.11。

18.1 创建对象

1、字面量。
var platform = {
	id: 1,
	name: 'csdn'
}

2var platform = new Object()
platform.id = 1
platform.name = 'csdn'

3var platform = function() {
	this.id = 1
	this.name = 'csdn'
}
var p1 = new platform()

4var platform = new Object()
var csdn = Object.create(platform)// 同时建立继承关系

18.2 建立继承关系

js不属于 “面向对象” \color{green}{“面向对象”} 面向对象的编程语言,故没有明显的继承关系(extends)。要实现“继承”,需要额外建立,js中的“父类”称之为 原型 \color{blue}{原型} 原型(prototype)。

示例。

let platform = function() {}
let CSDN = function() {}
// 实例化,可以不加 ()
var p1 = new platform()
var c1 = new CSDN() 

Object.setPrototypeOf(c1, p1)// 建立继承关系
Object.getPrototypeOf(c1)// 获取原型,返回:platform {}
p1.isPrototypeOf(c1)// 判断继承关系,返回:true

19、阻止特殊行为

19.1 默认行为

推荐一篇博文《默认行为及阻止》(转发)。
参考笔记三,P48.4。

“默认行为”指标签自带的事件,如:<a>点击,<input>输入。阻止方法:

  • 方法一:使用标签调用addEventListener('xx', e => {})。其中,xx是行为标识,如:click点击、contextmenu页面右键菜单、keydown键盘输入、submit提交;再调用e.preventDefault()。(在IE8之后版本有效)
  • 方法二:window.event.returnValue = false,固定写法。
  • 方法三:为标签添加相应事件,定义函数的返回值为false或调用e.preventDefault()。(这是jq方法,前两种是js原生方法)

19.2 冒泡行为

推荐一篇博文《html消除冒泡,jquery阻止元素冒泡的两种方法》(转发)。
参考笔记一,P14.10。

“冒泡”行为指由于盒子嵌套关系中,当子盒子的事件执行完成后再触发父盒子事件的情况。阻止方法:

  • 为子盒子事件函数添加return;
  • 在子盒子事件的函数中调用e.stopPropagation()

这两种方法都是通过jq实现,js原生方法暂且不讨论。

最后

我所知的编写js脚本比较好的方法:(1)F12控制台;(2)HTML文件;(3)vscode。第一种最便捷,但不方便编写多行js脚本,目前我用第三种。

本文持续更新中。。。

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

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

相关文章

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式&#xff1f; 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

抖店只能用官方电子面单?2024抖店玩法解读,附面单使用教程

我是王路飞。 正在做抖店的商家&#xff0c;应该都发现一件事情了&#xff0c;那就是现在的抖店好像不让拍单了&#xff0c;只能使用抖音的电子面单&#xff0c;打单发货。 说实话&#xff0c;这种情况已经出现过太多次了&#xff0c;导致很多商家不以为然。 我曾经也说过&a…

Midjourney v6 正式发布,AI创新工坊同步更新

Midjourney v6 开发团队将从2023 年 12 月 21 日今晚开始&#xff0c;在寒假期间让社区测试Midjourney v6模型的 alpha 版本。 要打开它&#xff0c;V6请从提示下方的下拉菜单中选择/settings或--v 6在提示后键入。 Midjourney v6 基本型号有哪些新功能&#xff1f; 更准确的…

受控代码生成-CCS 23

Large Language Models for Code: Security Hardening and Adversarial Testing 1.Introduction2.Background3.受控代码生成4.SVEN4.1.Inference4.2.Training4.2.1.训练样本4.2.2.loss函数 4.3.数据集构建 5.使用场景5.1.安全性增强5.2.对抗测试 6.实验6.1.实验设置6.2.Main Ex…

【数据结构和算法】---栈和队列的互相实现

目录 一、用栈实现队列1.1初始化队列1.2模拟入队列1.3模拟出队列1.4取模拟的队列头元素1.5判断队列是否为空 二、用队列实现栈2.1初始化栈2.2模拟出栈2.3模拟入栈2.4取模拟的栈顶元素2.5判读栈是否为空 一、用栈实现队列 具体题目可以参考LeetCode232. 用栈实现队列 首先要想到…

目标检测应用场景—数据集【NO.24】行人车辆检测数据集2

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

Neural-Chat-7B:Intel如何塑造下一代对话AI

引言 在人工智能的领域中&#xff0c;对话模型的进步正改变我们与技术的互动方式。Intel近期推出的Neural-Chat-7B模型&#xff0c;不仅标志着对话AI的一大步前进&#xff0c;更预示着未来人机交流的新方向。本文将深入探索这一模型的核心特性、训练过程及其在实际应用中的潜力…

【内存泄漏】Malloc Debug 和 libmenunreacbale 原理介绍

内存泄漏检测原理介绍 malloc debug 原理介绍 分为初始化和内存泄漏检测两个阶段介绍。 初始化阶段 整体流程如下图 libc 初始化时通过 __libc_init_malloc 函数调用 MallocInitImpl 来初始化 memory allocation framework。 // malloc_common_dynamic.cpp static const…

2024应届大学生,为云计算高薪岗位做好准备了吗?

云计算正处于快速发展阶段&#xff0c;对于企业和个人来说&#xff0c;云计算提供了方便、灵活和智能的解决方案&#xff0c;对各行各业都有着重要的影响和推动作用。 随着云计算新市场、新业务、新应用的不断出现&#xff0c;人力需求迅猛。国家相继出台一系列政策大力扶持云…

结构型模式 | 适配器模式

一、适配器模式 1、原理 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类&#xff1a;类适配器模式、对象适配器模式、接口…

什么是Web 3.0以及为什么它很重要【译文】

作者&#xff1a;马克斯-默施和理查德-穆尔黑德 什么技术使30多亿人每天80%的清醒时间受益&#xff1f;就是Web 2.0。 Web 2.0是OReilly等人在1999年至2004年间提出的&#xff0c;它将世界从为信息消费而设计、由昂贵的服务器提供的静态桌面网页转向互动体验和用户生成的内容&a…

革命性突破:Great River推出XL高速ARINC 818传感器测试卡

Great River Technology荣幸地宣布&#xff0c;与RVS&#xff08;远程视觉系统&#xff09;2.0平台合作推出的XL高速ARINC 818传感器测试卡正式亮相。这款开创性的测试卡在柯林斯航空电子公司&#xff08;RTX业务部&#xff09;和波音公司开发和测试RVS 2.0系统中发挥了重要作用…

【Spring Security】认证密码加密Token令牌CSRF的使用详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Security》。&#x1f3af;&#x1f3af; …

P3375 【模板】KMP

【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​&#xff0c;若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同&#xff0c;则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了&#xff0c;其出现位置为 l l l。 现在请你求…

关于使用libnet时性能下降的问题分析

Libnet是一个用于构建和注入网络数据包的便携式框架。它提供了在IP层和链路层创建数据包的功能&#xff0c;以及一系列辅助和补充功能。Libnet非常适合编写网络工具和网络测试代码。一些使用libnet的项目包括arping、ettercap、ipguard、isic、nemesis、packit、tcptraceroute和…

Ubuntu 常用命令之 scp 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 SCP&#xff08;Secure Copy&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;的文件传输协议&#xff0c;它可以在本地和远程主机之间安全地复制文件。在Ubuntu系统下&#xff0c;我们可以使用scp命令来实现这个功…

异步消息原理

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 在日常开发中&#xff…

什么是递归

概述 递归是一种解决问题的方法&#xff0c;它通过将一个问题分解为同样类型的子问题来解决问题。在递归中&#xff0c;函数会调用自身&#xff0c;并向下逐步解决问题&#xff0c;直到到达问题的基本情况。 递归的示例可以是计算一个数的阶乘。阶乘的定义是对于正整数n&…

React学习计划-React16--React基础(五)脚手架创建项目、todoList案例、配置代理、消息订阅与发布

一、使用脚手架create-react-app创建项目 react脚手架 xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查、jsx编译、devServe…&#xff09;下载好了所有相关的依赖可以直接运行一个简单的效果 react提供了一个…

Flink快速部署集群,体验炸了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…