初识JS

简介: 这篇内容介绍了JavaScript的基础知识,包括DOM和BOM(相当于内置模块和第三方模块)、变量的声明(var、let、const的特点和区别)、数组操作(如push、pop、splice等)、字典操作以及DOM操作示例。变量部分强调了var的变量提升和块级作用域问题,let和const的块级作用域和不可重复声明,以及const用于创建不可变的常量。在实际应用中,展示了如何动态改变HTML元素内容和创建新元素的示例。

JavaScript

JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都可以使用 JavaScript。

  • DOM&BOM

相当于内置模块

  • JQuery

相当于第三方模块

1.变量

var a;              /*正常变量,具有函数作用域*/

let y = "原神";      /*正常变量,具有块级作用域*/

const PI = "3.14";  /*声明常量/*

三者特点

var:

1、存在变量提升

console.log(a); // undefined
var a = 10;
// 编译过程
var a;
console.log(a); // undefined
a = 10;

2、一个变量可多次声明,后面的声明会覆盖前面的声明

var a = 10;
var a = 20;
console.log(a); // 20

3、在函数中使用var声明变量的时候,该变量是局部的

var a = 10;
function change(){
    var a = 20;
}
change();
console.log(a); // 10

而如果在函数内不使用var,该变量是全局的

var a = 10;
function change(){
  a = 20
};
change();
console.log(a); // 20
let:

1、不存在变量提升,let声明变量前,该变量不能使用(暂时性死区)。

console.log(a); // ReferenceError: a is not defined
let a = 10;
2、let命令所在的代码块内有效,在块级作用域内有效
{
    let a = 10;
}
console.log(a);  // ReferenceError: a is not defined

3、let不允许在相同作用域中重复声明,注意是相同作用域,不同作用域有重复声明不会报错

let a = 10;
let a = 20;
// Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 10;
{
    let a = 20;
}
const:

1、const声明一个只读的变量,声明后,值就不能改变

const a = 10;
a = 20;  // TypeError: Assignment to constant variable.

2、const必须初始化

const a;  // SyntaxError: Missing initializer in const declaration
const a = 10; // ok

3、const并不是变量的值不能改动,而是变量指向的内存地址所保存的数据不得改动

const obj = {
    age: 17
}
obj.age = 18;  // ok
obj = {
    age: 18
}
//  SyntaxError: Identifier 'obj' has already been declared

4、let该有的特点const都有

区别

1,变量提升

var声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined

let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错

2,块级作用域

var不存在块级作用域

let和const存在块级作用域

3,重复声明

var允许重复声明变量

let和const在同一作用域不允许重复声明变量

4,修改声明的变量

var和let可以

const声明一个只读的常量。一旦声明,常量的值就不能改变,但对于对象和数据这种引用类型,内存地址不能修改,可以修改里面的值。`

使用

能用const的情况下尽量使用const,大多数情况使用let,避免使用var。

const > let > var

const声明的好处,一让阅读代码的人知道该变量不可修改,二是防止在修改代码的过程中无意中修改了该变量导致报错,减少bug的产生。let声明没有产生预编译和变量提升的问题,先声明再使用可以让代码本身更加规范,let是个块级作用域,也不会污染到全局的变量声明。

最后说一点就是使用的场景说明:let一般应用于基本数据类型;const 一般应用于引用数据类型,也就是函数对象等。

var常见功能:
var GenShen = "原神"

var name = "原神启动!";

var a1 = name.length;//获取name长度
var a2 = name[0];//原||name[0]==name.charAt(0)
var a3 = name.trim()//去除空白
var a4 = name.substring(0,2);//前取后不取||原神

实列

 <span id="txt"> 豆✌,伟大,无需多言!!! </span>
<script>
        function show() {
            // 在HTML中找到目标并获取内容(DOM)
            let tag = document.getElementById("txt");//拿到标签对象
            let darastring = tag.innerText;//获取目标内容
            /* console.log(darastring)*/

            // 2.动态起来:把文本的第一个字符放在字符串的最后。
            let firstchar = darastring[0];
            let others = darastring.substring(1, darastring.length);
            let newtxt = others + firstchar;
            console.log(newtxt)

            // 3,在HTML中更新内容
            tag.innerText = newtxt;
        }

        //js中的定时器
        setInterval(show, 200);//每()ms执行一次show
</script>

2.数组

let a1 = [1,2,3,4];
let a2 = Array([1,2,3,4]);

a1[0] = "原神";

a1.push("原神启动!");   //尾部追加字符:[1,2,3,4,"原神启动!"]
a1.unshift("原神启动!")   //尾部追加字符:["原神启动!",1,2,3,4]
a1.splice(索引位置,0,元素);
a1.splice(1,0,"原神");     //尾部追加:[1,"原神",2,3,4]

a1.pop()        //尾部删除
a1.shift()        //头部删除
a1.splice(索引位置,1)
a1.splice(2,1);     //删除索引为2的元素:[1,2,4]

循环

let a1 = [1,2,3,4];
for(let item in a1){
    //idx=0/1/2/3/    data=a1[idx]
}

for(let i=0; i<a1.length; i++){
    // i=0/1/2/3/   data=a1[i]
}

实例

<script>
        let cityname = ['213','321','123'];
        for(let idx in cityname){
            let text = cityname[idx]

            //创建<li></li>
            let tag=document.createElement("dd");

            //在li标签中写入内容
            tag.innerText = text;
            // tag.innerText = text;

            //添加到id=city中
            let biaoqian = document.getElementById("city");
            biaoqian.appendChild(tag);
        }
