首页 > 编程语言 >[javascript]知识点

[javascript]知识点

时间:2024-04-14 12:44:05浏览次数:10  
标签:知识点 console log javascript platform str var id

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18031963
出自【进步*于辰的博客

目录

1、其他知识点链接

  1. 细节、经验
  2. Node.js
  3. jsonp

2、严格模式

待输入。。。

3、类、对象

参考笔记一,P12.2/9、P13.3、P14.11。

3.1 介绍

JS是弱类型语言,类与对象的界限没有那么明确。一般大写开头的是类,小写的是对象。

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

2:内置对象

  1. arguments:自动封装function()中所有实参,类型为Array

3:宿主对象
“宿主对象”指由执行js脚本的环境提供的对象。
例如:将js脚本嵌入到html文件中,则宿主对象是浏览器对象,如:window、document、element、form 和 image。

示例。
使用 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”

3.2 自定义对象

3.2.1 创建对象方法

1:字面量。

var platform = {
	id: 1,
	name: 'csdn',
    setName: name => {
        this.name = name
    }
}

2:Object构造函数。

var platform = new Object()		// 可省略 ()
platform.id = 1
platform.name = 'csdn'
platform.setName = name => {
    this.name = name
}

3:自定义构造函数。

var platform = function(id, name) {
    this.id = id
    this.name = name
}
// 属性prototype是原型,即父类。setName()在prototype中
platform.prototype.setName = name => {
    this.name = name
}
var p1 = new platform(1, 'csdn')
p1.set(2, '博客园')

4:原型。

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

5:类。

class Platform {
    constructor(id, name) {// 构造函数
        this.id = id
        this.name = name
    }
    setName = name => {
        this.name = name
    }
}
var p1 = new Platform(1, 'csdn')

3.2.2 建立继承关系

JS不属于“面向对象”的编程语言,故没有明显的继承关系(extends)。要实现“继承”,需要额外建立,JS中的“父类”称为原型(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

4、变量

我们先来看一个示例。

var platform = function() {
    console.log(id)     // undefined
    var id = 'csdn'
}
platform()
console.log(id)     // id is not defined

输出undefined是因为 var 的变量提升机制,报错说明id的作用域是函数。把 var 换成 let

var platform = function() {
    console.log(id)     // Cannot access 'id' before initialization
    let id = 'csdn'
}
platform()
console.log(id)     // id is not defined

第一个报错是因为“暂时性死区”,第二个报错同理。

那如果没有修饰符呢。

var platform = function() {
    console.log(id)     // id is not defined
    id = 'csdn'
}
platform()
console.log(id)     // csdn

没有变量提升故报错,输出csdn说明id是全局变量。

结论:由varlet声明或定义的变量是局部变量,作用域为当前上下文;而直接定义(没有修饰符)的变量是全局变量。因此,可以认为var/let定义了变量的作用域。
注:这也是解释型语言的一个特点,这种现象也称为“懒散模式”,使用“严格模式”这一弊端(意外创建全局变量)。

5、this

推荐一篇博文《JS this详解》(转发)。
参考笔记二,P6.1。

内容正在整理,大家可查阅这篇文章。

10、关于 var 与 let

参考笔记二,P43.3、P46.1。

前言

  1. 关于编译与解释,详述可查阅博文《[Java]知识点》的第17项。
  2. 变量提升机制的本质就是声明与定义不同步的错觉。

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只是一个未知变量,还不是函数,故$解释$报错。

为什么函数也会变量提升?
因为函数也是一种变量。

  1. js中有一种内部对象Function
  2. 从函数声明var xx = function()可以看出。

10.2 let

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

示例:
将上一个示例稍作修改,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) {}之间的代码区就是“暂时性死区”。

9.3 区别

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

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

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

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

12、内置函数

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

12.1 通用函数

摘要 参数说明 返回值类型/返回值 说明
parseInt(str) 将字符串中的数字部分转换成数字,以字符截止。可用于去除小数。若首字符不是数字,得NaN
Number(str) 将字符串转换成数字。若字符串中包含非数字,得NaN
list.find(item => {}) 返回匹配的数组元素
str.slice(i) 截取字符串
eval(str) 将字符串作为js脚本执行
type(a) 返回变量类型。同指令type a

12.1.1 list.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)。

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

12.2 document对象函数

