JavaScript学习记录0x1
JavaScript
[toc]
ECMAScript是 JavaScript 的标准规范。
主要记录下学习记录和javascript
相较于C和cpp
的差异和特性
跟着现代 JavaScript 教程一起学!
2.1 HelloWorld
我们可以直接在html
里面嵌入js脚本
,也可以引用相对路径的js文件
:
1 | <!-- HTML5 Document Type --> |
2.2 代码结构
javascript
有自动分号插入,但是我们最好还是自己加上分号。一是为了使代码结构清晰,二是避免一些因自动分号插入而导致的隐蔽错误。注释与C和cpp一样
2.3 现代模式,”use strict”
请——-将她写在脚本文件顶部
2.4 变量
- 使用
let
声明变量,使用const
声明常量 - 区分大小写
- “硬编码”类型(不会随代码执行改变)使用大写常量命名。具有一定可变性的常量使用小写命名
2.5 数据类型
通过 typeof
运算符查看存储在变量中的数据类型。
Number类型
infinity
代表数学概念中的 无穷大 ∞。是一个比任何数字都大的特殊值。
1 | alert( 1 / 0 ); // Infinity |
NaN
代表一个计算错误。它是一个不正确的或者一个未定义的数学操作所得到的结果。- NaN是
粘性
的。任何对 NaN`的进一步数学运算都会返回 NaN。
1 | alert( NaN + 1 ); // NaN |
BigInt类型
BigInt
类型是最近被添加到 JavaScript 语言中的,用于表示任意长度的整数。我们只需要 将n
附加到整数字段的末尾来创建BigInt
类型
在 JavaScript 中,“number” 类型无法安全地表示大于 ( $2^{53}$ -1)或小于$(2^{53}-1)$的整数。
1 | const bigInt = 1234567890123456789012345678901234567890n; |
我:为什么是
2^53 - 1
呢?GLM4:这是因为在这个范围内的整数可以在64位浮点表示中精确地表示。IEEE 754双精度浮点数格式将64位分为三个部分:
- 符号位(sign):1位
- 指数(exponent):11位
- 尾数(fraction/mantissa):52位
对于整数,尾数部分直接表示数字的值,而指数部分用于放大或缩小这个值。在JavaScript中,当指数为0时,尾数的52位可以直接表示一个整数。这52位可以表示的最大整数是
2^53 - 1
,因为第一位总是隐含的1,不在尾数中直接表示。
string类型
在 JavaScript 中,有三种包含字符串的方式。
- 双引号:
"Hello"
。 - 单引号:
'Hello'
。 - 反引号:
`Hello`
,有点像格式化字符串
1 | let Username = "Randolfluo"; |
others
null
用于未知的值 —— 只有一个null
值的独立类型。undefined
用于未定义的值 —— 只有一个undefined
值的独立类型。symbol
用于唯一的标识符。object
用于更复杂的数据结构。属于非原始数据类型。
2.6 交互:alert、prompt 和 confirm
alert
着用户不能与页面的其他部分进行交互,直到他们处理完窗口。
1 | alert("Randolf luo 是大帅逼"); |
prompt
用于提示用户输入一些文本,第二个参数表示默认值。
1 | let age = prompt('How old are you?', 100); |
confirm
提供question和确定和取消两个按钮的模态窗口。
1 | let res = confirm("你是天才吗?"); |
这些方法都是模态的:它们暂停脚本的执行,并且不允许用户与该页面的其余部分进行交互,直到窗口被解除。
2.7 类型转换
- 这里主要是注意在
js
中字符串"0"
和空格字符串" "
的bool值为true
- 当无法转换为数字时,将会转化为
NaN
2.8 基础运算符,数学运算
注意一下加号,当数字字符串与数字相加时,会转化为字符串:
1 | alert(1 + '2') //12 |
加号也能以更简短的方式转化非数字,效果和 Number(...)
相同,但是更加简短。
1 | // 转化非数字 |
我们把上述功能加在一起
1 | let x = "3" |
2.9 值的比较
- 严格相等运算符
===
在进行比较时不会做任何的类型转换。 - 在非严格相等
==
下,null
和undefined
相等且各自不等于任何其他的值。 - 在使用
>
或<
进行比较时,需要注意变量可能为null/undefined
的情况。
2.10 条件分支:if 和 ‘?’
- 即
if...else...
语句和? :
三目运算符。
2.11 逻辑运算符
对||
进行了拓展——返回第一个真值。若都是假值,返回最后一个值。
对&&
也进行了拓展——返回第一个假值。若都是真值,返回最后一个值。
1 | let firstName = ""; |
2.12 空值合并运算符 ‘??’
a ?? b 的结果是:
如果 a 是已定义的,则结果为 a,
如果 a 不是已定义的,则结果为 b。
1 | let Username; |
2.13 循环
- 这里注意下类似goto语句的标签:
break outer
向上寻找名为outer
的标签并跳出当前循环。 - 主要用于退出多重循环(ps:我试了下一重循环会报错)
1 | outer: |
当跳转到outer标签时,会忽略下一循环。因此这里每个alert语句
只被执行一次。
2.14 “switch” 语句
- 只需注意下被比较的值必须是相同的类型才能进行匹配。
2.15 函数
1 | function fun(arg1, arg2 = "Defalut", arg3) |
2.16 函数表达式
函数是值。它们可以在代码的任何地方被分配,复制或声明。
函数声明
函数声明在其被声明的代码块内的任何位置都是可见的。
1 | declaration(); //因此我们可以在声明前调用函数 |
我们优先
使用函数声明式。
函数表达式
函数表达式在代码执行到它时才会被创建。
1 | expression() //error |
当函数调用者所在作用域大于函数声明式所在作用域时,函数声明式将不可见。我们可以使用函数表达式代替。
1 | let age = prompt("What is your age?", 18); |
回调函数
1 | function ASK(A,B) |
2.17 箭头函数,基础知识
即返回值后置
1 | let age = prompt("What is your age?", 18); |