</script>

3.字典

info = {
    "game" : "原神",
    "computer" : "联想"
}
info.game = "崩坏"
info["computer"] = "华硕"

delete info["game"]
info = {
    "game" : "原神",
    "computer" : "联想"
}

for(let i in info){
    //i = game/computer|键   data=info[i]|值
}

实例

<form id="pinglun">
        <br>
        <input style="width: 200px" type="text" id="username" placeholder="yout username" required>
        <br>
        <br>
        <textarea style="width: 200px" id="users" placeholder="评论..." required></textarea>
        <button type="submit">提交</button>
</form>
<div id="pingluns"></div>

<script>
        document.getElementById('pinglun').addEventListener('submit', function(e) {
            e.preventDefault(); // 阻止表单默认提交行为
            // 这一行首先获取了HTML中id为'commentForm'的表单元素,并给它添加了一个提交事件监听器。
            // 当表单被提交时(例如用户点击“提交”按钮),这个匿名函数将会执行。
            const username = document.getElementById('username').value;
            const userComment = document.getElementById('users').value;
            // 这行代码阻止了表单的默认提交行为,也就是浏览器不会重新加载页面或导航到新的URL。
            // 在这里我们不需要页面刷新,而是希望通过JavaScript来处理提交动作。

            // 下面两行代码获取用户在表单中填写的用户名和评论文本
            const commentDiv = document.createElement('div');
            // 设置这个新创建的`div`元素的文本内容,包含用户名和评论内容
            commentDiv.textContent = `${username}: ${userComment}`;

            // 把新创建的评论元素添加到ID为'commentsList'的HTML元素内部,这样它就出现在了页面的评论列表中
            document.getElementById('pingluns').appendChild(commentDiv);

            // 清空表单中的用户名和评论文本框以便用户再次输入新的评论
            document.getElementById('username').value = '';
            document.getElementById('users').value = '';
        });           
</script>

DOM

js模块,对HTML页面标签进行操作

//通过ID获取标签
let doms = document.getElementById('GengShen');
//获取标签文本
doms.innerText;
//修改标签文本
doms.innerText = "原神启动!"; 
//创建标签
let make = document.createElement('div');
//标签内写文本
make.innerText = "原神启动!";
相关文章
|
JavaScript
Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)
近日,Bert-vits2-v2.2如约更新,该新版本v2.2主要把Emotion 模型换用CLAP多模态模型,推理支持输入text prompt提示词和audio prompt提示语音来进行引导风格化合成,让推理音色更具情感特色,并且推出了新的预处理webuI,操作上更加亲民和接地气。
Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)
|
小程序 Linux 程序员
如何配置frp到linux服务器和windows本地,服务端支持自启动
如何配置frp到linux服务器和windows本地,服务端支持自启动
1666 0
如何配置frp到linux服务器和windows本地,服务端支持自启动
|
小程序 开发者 安全
福利!支付宝小程序开发必备的7款开源DEMO
相比于APP,小程序已经大大降低了开发者们的学习和开发的门槛。而如何进一步提高小程序开发者的学习和开发效率,一直是支付宝小程序团队非常重视的课题。对于开发者而言, 文档可以提供基础的引导,而针对性的、基于常见场景的DEMO则更为直观清晰易懂,可以大大节约上手的成本。
7709 0
福利!支付宝小程序开发必备的7款开源DEMO
|
7月前
|
监控 算法 Java
JVM—垃圾收集算法和HotSpot算法实现细节
JVM的垃圾收集算法和HotSpot的实现细节复杂但至关重要,通过理解和掌握这些算法,可以为Java应用程序选择合适的垃圾收集器,并进行有效的性能调优。选择适当的垃圾收集策略,结合合理的内存配置和日志分析,能够显著提升应用的运行效率和稳定性。
122 15
|
8月前
|
搜索推荐
企业CRM新选择——轻巧强大的阿里云上的Salesforce CN 企业版正式发布!
企业CRM新选择——轻巧强大的阿里云上的Salesforce CN 企业版正式发布!
|
7月前
|
自然语言处理 算法 API
一文揭秘|如何速成RAG+Agent框架大模型应用搭建(一)
一文揭秘|如何速成RAG+Agent框架大模型应用搭建
389 0
|
C# 开发者 Windows
4款.NET开源、功能强大的Windows桌面工具箱
4款.NET开源、功能强大的Windows桌面工具箱
225 0
|
Ubuntu Shell
蓝易云 - ubuntu修改默认文件权限umask
以上就是在Ubuntu中修改默认文件权限umask的方法。
257 0
|
网络虚拟化
【专栏】探讨了STP、RSTP和MSTP三种生成树协议的原理、特点及差异,附思科和华为双厂商命令示例
【4月更文挑战第28天】本文探讨了STP、RSTP和MSTP三种生成树协议的原理、特点及差异。STP通过计算生成树消除环路,但收敛速度慢;RSTP加快了收敛速度,增加了新端口角色;MSTP支持多实例,提高灵活性和扩展性。文中还提供了思科和华为设备的命令示例,强调了协议选择、配置一致性和性能优化在实际应用中的重要性。理解并合理应用这些协议能保障网络的稳定和可靠性。
1524 0
|
Ubuntu 定位技术 Python
numpy库报错has no attribute ‘_no_nep50_warning‘的解决
numpy库报错has no attribute ‘_no_nep50_warning‘的解决
329 1

热门文章

最新文章