视频加载失败

JavaScript 初识

3429 字
17 分钟
JavaScript 初识

【9.0】前端基础之JavaScript初识#

js也是一门面向对象的编程语言,一切皆对象

【一】变量命名规范#

  • 变量名只能是 数字/字母/下划线/$
  • 变量名命名规范(js中推荐驼峰式命名法)
  • 变量民不能用关键字作为变量名

【二】JS代码的书写位置#

  • 可以单独开设JS文件书写

  • 还可以直接在浏览器提供的 console 界面书写

    • 在用浏览器书写JS的时候 左上方的清除按钮这是清空页面 不能清空已经写完的代码的残留问题

    • 如果想重新开始,推荐新建页面书写

  • 建议用自己写的html页面书写js代码

【三】数据类型#

js是一门拥有动态类型的语言

var name = "dream";
var name = 123;
var name = [];
  • name可以指向任意类型
    • 但是在某些语言中。变量名只能指向其中一种,不支持做更改

【1】数值类型 Number#

演示#

var a= 11;
var b = 11.11;

查看数据类型#

typeof a;

注意#

  • 特殊的 NaN :数值类型
    • 表示的意思是不是一个数字, Not A Number

类型转换#

ar e = parseInt("11.11")
console.log(e) // 11
console.log(parseInt("11asdasdada33336669932adsada"))
// 只要开头有数字就可以转,如果开头不是数字则是NoN
// 11
console.log(parseInt("aasdads444564546"))
// NaN

【2】字符类型String#

var a = "dream";
// undefined
typeof a;
// 'string'
var s1 = "meng";
// undefined
typeof s1;
// 'string'
var s2 = '''name''';
// VM332:1 Uncaught SyntaxError: Unexpected string

不支持三引号

模版字符串#

  • 书写多行字符串
var s3 = `
as
df
ce
gh
`
  • 格式化字符串
    • 书写 ${} 会向前找定义过的变量值
      • 如果找不到会报错

模板字符串除了可以定义多行文本,还可以实现格式化字符串操作

var name = "dream";
// undefined
var age = 18;
// undefined
var str = `my name is ${name} my age is ${age}`;
// undefined
str
// 'my name is dream my age is 18'

拼接字符串#

  • 在js中推介用 + 号 做拼接

常用方法#

1
1

// 统计字符长度
var name1 = " dream ";
name1
// ' dream '
name1.length
// 9
// -------------------------------------------
var name1 = " dream ";
// undefined
name1
// ' dream '
// (1)去除两端空白
name1.trim()
// 'dream'
// (2)去除左边的空白
name1.trimLeft()
// 'dream '
// (3)去除右边的空白
name1.trimRight()
// ' dream'
// -------------------------------------------
// (4)返回索引为n的字符
name1.charAt(5)
// 'a'
// (5)返回字符所在的索引(r的索引)
name1.indexOf("re");
// 3
// -------------------------------------------
// (6)切片
var name2="$$dream$$";
// undefined
name2
// '$$dream$$'
// (1)取索引 0~5的内容
name2.substring(0,5)
// '$$dre'
// (2)取索引 0~5的内容
name2.slice(0,5)
// '$$dre'
// (3)区别 slice 可以用 -1 取值
name2.substring(0,-1); // 废除
''
name2.slice(0,-1);
'$$dream$'
// -------------------------------------------
// 字符转大小写
var name3 = "NiHao,Dream,521"
// undefined
name3
// 'NiHao,Dream,521'
// (1)字符转全小写
name3.toLowerCase();
// 'nihao,dream,521'
//(2)字符转全大写
name3.toUpperCase();
// 'NIHAO,DREAM,521'
// -------------------------------------------
// 切分
var name4 = "dream|music|18|斋藤飞鸟|";
// undefined
name4
// 'dream|music|18|斋藤飞鸟|'
// 以指定字符切分字符串
name4.split("|");
// (5) ['dream', 'music', '18', '斋藤飞鸟', '']
// 参数 2 意思是拿前两个参数,如果大于目标个数,有几个拿几个
name4.split("|",2);
// (2) ['dream', 'music']
// -------------------------------------------
// 字符串拼接 可以自动转换数据类型,进行拼接
name1.concat(name2,name3,name4);
// '$$dream$$NiHao,Dream,521dream|music|18|斋藤飞鸟|'

【四】布尔类型 Boolean#

  • 在Python中布尔值是首字母大写的
  • 但是在js中布尔值是全小写的
var a = true
// undefined
typeof a
// 'boolean'
  • 布尔值是false的有哪些
    • 空字符串
    • 0
    • null
    • undefined
    • NaN

