JavaScript入门记录

本文详述了JavaScript的基础知识,包括变量、条件控制、调试、数据类型、数组、对象、函数、作用域、面向对象编程以及DOM操作。讲解了如何配置VSCode的JavaScript环境,涉及Node.js安装、VSCode插件与ES6支持。同时,介绍了JSON、BOM对象以及常见的事件处理。文章还探讨了JavaScript的特性,如弱类型、闭包和函数作为对象的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我缝合了狂神和老杜的视频,一起看的

深入浅出JavaScript-老杜JavaScript基础教程全套完整版【JavaScript从入门到实战】_哔哩哔哩_bilibili

​​​​​​​​​​​​​​​​​​​​​​​​​​​【狂神说Java】JavaScript最新教程通俗易懂_哔哩哔哩_bilibili

JavaScript是一种弱类型的语言,代码无须经过编译,直接由浏览器解释运行

配置vscode的js环境方面。

首先是node.js的安装与配置

node.js安装及环境配置超详细教程【Windows系统安装包方式】 - 知乎

这篇文章写得很好很详细

​​​​​​VSCode 配置javascript环境,你知道吗?_我就是个渴望成长的小菜鸡的博客-优快云博客_vscode配置javascript

这边讲了vscode需要下载的插件、

还有就是vscode支持es6语法的问题,可以看这篇文章

vscode无法识别es6语言_weixin_46027346的博客-优快云博客_vscode不识别es6

js可以在html里面写

喜闻乐见的helloworld

    <script>
        alert("Hello world!");
    </script>

 

引过来的方式和css不同

千万不要瞎搞自闭合

注意不论是在HTML里写还是引进,一定要放在body下面

语法入门

注意,脚本语言是逐行解释的,不是先编译再运行的

1.变量

var a=1;弱类型语言,只有一个var

但是还是会严格区分大小写的

甚至还能不用var关键字定义,甚至这样还默认是个全局变量,特别恐怖

加个'use strict';这句话在要strict的代码之前就行。因为脚本语言逐行解释

在es6中,我们不用var,而是用let来定义局部变量 

但是有个东西叫eslink,严格检测js语法。这种注释这个地方不加空格也会报错

2.条件控制

3.调试

可以直接在浏览器的审查元素那边调试

 

直接在console里面写js代码就行 

爱怎么搞怎么搞

 在这边甚至有调试工具,比如堆栈信息什么的

可以打断点

 4.数据类型

数值、文本、图形、音频、视频……

数值类型只有一个number,不区分小数和整数

字符串

let str=`
                      大家好
我是
你爸爸
`

用这个键括起来多行字符串,那些换行空格都会保留,原封不动输出

java中sysout的模板字符串是这样的 

在js里面直接可以搞

还可以指定下标,做到java做不到的事 

但是当然还是改不了 

 方法:大小写转变、indexOf、substring

布尔类型 

浮点数也有精度问题

null 空,定义了但没有值

undefined 没定义 

有个绝对等于,必须类型一样,值一样

比如1=='1' ,但不===

 数组

数组长度是可变的

 当然可以缩短,也不会发生数组溢出的坑爹事件

可以多维数组

方法:indexOf(是绝对等于)、slice(截取数组一部分)、push、pop(以尾部为栈口的栈,返回长度,可以一次性弄进去多个参数)、unshift、shift(以头部为栈口的栈)、sort、reverse、copy、concat(拼接)、fill、find、join等等等,正常有的都有

中括号

下标越界会报错“undefined”

条件控制

循环

可以遍历数组、map、set 

 对象

使用大括号括起来,相当于若干个键值对

'use strict';
let obj={
    fieldName1:fieldValue1,
    fieldName2:fieldValue2,
    fieldName3:fieldValue3,
}

相当于一个匿名内部类,很随意的写法。更像json

每个属性之间使用,隔开

最后一个属性最好不加逗号,防止兼容性不好的浏览器报错

使用一个不存在的对象属性不会报错,只会undefined

甚至还可以动态删减属性

居然还可以直接delete了 

可以动态添加属性

直接这样就行。有点跟c++的map异曲同工了

 所以这样是达咩的,传"name"这样就行了

还可以索引对象键值

感受一下这两个的差别。in的话包含父类有没有。hasOwnProperty只考虑自身 

Map

'use strict';