摘要 参数说明 返回值类型/返回值 说明
innerText 设置标签内容
innerHTML 设置标签内容。会识别内容中的标签
querySelector() 通过盒子名获取盒子。返回第一个
querySelectorAll() 通过盒子名获取盒子。返回所有

12.2.1 innerHTML、innerText

示例。

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

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

12.3 Global对象函数

摘要 参数说明 返回值类型/返回值 说明
encodeURI(url) 对URL进行编码。作用对象:不属于URI的特殊字符,如:特殊符号、汉字
encodeURIComponent(url) 对URL进行编码。作用对象:任何非标准字符(即非字母)
decodeURI(url) 对URL进行解码。作用对象:不属于URI的特殊字符,如:特殊符号、汉字
decodeURIComponent(url) 对URL进行解码。作用对象:任何非标准字符(即非字母)

示例。

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个知识点。

3:配置代理(后续补充)。

14、关于解构

推荐一篇博文《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]);
		})
	}
})

17、入口函数

参考笔记一,P13.1。

页面加载的顺序是自上而下,步骤是先将标签载入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() {})就可能有问题。

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脚本,目前我用第三种。

本文持续更新中。。。

标签:知识点,console,log,javascript,platform,str,var,id
From: https://www.cnblogs.com/cnb-yuchen/p/18031963

相关文章

  • JavaScript基础
    JavaScript一、js编写位置位置1:script标签中<scripttype="text/javascript"> vara=1;...</script>位置2:标签中绑定事件<buttononlick="alert(123);">Click</button>位置3:超链接的href属性中<ahref="javascript:alert('......
  • JavaScript 迈入 AI 新纪元
    随着人工智能技术的不断进步,JavaScript也迎来了自己的AI时代。JS-Torch是一个全新的深度学习库,专为JavaScript设计,其语法习惯与广受欢迎的PyTorch框架高度相似。这个库提供了一整套深度学习工具,包括可追踪梯度的张量对象、多层网络结构以及自动微分功能。PyTorch,作为JS......
  • 等保三级技术知识点(上)
    1.等级保护实施概述.1参照标准等级保护实施过程主要参见《信息安全技术信息系统安全等级保护实施指南》,其它标准参见国家及行业统一标准。在信息系统总体安全规划,安全设计与实施,安全运行与维护和信息系统终止等阶段,应按照GB17859-1999、GB/T22239-2008、GB/T20269-200......
  • JavaScript Array方法汇总
    函数名定义返回值是否改变原数组是否生成新数组push向数组的末尾添加一个或多个元素返回新的数组长度是否pop删除并返回数组的最后一个元素返回数组的最后一个元素是否unshift向数组的开头添加一个或多个元素返回新的数组长度是否shift删除数组的第一项返回第一个元素的值。若......
  • JavaScript String方法汇总
    方法名定义返回值是否改变原字符串是否生成新字符串charAt()查找指定位置的元素返回元素否否concat()连接两个或多个字符串返回连接后的字符串否是indexOf()indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回-1。返回查找到的......
  • 【华为OD】2024年华为OD机试C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客华为OD机试2024年C卷真题题集题库,有2种分数的题目列表,分别是100分的列表、200分的列表需要订阅请看链接:C卷100......
  • 深入浅出 妙用Javascript中apply、call、bind
    这篇文章实在是很难下笔,因为网上相关文章不胜枚举。巧合的是前些天看到阮老师的一篇文章的一句话:“对我来说,博客首先是一种知识管理工具,其次才是传播工具。我的技术文章,主要用来整理我还不懂的知识。我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写。炫耀从来......
  • JavaScript处理异步循环的技术详解
    文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕)正文使用async/await和Promise:优势:代码简洁,易读,适用于处理依赖关系较强......
  • 多线程知识点
     1.多线程基本概念1)概念:多线程简单来说是一个程序具备同时执行多个功能的能力。在多线程中,这些功能被称为线程,每个线程都有自己的执行路径,它们可以并行(xíng)运行,同时共享程序的资源与内存。而在传统的单线程程序中,代码会顺序执行,一个任务完成后才会开始下一个任......
  • JavaScript 中的深度学习
    JS-PyTorch是一个JavaScript库,从头开始构建,以紧密跟随PyTorch的语法。它以一种文档完备、单元测试和可解释的方式实现,因此可以帮助其他JavaScript学习者进入机器学习!欢迎尝试Web演示!(本文视频讲解:java567.com)1.简介src/tensor.ts包含一个完全功能的张量(Tensor)对象,可以......