【五】null 和 undefined#

  • null
    • 表示值为空,一般都是指定或者清空一个变量时使用
  • undefined
    • 表示声明了一个变量,但是没有做初始化操作
    • 函数没有指定返回值的时候也是返回的undefined

2
2

【六】对象#

  • 数组
    • 类似于Python当中的列表
  • 自定义对象
    • 类似于Python当中的字典

【1】数组#

// 声明数组
var l = [11,22,33,44];
// undefined
l
// (4) [11, 22, 33, 44]
// 查看数组类型
typeof(l)
// 'object'
var ll = [11,"ansg",11.11,true];
// undefined
ll
// (4) [11, 'ansg', 11.11, true]
// 数组根据索引取值
ll[1];
// 'ansg'
// 数组不能倒着取值
ll[-1];
// undefined
  • 常用方法
方法说明
.length数组的大小
.push(ele)尾部追加元素
.pop()获取尾部的元素
.unshift(ele)头部插入元素
.shift()头部移除元素
.slice(start, end)切片
.reverse()反转
.join(seq)将数组元素连接成字符串
.concat(val, …)连接数组
.sort()排序
.forEach()将数组的每个元素传递给回调函数
.splice()删除元素,并向数组添加新元素。
.map()返回一个数组元素调用函数处理后的值的新数组
  • Python中添加元素的方式

    • append
      • 尾部追加
    • extend
      • 扩展列表
      • 内部是 for循环 + append
    • insert
      • 指定位置插入元素
  • Python中删除元素的方式

    • pop
      • 弹出元素(默认是最后一个元素)
    • remove
      • 移除元素
    • del
      • 删除元素通用方法
  • Python中常用的方法

    • map
      • 映射函数
    • zip
      • 拉链方法
      • 将两个列表中的元素两两拼接成元祖返回
    • filter
      • 过滤函数
      • 符合条件为真的元素被留下
    • reduce
      • 多个进一个出

【2】常用方法#

var l= [11,22,33,44,55,66];
// undefined
l
// (6) [11, 22, 33, 44, 55, 66]
// (1)统计数组的个数
l.length
// 6
// (2)向数组尾部添加元素
l.push(77);
// 7
l
// (7) [11, 22, 33, 44, 55, 66, 77]
// (8) 弹出最后一个元素
l.pop();
// 77
l
// (6) [11, 22, 33, 44, 55, 66]
// (7)在头部添加一个元素
l.unshift(88);
// 7
l
// (7) [88, 11, 22, 33, 44, 55, 66]
// (8) 移除头部元素
l.shift(99);
// 88
l
// (6) [11, 22, 33, 44, 55, 66]
// (8) 移除头部元素
l
// (5) [22, 33, 44, 55, 66]
// (9) 切片:取索引 0-3 的元素
l.slice(0,3)
// (3) [22, 33, 44]
// (10) 反转列表
l.reverse();
// (5) [66, 55, 44, 33, 22]
// (11) 将元素提出,拼接字符串
l.join("$");
// '66$55$44$33$22'
// (12)添加数组,但是不改变原来的数组
l.concat([111,2222,3333])
// (8) [66, 55, 44, 33, 22, 111, 2222, 3333]

【3】forEach#

一个参数#

  • 数组中的每一个元素
// 类似于Python中的map函数
var ll = [11,22,33,44,55,66,77];
undefined
// 参数(一个函数,一个迭代列表)
ll.forEach(function (value) {
console.log(value)
},ll)
/*
VM2817:2 11
VM2817:2 22
VM2817:2 33
VM2817:2 44
VM2817:2 55
VM2817:2 66
VM2817:2 77
undefined
*/

两个参数#

  • 数组中的每一个元素 + 数据的索引
// 类似于Python中的map函数
var ll = [11,22,33,44,55,66,77];
undefined
// 参数(一个函数,一个迭代列表,元素所在的索引值)
ll.forEach(function (value,index) {
console.log(value,index)
},ll)
/*
VM2856:2 11 0
VM2856:2 22 1
VM2856:2 33 2
VM2856:2 44 3
VM2856:2 55 4
VM2856:2 66 5
VM2856:2 77 6
undefined
*/

三个参数#

  • 数组中的每一个元素 + 数据的索引 + 数据的来源
// 类似于Python中的map函数
var ll = [11,22,33,44,55,66,77];
undefined
// 参数(一个函数,一个迭代列表,元素所在的索引值,数据的来源)
ll.forEach(function (value,index,arr) {
console.log(value,index,arr)
},ll)
/*
VM2884:2 11 0 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 22 1 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 33 2 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 44 3 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 55 4 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 66 5 (7) [11, 22, 33, 44, 55, 66, 77]
VM2884:2 77 6 (7) [11, 22, 33, 44, 55, 66, 77]
undefined*/

