代码注释(comment)
代码中不会被当作代码来运行的文字, 用来在代码中写笔记, 分为单行和多行注释
//两个正斜杠作单行注释/*多行注释第1行多行注释第2行多行注释第3行*/
字符串, 数字, 布尔值
字符串(string)
'吉吉喵' //单引号或双引号包围的文本是字符串, 大多用于显示文字"吉吉喵" //作用和上面其实一样, 但建议用', 因为输入比"方便
数字(number)
8 //整数1.5 //浮点数
布尔值(boolean)
true //真false //假
特殊的类型(special types)
undefined//未定义null//空Infinity//无穷大NaN//不存在(错误类型)//NaN不能用==来判断,需用isNaN()
运算符(operator)
数字加减乘除模
1.5 + 4 //1.5加4得5.51.5 - 4 //1.5减4得-3.51.5 * 4//1.5乘4得61.5 / 4 //1.5除以4得0.3757 % 4 //7对4取模得32 ** 7 //2的7次方得128
字符串拼接与字符读取(string concatenation/get char)
'吉吉喵有' + 100 + '块钱' //字符串拼接出 '吉吉喵有100块钱''吉吉喵'[0] //0号位的字符是'吉''吉吉喵'[2] //2号位的字符是'喵'
与或非布尔运算(and/or/negate)
true && true //true与true得truetrue && false //true与false得falsefalse && false //false与false得falsetrue || true //true或true得truetrue || false //true或false得truefalse || false //false或false得false!true //非true得false!false //非false得true
比较运算(comparison)
2 > 3 //2大于3得false2 >= 3 //2大于等于3得false2 < 3 //2小于3得true2 <= 3 //2小于等于3得true2 == 3 //2等于3得false2 != 3 //2不等于3得true
位运算(bitwise)
const a = 10;const b = 2;a << b//a左移b位,相当于a*(2^b)a >> b//a右移b位,相当于a/(a^b)a | b//按位或,把a,b转换成二进制,每一位对齐进行或运算a & b//按位与,把a,b转换成二进制,每一位对齐进行与运算a ^ b//按位异或,把a,b转换成二进制,每一位对齐进行异或运算
==与===
null == undefined//truenull === undefined//falsefalse == ''//truefalse === ''//false
更多看这里
变量(variable)
用于存放可变的数据
let name = '吉吉喵' // 名字是'吉吉喵'let lv = 1 // 等级是1let money = 10 // 金钱是10let hp = 100 // 生命值是100let atk = 20 // 攻击力是20name = '雷电猴' //名字从吉吉喵变成雷电猴atk += 10 //攻击力加10, 变成了30攻击力hp -= 20 //生命值减了20, 变成80生命值lv++ //等级加1, 变成2级money-- //金钱减1, 变成9
可行的变量命名风格
var my_var_name //蛇式命名法var myVarName //驼峰式命名法var MyVarName //对象类命名法var MY_VAR_NAME //常量命名法var $my_var_name //美元符蛇式命名法var $myVarName //美元符驼峰式命名法var my_var_name99 //蛇式+数字混搭var myVarName88 //驼峰式+数字混搭
常量(constant)
常量用于存放不会被改变的数据
const PI = 3.1415926535897932384626433832795 //圆周率const DAYS_OF_A_WEEK = 7 //一周有7天
使用console控制台调试代码
let a = 2let b = 3console.log(a + b) //在控制台输出5
console.clear() //清除控制台的输出记录
对象与属性(object property)
给空对象设置属性:
let obj = {} //定义一个名为obj的变量存储一个空对象obj.name = '吉吉喵' //给obj设置name属性, 值为'吉吉喵'obj.money = 99 //给obj设置money属性, 值为99obj.atk = 10 //给obj设置atk属性, 值为10//控制台输出:'吉吉喵有99块钱, 10攻击力'console.log(`${obj.name}有${obj.money}块钱, ${obj.atk}攻击力)
让对象带有初始属性:
let obj = {name:'吉吉喵',money: 99,atk: 10,}//控制台输出:'吉吉喵有99块钱, 10攻击力'console.log(`${obj.name}有${obj.money}块钱, ${obj.atk}攻击力`)
函数(function)
函数用于把多步计算过程封装成1步, 有助于简化代码
//定义一个名为add的函数, 有3个参数, 分别是 a b cfunction add(a, b, c) {a += ba += creturn a //返回累加后的 a}add(2, 3, 4) //用参数2,3,4调用add, 返回 9add('abc', 'def', 'ghi') //返回 'abcdefghi'//上面的函数的运算过程也可以简化成1行function add(a, b, c) {return a + b + c //直接返回abc的和}
将函数用于操作对象属性:
let obj1 = {name:'吉吉喵',money: 99,}let obj2 = {name:'雷电猴',money: 10,}function addMoney(obj, n) {//给对象加钱obj.money += nconsole.log(`${obj.name}获得了${n}块钱`)}function giveMoney(sender,receiver, n) {//把钱从一个对象转到另一个对象receiver.money += nsender.money -= nconsole.log(`${sender.name}给了${receiver.name}${n}块钱`)}function display(obj) {console.log(`${obj.name}有${obj.money}块钱`)}display(obj1)display(obj2)addMoney(obj2, 10)display(obj2)giveMoney(obj1, obj2, 20)display(obj1)display(obj2)/* 控制台输出:吉吉喵有99块钱雷电猴有10块钱雷电猴获得了10块钱雷电猴有20块钱吉吉喵给了雷电猴20块钱吉吉喵有79块钱雷电猴有40块钱*/
函数的其他形态
匿名函数(没有名字的函数)
//匿名函数赋值到变量, 函数本身没有名字, 名字用的是变量的名字//缺点是要求在声明后才能调用let add = function(a, b, c) {return a + b + c}add(1,2,3)
箭头函数
//箭头函数赋值到变量, 匿名函数的简写, 而且this关键词在箭头函数无效let add = (a, b, c) => {return a + b + c}let add2 = (a, b, c) => a + b + c//在表达式只有1行时, 可以进一步简写console.log(add(1,2,3), (1,2,3))
异步函数
//用async关键词修饰函数, 可以让函数异步执行//await关键词用于让异步函数同步执行, await必须在async函数中使用async function countDown() {console.log(3)await sleep(1000) //等待1000毫秒console.log(2)await sleep(1000) //等待1000毫秒console.log(1)await sleep(1000) //等待1000毫秒console.log(0)}console.log('start')countDown()console.log('end')
// 匿名函数 和 箭头函数 同样可以使用async/awaitlet a = async function () {await sleep(1000)}let b = async () => {await sleep(1000)}
对象的方法(object method)
对象方法, 是对象自带的函数, 用于操作自身属性, 方法里的this关键词可以用来指向对象自身
当一个对象属性的值是函数, 这个属性就可以当作方法来用
let obj1 = {name:'吉吉喵',money: 99,giveMoney: function(receiver, n) {//giveMoney方法, 把钱转到另一个对象receiver.money += nthis.money -= nconsole.log(`${this.name}给了${receiver.name}${n}块钱`)//this表示对象自身},}let obj2 = {name:'雷电猴',money: 10,giveMoney(receiver, n) {//giveMoney方法的简写receiver.money += nthis.money -= nconsole.log(`${this.name}给了${receiver.name}${n}块钱`)},}function display() {console.log(`${this.name}有${this.money}块钱`)}//把外边的display函数设置赋值到show属性, show就可以当作方法来用obj1.show = displayobj2.show = displayobj1.show()obj2.show()obj1.giveMoney(obj2, 20)obj1.show()obj2.show()obj2.giveMoney(obj1, 10)obj1.show()obj2.show()/*吉吉喵有99块钱雷电猴有10块钱吉吉喵给了雷电猴20块钱吉吉喵有79块钱雷电猴有30块钱雷电猴给了吉吉喵10块钱吉吉喵有89块钱雷电猴有20块钱*/
我们常用的console.log和console.clear, 就是全局对象console里的log方法和clear方法
数组(array)
数组可以允许你将数据按顺序存储在一个变量中
let arr = ['吉吉喵', 3, 100, 'a', 'b']console.log(`${ arr[0] }有${ arr[2] }块钱`) //获取数组对应位置的元素console.log(arr.length) //获取数组长度
条件分支(conditional branching)
if/else
let hp = 50if (hp >= 80) {console.log('你处于健康状态')}else if (hp > 50) {console.log('你处于轻伤状态')}else if (hp > 0) {console.log('你处于重伤状态')}else {console.log('你已阵亡')}
switch
let gunType = '冲锋枪'let gunConfigswitch (gunType) {case '冲锋枪':gunConfig = {atk:3,//攻击力range:7,//射程fireRate:10,//射速}breakcase '狙击枪':gunConfig = {atk:10,//攻击力range:12,//射程fireRate:2,//射速}breakcase '散弹枪':gunConfig = {atk:6,//攻击力range:5,//射程fireRate:4,//射速}breakdefault://如果gunType没有匹配以上3类枪械gunConfig = {atk:2,//攻击力range:5,//射程fireRate:6,//射速}break}
循环语句(loops)
for…of
按顺序遍历数组中每一个元素
let arr = ['吉吉喵', 3, 100, 'a', 'b']for (const e of arr) { //遍历arr中的每一个元素console.log(e)}/*吉吉喵3100ab*/
while
当条件满足时会一直保持循环
let i = 10while (i-- > 0) {console.log(i)}
for…in
遍历对象中的每一个属性名
let obj = {a: 1, b: 2, c: 3}for (const k in obj) {const v = obj[k]//k为属性名, v为属性值console.log(k, v) //输出 k 和 v}
for
常用的循环语句
for (let i=0; i<10; i++) {console.log(i)}
对象的类(class)
定义一个类
class Gamer {//定义一个名为Gamer的类constructor(name, money){//构造方法, 每次创建实例都会执行this.name = namethis.money = money}giveMoney(receiver, n) {//giveMoney方法, 把钱转到另一个对象receiver.money += nthis.money -= nconsole.log(`${this.name}给了${receiver.name}${n}块钱`)}display() {console.log(`${this.name}有${this.money}块钱`)}}let gamer1 = new Gamer('吉吉喵', 99) //new 可以将类实例化, 将参数传到构造方法里let gamer2 = new Gamer('雷电猴', 20)gamer1.display()gamer2.display()gamer1.giveMoney(gamer2, 20)gamer1.display()gamer2.display()
子类(subclass)
子类可以继承父类的的方法和属性
class Attacker extends Gamer {//Attacker是Gamer的子类, Gamer是Attacker的父类constructor(name, money, atk){super(name, money)//super()是父类的构造方法this.atk = atk}display() {//重写父类的display方法super.display()//通过super.xxx访问父类的方法console.log(`${this.name}有${this.atk}攻击力`)}}let gamer1 = new Attacker('吉吉喵', 99, 3)let gamer2 = new Attacker('雷电猴', 20, 10)gamer1.display()gamer2.display()gamer1.giveMoney(gamer2, 20)gamer1.display()gamer2.display()
语法小技巧
解构赋值(destructing assignment)
简化取出对象里边的数据的写法
let arr = [1,2,3]let obj = {a:88, b:99}let {a, b} = obj//简化了 let a = obj.a// let b = obj.blet [c, d, e] = arr//简化了 let c = arr[0]// let d = arr[1]// let e = arr[2]console.log(a,b,c,d,e)
内置方法(built-in methods)
数组
数组内置方法的详细内容可参考 这个页面
let arr = [1,2,3,4,5]arr.lengtharr.concat()arr.copyWithin()arr.fill()arr.find()arr.findIndex()arr.lastIndexOf()arr.pop()arr.push()arr.reverse()arr.shift()arr.unshift()arr.slice()arr.sort()arr.splice()arr.includes()arr.indexOf()arr.join()arr.keys()arr.entries()arr.values()arr.forEach()arr.filter()arr.flat()arr.flatMap()arr.map()arr.every()arr.some()arr.reduce()arr.reduceRight()arr.toLocaleString()arr.toString()
字符串
字符串内置方法的详细内容可参考 这个页面
let str = 'abcde'str.lengthstr.anchor()str.big()str.blink()str.bold()str.charAt()str.charCodeAt()str.codePointAt()str.concat()str.endsWith()str.fontcolor()str.fontsize()str.fixed()str.includes()str.indexOf()str.italics()str.lastIndexOf()str.link()str.localeCompare()str.match()str.matchAll()str.normalize()str.padEnd()str.padStart()str.repeat()str.replace()str.search()str.slice()str.small()str.split()str.strike()str.sub()str.substr()str.substring()str.sup()str.startsWith()str.toString()str.trim()str.trimStart()str.trimLeft()str.trimEnd()str.trimRight()str.toLocaleLowerCase()str.toLocaleUpperCase()str.toLowerCase()str.toUpperCase()str.valueOf()str.replaceAll()
对象
对象内置方法的详细内容可参考 这个页面
Object.assign()Object.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptors()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.is()Object.preventExtensions()Object.seal()Object.create()Object.defineProperties()Object.defineProperty()Object.freeze()Object.getPrototypeOf()Object.setPrototypeOf()Object.isExtensible()Object.isFrozen()Object.isSealed()Object.keys()Object.entries()Object.fromEntries()Object.values()
数学
数学内置方法的详细内容可参考 这个页面
let arr = [1,2,3,4,5]arr.lengtharr.concat()arr.copyWithin()arr.fill()arr.find()arr.findIndex()arr.lastIndexOf()arr.pop()arr.push()arr.reverse()arr.shift()arr.unshift()arr.slice()arr.sort()arr.splice()arr.includes()arr.indexOf()arr.join()arr.keys()arr.entries()arr.values()arr.forEach()arr.filter()arr.flat()arr.flatMap()arr.map()arr.every()arr.some()arr.reduce()arr.reduceRight()arr.toLocaleString()arr.toString()
JSON
JSON.parse()JSON.stringify()
