现代的标记 markup
type 特性: <script type=...>
外部脚本
1 | <script src="..."></script> |
基本类型
String Number Object Boolean null undefined bigint symbol
symbol:唯一标识符
undefined: 含义是未被赋值
null: 含义就是空
Bigint
在后面加上 n 表示为任意长度的整数
1 | let num = 12344521312543512323432n; |
typeof
1 | typeof undefined // "undefined" |
最后三行可能需要额外的说明:
Math是一个提供数学运算的内建object。我们会在 数字类型 一节中学习它。此处仅作为一个object的示例。typeof null的结果为"object"。这是官方承认的typeof的错误,这个问题来自于 JavaScript 语言的早期阶段,并为了兼容性而保留了下来。null绝对不是一个object。null有自己的类型,它是一个特殊值。typeof的行为在这里是错误的。typeof alert的结果是"function",因为alert在 JavaScript 语言中是一个函数。我们会在下一章学习函数,那时我们会了解到,在 JavaScript 语言中没有一个特别的 “function” 类型。函数隶属于object类型。但是typeof会对函数区分对待,并返回"function"。这也是来自于 JavaScript 语言早期的问题。从技术上讲,这种行为是不正确的,但在实际编程中却非常方便。
交互
alert: 弹窗提示
1 | let a = prompt(title,[default]); |
prompt: 两个参数 标题,输入框默认值,确认后输入框值赋值给a
1 | let b = confirm('are you ready?') |
confirm(question); 返回布尔值,确定true,取消false
以上窗口样式都不能改变,样式取决于浏览器
类型转换
1 | let a = 123; |
布尔型转换
| 值 | 变成 |
|---|---|
0,null,undefined,NaN,"" |
false |
| 其他值 | true |
基本运算符
2 ** 3 2^3
相等
==:相等性检查 会进行类型转换 != 同理===:严格相等性检查 不会进行类型转换 !== 同理
while-for
while
break 跳出循环continue 跳出当此循环
for
标签
1 | fors: for(let i = 0; i < 10; i++) { |
标签不允许跳到代码任意位置,break只允许在代码块内。
对象 Object
简单来说就是键值对,但是值可以为任何值
1 | let user = new Object(); // 构造函数语法 |
delete 移除对象属性
1 | let user = { |
也可以用多字多词作为属性名
1 | let user = { |
逻辑运算符
1 | // 或 |
箭头函数
箭头函数没有this指向,箭头函数内部this值只能通过查找作用域链来确定,一旦使用箭头函数,当前就不存在作用域链。
使用箭头函数 内部没有arguments 且箭头函数不能使用new来实例化对象 而function函数是一个对象,箭头函数不是对象
对象扩展
1 | const name = 'xiao',age = 20; |
赋值不需要使用 : 直接写变量名就OK
Object
Object.is() 对比Object.assign() 浅拷贝
Symbol
原始数据类型,表示独一无二的值
Set
无重复值的有序列表
1 | let set = new Set(); |
扩展运算符
1 | console.log([...arr]); |
Array
1 | // from 将伪数组转成数组 |
Iterator 迭代器
一种新的遍历机制,有两个核心
- 迭代器是一个接口,能快捷的访问数据,通过Symbol.iterator来创建迭代器 通过迭代器的next()方法获取迭代后的结果
- 迭代器是用于遍历数据结构的指针(数据库的游标)
1
2
3const items = ['one','two','three'];
const ite = itmes[Symbol.iterator]();
console.log(ite.next()); // {value: 'one', done: false} done如果为false表示遍历继续 如果为true遍历结束
Generator 生成器
通过yield关键字,将函数挂起,为了改变执行流提供了空间,同时也为异步编程提供了可能
- function后面,函数名之前有个*
- 只能在函数内部使用yield表达式,让函数挂起
目前来看使用场景有异步编程,为不具备Iterator接口的对象提供了遍历操作
1 | function* func(a) { |
yield 像断点 而 next()则是执行恢复运行
传值
1 | function* add() { |
Promise
Promise有三个状态:
- pending(进行)
- resolved(成功)
- rejected(失败)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20let pro = new Promise(function(resolve, reject) {
let response = {
code: 400,
msg: 'success',
error: 'faild'
}
setTimeout(() => {
if(response.code === 200) {
resolve(response)
}else {
reject(response)
}
}, 1000);
})
pro.then((res) => {
console.log(res);
},(err) => {
console.log(err);
})
async异步
async 使异步操作更加方便
async 会返回一个Promise对象 then catch
其实是Generator的语法糖
1 |