【4】splice#

两个参数#

  • 起始位置 + 删除的个数
ll
// (7) [11, 22, 33, 44, 55, 66, 77]
// 从索引为0的位置向后删除三个元素
ll.splice(0,3);
// (3) [11, 22, 33]
ll
// (4) [44, 55, 66, 77]

三个参数#

  • 先删除后添加
// 先将指定索引的元素删除,再在原来的位置添加后面的元素
ll
// (4) [44, 55, 66, 77]
ll.splice(0,1,888);
// [44]
ll
// (4) [888, 55, 66, 77]

【5】map#

  • 类似于forEach
    • 也可以加三个参数
var l1 = [11,22,33,44,55,66,77,88]
// undefined
l1
// (8) [11, 22, 33, 44, 55, 66, 77, 88]
l1.map(function(value){console.log(value)},l1)
/*
VM3225:1 11
VM3225:1 22
VM3225:1 33
VM3225:1 44
VM3225:1 55
VM3225:1 66
VM3225:1 77
VM3225:1 88
*/
l1.map(function(value,index){return value*2},l1)
(8) [22, 44, 66, 88, 110, 132, 154, 176]

【七】运算符#

【1】算数运算符:+#

  • + 在前面
    • 先增加后赋值
  • + 在后面
    • 先赋值后增加
var a = 10;
// undefined
var res1 = a++;
// undefined
var res2 = ++a;
// undefined
res1
// 10
res2
// 12

【2】比较运算符 == 与 ===#

  • 当使用”==“比较运算符时,会进行类型转换然后再比较。
    • 如果操作数的类型不同,则会尝试将它们转换为相同的类型,然后再进行比较。
  • 而使用”===“严格相等运算符时,不会进行类型转换。
    • 它要求操作数的值和类型都相同才会返回true。

==

  • 弱等于
    • 内部自动转换成相同的数据类型比较了

===#

  • 强等于
    • 内部不做类型转换
1 == '1';
true
1 === '1';
false

【3】逻辑运算符#

  • Python中的 and or not
  • JavaScript中 && || !
5 && '5';
'5'
0 || 1;
1
!5 && '5';
'5'

【4】赋值运算符#

  • = += -+

【八】流程控制#

【1】if判断#

  • 语法
// if - else
if (条件){条件成立执行的代码块}else{条件不成立时执行的代码块}
// if - else if - else
if (条件){条件成立执行的代码块}else if(条件){条件成立执行的代码块}else{条件不成立时执行的代码块}
// () 条件 {} 执行的代码块
var age = 10;
if (age>=18){
console.log("你好")
}else{
console.log("滚蛋")
};
// if - else
if (age >= 18 ){
console.log("你好")
}else if(age<10){
console.log("萝莉酱")
}else{
console.log("滚蛋")
};

【2】switch - case 语法#

  • 提前定义好可能出现的条件和解决方式
    • break
      • 如果不加break,匹配成功之后会依次执行
    • default
      • 所有条件都不成立时走的代码
var num = 2;
switch (num) {
case 0:
console.log("喝酒");
break;
case 1:
console.log("吃饭");
break;
case 2:
console.log("打牌");
break;
default
console.log("走人")
}

【3】for循环#

for (起始条件,结束条件,循环条件){条件成立执行的代码}
// 打印 0-9 的数字
for (let i=0;i<10;i++){
console.log(i)
}
// 打印列表内的每一个值
var ll = [11,22,33,44,55,66,77];
for (let i = 0;i < ll.length; i++){
console.log(ll[i])
};

【4】while循环#

while (条件){条件成立执行的代码}
var i = 0;
while (i<100){
console.log(i)
i++;
};

【5】三元运算符#

  • Python中
res = 4 if 1 > 2 else 6
  • JavaScript中
条件 ? 条件成立取到的值:条件不成立取到的值
var res = 1 > 2 ? 4 : 6;
// 6
var res = 1 > 2 ? 4 : (8 > 5 ? 999 : 888);
// 999

三元运算符不要过于复杂

【九】函数#

  • 在Python中定义函数需要用 def
  • 在JavaScript中定义函数需要用 function

【1】格式#

// 格式
function 函数名(形参,形参,形参,形参...){
函数体代码
}

【2】无参函数#

// 无参函数
function func1(){
console.log("我是无参函数")
}
func1()