let map=new Map();
map.set('Tom',80);
map.set('Tim',90);
map.set('Mary',70);
map.set('Met',100);
console.log(map.get('Tom'));
console.log(map);
map.forEach((val,key) => {
    console.log(`${val}  ${key}`);
});

Set

'use strict';

let set=new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(1);
set.delete(2);
console.log(set);
set.forEach(element => {
    console.log(element);
});

函数

方法是在对象里有的,函数在外面有

js的函数长这个样

非常简单的定义 

有两种定义方式

js本身没有类型,且参数个数随意,故完全不需要重载。

如果对js使用重载的话

如上两图,不管在哪调用,都只会执行第二个函数,第一个函数被完全覆盖 

感受一下函数也是变量的感觉

 关键字arguments是一个数组,可以获取所有传进来的参数,包含我们函数定义上的参数。

但有时候,我们想获取除了函数定义外的其他参数,这应该不大能用arguments[参数个数]来访问,毕竟这样引入了一个未经定义的const数字。

因而,es6就有了一个新特性rest,可以获取除了函数上面的参数的参数数组。

这样写

不过其实rest可以用任意标识符表示,关键还是那三个...

变量的作用域

作用域跟别的差不多。函数体内的变量出了函数体就被清除了。

并且有个函数的嵌套。里面的可以用外面的,外面的不能用里面的,跟其他语言也差不多 

说明左图y已经被定义了,就是没有赋值

说明js会提升var声明的变量的作用域,只要在一个块内进行定义,那它的作用域就是整个块而不是它之后块内的部分。但是注意,只是提前了定义,赋的值不会提前。

所以建议全部变量在块开头统一定义声明,不要虾搞

但是let定义的变量不会提升作用域

关于let、const、var   JavaScript 中的 Var,Let 和 Const 有什么区别

默认全局变量绑定在全局对象window里而且系统默认只有这一个全局变量。

具体工程中,为了防止两个js文件全局变量相互覆盖的情况,我们常会自己开拓一个新的全局变量域(创建一个var类型空对象),你自己的代码都放在里面

 比如说jquery就是这么干的

函数体内的变量出了函数体就被清除了。但是你如果想用那些变量咋办?这就有了js的新特性:闭包

方法

就是把函数当成一个字段,放进去

var obj={
    name:"aaa",
    ID:"123456",
    report:function(){
        console.log(this.name+"  "+this.ID);
    },

}
obj.report();

甚至这样也行

function reportMessage(){
    console.log(this.name+"  "+this.ID);
}

var obj={
    name:"aaa",
    ID:"123456",
    report:reportMessage,
}
obj.report();

这样的话就不能调原来那个了。。。原因:this指向使用它的对象。现在是window在使用它

但是在js中可以使用apply控制this的指向,并且使用一次apply相当于调用

Date类

直接打印date对象可以获取当前时间。

也可以用方法获取年year月month日date星期day(0~11)时hour分minute秒second等等等,

还有特殊的是时间戳

可以通过构造方法与标准时间转化

 JSON

JavaScript object notation

早期,所有文件传输习惯用XML文件。那个东西的语法比较复杂,能把你学shi

于是json文件这种语法简单的就诞生了

在js中,所有东西都是对象,都可以用json来表示

json可以联系前端与后端的数据交流

json文件的格式:

1.对象/map(键值对)用{}

2.数组用[]

3.所有键值对都用key:value,

json里面的value也可以是json

value的两种访问方式 

// var obj={
//     name:'cat',
//     ID:1234567,
//     date:"today",
// }

// var jsonFile=JSON.stringify(obj);
// console.log(obj)
// console.log(jsonFile)

var obj=JSON.parse('{"name":"cat","ID":1234567,"date":"today"}');
console.log(obj)

json文件与obj的相互转化

也可以用eval函数

 将json的数据读入到表格

 

json如此方便,因而,要进行数据传输,我们后端只需想怎么把数据加工变成json文件传输到前端就行,大大简化了

面向对象编程

js的面向对象有点区别,js里面的类是原型对象

js的继承得这样写

var vehicle={
    name:"vehicle",
    ID:"#12345",
    run:function(){
        console.log(this.name+" is running!");
    },
}

var car={
    name:"car",
}
car.__proto__ = vehicle;
car.run();

而且注意只能有一个爸爸。再弄一个爸爸会造成覆盖

而且父类一定得写在子类上面

js还可以用class继承

