01 - 基础语法
开始应付暑期实训(自己太菜找不到实习),选的是Cocos2D引擎相关,要学习Javascript和Typescript。有了Javascript的基础,Ts就容易掌握了,因此先看看Javascript的基础语法。
输出
提供三种方式输出:
//三种输出的方式
//1.在网页的内部输出
document.write("helloworld");
//2.弹窗里面输出
alert("helloworld");
//3.控制台输出(重点)
console.log("helloworld");
变量
声明变量
可用var
或let
关键字声明一个变量,推荐用let
:
var id = 1;
let name = "LiHua";
它俩的区别如下:
var
定义变量存在变量提升的问题var
定义变量是全局作用域,let
定义变量是块作用域
基本数据类型
有number
类型(包括整数int
和浮点数float
),boolean
布尔值,string
字符串,function
函数,object
特殊对象类。
运算符
1.算术运算符:+ - * / %
2.比较运算符:> < >= <= == != === !==
3.逻辑运算符:&& || !
&&
:所有小条件成立,整个大的条件才成立
||
:只要有一个小条件成立,整个大的条件就成立
!
:取反
其中 与 和 或 有短路操作。
4.赋值运算符:+= -= *= /= %=
5.++ --
6.三目运算符:表达式1 ? 表达式2 : 表达式3
==
和 ===
==
判断相等,存在隐式转换,如果数据类型不一样,但是值一样,判断也是成立的
===
判断相等,数据类型和值都相同
语句
判断语句
判断语句有if
和switch
:
// if
if(判断条件){
判断条件成立的时候执行的代码块;
}
else{
判断条件不成立,执行else的代码块;
}
// switch
switch(){
case :
break;
case :
break;
default:
break;
}
循环语句
循环语句有for
和while
:
// for
for(表达式1;表达式2;表达式3){
循环体;
}
// 表达式1:初始化语句,可以省略的
// 表达式2:循环终止的判断条件
// 表达式3:增量,让循环趋于结束,可以省略
// 上面所说的可以省略,表达是意思是可以在其他地方体现
// while
while(判断条件){
}
// do-while
do{
循环体;
}while(判断条件)
函数
普通函数
一般函数可这样定义和调用:
function test() {
}
test();
如果普通函数想获得调用者的this
,需要使用call()
,bind()
或apply()
:
对于直接调用的场合,使用
call()
:this.a = 123; test(); // this.a = undefined test().call(this); // this.a = 123
对于稍后调用的场合,使用
bind()
或apply()
:function test() { console.log(this.a); }.bind(this, args...); // .apply(this, [arg1, arg2, ...]);
回调函数
匿名函数和箭头函数属于回调函数,用于传参等操作,让其他函数去执行它们,而不是主动去调用。
它们的语法如下:
// 匿名函数
let test = function() {
}
test();
// 箭头函数
let func = () => {
}
func();
箭头函数可将this
传入函数体内部。
函数闭包
看下面一段代码:
function test(){
let num = 0;
function temp(){
num++;
return num;
}
return temp;
}
let temp2 = test();
console.log("num1:" + temp2());
console.log("num2:" + temp2());
console.log("num3:" + temp2());
// 输出1 2 3
test()
是一个函数闭包,其中有变量num
。在执行tmp2 = test()
时初始化num
并返回内部函数temp()
,之后运行temp2()
就是在运行temp()
,且使用外部变量num
。
数组
是特殊的object
类型。
定义
let arr = [1, 2, 3];
增删改查
增
使用.push()
方法往数组末尾添加元素:
arr.push(99);
使用.splice(要插入的索引,删除的长度,插入的数据...)
往数组任意位置添加元素:
arr.splice(2,0,88,99);
删
// 使用.splice()从索引2删除两个元素
arr.splice(2,2);
// 删除所有元素
arr.length = 0;
改
// 使用.splice(), 将索引2的元素修改成99
arr.splice(2, 1, 99);
// 直接通过索引修改
arr[2] = 99;
查
通过索引[ ]
访问。
遍历
通过索引遍历:
for(let i = 0; i < arr.length; i++){
let num = arr[i];
console.log(arr[i]);
}
通过迭代器遍历:
for(let num of arr){
console.log(num);
}
对象
定义
let player = {
hp: 50,
mp: 100
}
对象利用键值对存储数据,键是字符串类型,值是任意类型。
增改查
// 增
player["atk"] = 50;
player.atk = 50;
// 改
player.mp = 200;
player["mp"] = 200;
// 查
// 对象访问属性的方式
// (1)对象名.属性名
// (2)对象名["属性名"]
// 用途:如果存在该属性的情况下,改数据或者查找数据,如果不存在这个属性,插入数据
遍历
for(let key in player){
console.log(key);
console.log(player[key]);
}
this指向问题
谁调用this
,this
就指向谁。例如下方代码player2.print
使用的是player1.print
,但输出的是李四。
//this指向问题:谁调用指向谁
let player1 = {
name: "张三",
print: function () {
console.log(this.name);
}
}
let player2 = {
name: "李四"
}
player2.print = player1.print;
player2.print();
浅/深拷贝
一般都是浅拷贝:
let player1 = {
hp: 100
};
let player2 = player1;
player1.hp = 50;
console.log(player2.hp);// 50
为了让player1
和player2
独立,可以用深拷贝,新建一个空对象,将player1
所有属性赋值到player2
中:
let player2 = {};
player2.hp = player1.hp;
player1.hp = 50;
console.log(player2.hp);// 100