【3】有参函数#

// 有参函数
function func2(a,b){
console.log(a,b)
};
func2(1,2)
function func2(a,b){
console.log(a,b)
};
func2(1,2)
// VM3577:2 1 2
func2(1,2,3,4,5,6,7)
// VM3577:2 1 2
func2(1)
//VM3577:2 1 undefined
  • 在js中传多了只拿对应的数据
  • 在js中传少了也不会报错

【4】关键字arguments#

function func3(a,b,c){
console.log(arguments)
console.log(a,b,c)
};
function func3(a,b,c){
console.log(arguments)
console.log(a,b,c)
};
func3(1,2,3,4,5,6,7)
/*
VM3668:2 Arguments(7) [1, 2, 3, 4, 5, 6, 7, callee: ƒ, Symbol(Symbol.iterator): ƒ]
VM3668:3 1 2 3
*/
  • 能够获取到函数接收到的所有参数

用途#

function func4(a,b,c){
if (arguments.length > 3){
console.log("传多了")
}else if (arguments.length < 3){
console.log("传少了")
}else{
console.log(a,b,c)
}
};

【5】函数的返回值#

  • 使用关键字 return

  • 返回单个值

function index(){
return 666
};
  • 返回多个值要用数组约束
function index(){
return [777,88,99]
};

JavaScript不支持解压赋值

【6】匿名函数#

function (){};
// 自调用
function (){}();
// 变量存储
var b = function (){}

【7】箭头函数#

用来处理简答的逻辑,类似于Python中的匿名函数

  • 箭头左面的是形参
    • 右边的是返回值

单个参数#

var func1 = v => v;
  • 等价于
var func1 = function(v){
return v
};

多个参数#

var func2 = (args1,args2) => args1 + args2;
  • 等价于
var func1 = function(args1,args2){
return args1 + args2
};

【十】函数的全局变量与局部变量#

var city = "BeiJing";
function f() {
var city = "ShangHai";
function inner(){
var city = "ShenZhen";
console.log(city);
}
inner();
}
f(); //输出结果是?
  • 输出结果是:“ShenZhen”。

  • 在函数 inner 内部,变量 city 的值被赋为 “ShenZhen”

    • 因此 console.log(city) 会输出 “ShenZhen”。
  • 由于函数 inner 是在函数 f 中定义的,并且在函数 f 中调用了 inner

    • 所以同样的规则适用于函数 f。
  • 即使在函数 f 内部有一个与全局变量 city 同名的局部变量 city

    • 但在执行 console.log(city) 时,它将访问最内层的局部变量 city 的值
    • 也就是 “ShenZhen”。
var city = "BeiJing";
function Bar() {
console.log(city);
}
function f() {
var city = "ShangHai";
return Bar;
}
var ret = f();
ret(); // 打印结果是?
  • 在你提供的代码中,输出结果将是:“BeiJing”。

  • 首先,全局变量 city 被赋值为 “BeiJing”。

  • 然后,在函数 f 内部定义了一个名为 city 的局部变量,将其值设置为 “ShangHai”。

  • 接下来,f 函数返回了函数 Bar 的引用。

  • 在执行 var ret = f() 后,ret 变量被赋值为 Bar 函数的引用

    • 即 ret 现在指向函数 Bar。
  • 最后,执行 ret()

    此时由于 ret 指向 Bar 函数

    • 所以会执行 Bar 函数,并打印当前作用域内的变量 city 的值,即输出 “BeiJing”。
  • 注意,这是因为 Bar 函数在执行时访问的是其定义时所处的作用域,即全局作用域,而非 f 函数内部的作用域。

var city = "BeiJing";
function f(){
var city = "ShangHai";
function inner(){
console.log(city);
}
return inner;
}
var ret = f();
ret();
  • 输出结果将是:“ShangHai”。

  • 首先,全局变量 city 被赋值为 “BeiJing”。

    • 然后,在函数 f 内部定义了一个名为 city 的局部变量,将其值设置为 “ShangHai”。
    • 接下来,f 函数返回了函数 inner 的引用。
  • 在执行 var ret = f() 后,

    • ret 变量被赋值为 inner 函数的引用
    • 即 ret 现在指向函数 inner。
  • 最后,执行 ret()

    • 此时由于 ret 指向 inner 函数,所以会执行 inner 函数,并打印当前作用域内的变量 city 的值,即输出 “ShangHai”。
  • 注意,这是因为 inner 函数在执行时访问的是其定义时所处的作用域,即函数 f 内部的作用域。在该作用域中,变量 city 的值为 “ShangHai”。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录