比如说

以前的es5

function相当于类的构造器,要添加方法得像下图这样

function Student(name){
    this.name=name;
}
Student.prototype.report = function(){
    console.log("I am student "+this.name);
}

new Student("Jack").report();

es6后支持以下语法了 

class Student{
    constructor(name){
        this.name=name;
    }
    report(){
        console.log("I am student "+this.name);
    }
}

let student = new Student("Jack");
student.report();

 

甚至还可以extends ,super

操作BOM对象

js的诞生就是为了能让它在浏览器中运行,可以通过BOM操纵浏览器

BS:浏览器服务端。B:浏览器

BOM:浏览器对象模型

1.window对象

代表浏览器窗口,可以获取浏览器当前的长宽、让浏览器弹窗等等

代表全局作用域,所有js脚本中的全局变量都是它的属性

开网页,第一个参数是网址,第二个参数是打开方式

 

关闭

 

确认框

 有返回值

 

感觉常与iframe联合使用 

 eval函数的作用:将字符串解释为一串js代码并执行

 

 

2.navigator对象

封装了浏览器的信息,比如浏览器版本、用户电脑信息等等等

大多数时候用不上,因为会被人为修改。不建议使用这些属性来判断和编写代码。有种安全性的感觉

3.screen

电脑屏幕大小

4.location

代表当前页面的URL信息,有时候用来实现重定向

重要属性:host(主机)、href(当前地址)、protocol(协议)

方法:reload(刷新网页)

可以用这个设置一个新地址

你如果在百度代码中写上这行,然后填上你的网页网址,所有访问百度的人都会跳转到你的网站

5.document

代表当前页面(文档)信息   HTML DOM文档树

 可以获取网页中的所有文档树结点

比如说

<body>
    <dl id="app">
        <dt>JAVA</dt>
        <dd>JAVASE</dd>
        <dd>JAVAEE</dd>
    </dl>
</body>

 可以有id选择器、标签选择器、类选择器

可以获取结点就可以动态地增删结点

document还可以获取网页的cookie

6.history

代表浏览器的历史记录

 这种后退前进网页

不建议使用 

操作DOM对象

DOM:文档对象模型

html其实就是一棵树,我们说白了就是在操作这棵树

html实际上就是DOM树形结构

有四个操作

1.更新  更新dom结点  可以动态地用js给标签结点添加某个属性

2.遍历(查找)  得到dom结点

3.删除  删除dom结点

4.添加  添加一个新的结点

要操作一个dom结点,就必须获得这个dom结点

三种获取方式

var h1=document.getElementsByTagName("h1");
var p1=document.getElementById("p1");
var p2=document.getElementsByClassName("p2");

!!!注意,byTag和byClass都是得到的Collection,要访问其中某一个得用下标,[0]这种 

获取孩子节点 

 下一个

这些是原生代码很烦,以后尽量使用JQuery

更新

属性使用字符串包裹,-转为驼峰命名

innerText不会被转移,innerHTML会解析文本标签

可以通过js代码操纵css效果

 可以用setAttribute来赋值,key,value  这样的参数,来更新或添加标签的属性。建议以后都用这样的写法。newP.id=....这种就别用了

 删除

删除节点的步骤:先获取父节点,再通过父节点删除自己

 

 

创建

我们如果获取了一个DOM节点,如果它是空的,我们可以用innerText或者innerHTML来增加元素。但是如果非空,用上面那两个就会覆盖,就不能这么搞了

把已有的节点作为子节点追加到另一个节点,一般用append追加

<body>
    <div id="js">JAVASCRIPT</div>
    <div id="father">
        <div id="JAVA">JAVA</div>
    </div>
</body>

 创建一个新标签实现插入

注意如果把append改成这一句

newP是显示不出来的,很奇怪 

常用事件

 注册事件的两种方式

方式1,直接在标签内事件句柄写上。

其中,事件函数被称为回调函数(callback函数)。自己写的代码,但是是其他程序调用,这种函数叫回调函数

 方式2,用纯js代码实现事件的注册

 相当于加一个属性。注意别加括号也别加引号

也可以使用匿名回调函数

以后事件注册的统一写法:在window.onload内统一注册

获取键值 

 

 void运算符

比如说

 void的用处是,执行小括号中的表达式,但不返回任何结果。不是“”,也不是undefined,就是纯纯啥也没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值