1.变量
格式:let
作用域:代码成员的可见范围
作用域类型:块作用域,函数作用域, 全局作用域
2.常量
格式:const
命名规则写法特点:必须是: 字母,数字, 下划线"_", "$"(四种),其它字符均是非法符号;首字母不得使用"数字"
注意:声明时,必须初始化
3.函数
3.1.命名函数
function getName(username) {
return 'Hello ' + username;
}
console.log(getName('aaaa'));
3.2.匿名函数
// 第一种声明方式,将匿名函数当成值赋给一个变量
let getUserName = function(username) {
return 'Hello ' + username;
};
console.log(getUserName('aaaa'));
// 第二种方式将声明与调用二合一: 立即调用函数,IIFE
// 表达式,是用一对括号包住的
console.log(
(function(username) {
return 'Hello ' + username;
})('aaaa')
);
3.3.箭头函数用来简化匿名函数的声明
// 1).标准命名函数,需修改成箭头函数
function sum(a, b) {
console.log(a + b);
}
// 2).将命名函数改成了匿名函数
let add = function(a, b) {
console.log(a + b);
};
// 3).使用箭头函数来简化匿名函数
// => 胖箭头, ->
// 转化方法
// <1>. 去掉 function
// <2>. 在参数列表与大括号之间使用 '=>'
add = (a, b) => {
console.log(a + b);
};
// 如果只有一个参数,可以不写参数列表的括号
add = a => {
console.log(a + 88);
};
// 如果没有参数,括号必须加上
add = () => {
console.log(34 + 88);
};
// 如果函数体只有一条语句, 大括号都可以不用
add = () => console.log(34 + 88);
add();
注意:1. 如果函数需要多次调用, 用命名, 函数表达式, 都可以
2. 如果代码要求,必须遵循"先声明, 再调用"的规则, 那就必须用"函数表达式"
3. 如果只有完成一些特定的,一次性的工作, 不想留下任何痕迹, 用"IIFE", 模块
4. 如果调用函数时,需要一个函数充当参数,例如:回调, 就可以使用箭头函数来简化 匿名函数的 声明
4.数据类型
4.1.原始类型
原始类型: number, string, boolean,undefined, null
// console.log(100 + 200);
console.log(typeof 100, typeof 200);
console.log('hello ' + 'world');
console.log(typeof('hello ' + 100));
// 为什么要发生类型转换?
// 因为不同的类型的数据,不能直接运算
// 先转换,再运算
console.log(true, false);
console.log(typeof true);
console.log(typeof(true + 1));
// true => 1 隐式转换
console.log(typeof undefined);
let a;
console.log(a);
console.log(null);
// 一个变量对应一个值,标量
4.2.引用类型
引用类型:array, object, function
4.2.1.数组
// 一个变量保存的是一个集合,并非单值,访问时不能直接访问,必须通过这个变量的引用来访问
// 数组
// const arr = [1, 2, 3];
// const arr = [1, 'admin', true];
const arr = [1, 'admin', [1, 2, 3], true];
console.log(arr);
// 访问数据元素,必须通过数组的引用(数组名称arr)来访问(arr是一个访问入口)
// 数组成员 的索引是从0开始
console.log(arr[1]);
console.log(arr[2][1]);
// 引用类型判断不能用typeof
console.log(typeof arr);
console.log(Array.isArray(arr));
4.2.2.对象
// 对象
// 先把对象想象成一个关联数组
let obj = {
id: 1,
username: 'jack',
num: [1, 2, 3],
isOk: true,
'my email': '498668472@qq.com',
};
console.log(arr[1]);
console.log(obj['username']);
// 为了简化,并与数组区别,对象有自己的成员访问符: .
console.log(obj.username);
console.log(obj['my email']);
function getUser(obj) {
return 'id =' + obj.id + ', username =' + obj.username;
}
console.log(getUser(obj));
// 对象是可以将数据与函数封装到一起,做为一个独立的编程单元
// 对象字面量
obj2 = {
id: 1,
username: 'jack',
num: [1, 2, 3],
isOk: true,
'my email': '498668472@qq.com',
// 将一个函数转为对象的方法,封装到对象中
getUser: function() {
// 在对象中,使用变量this来引用对象自身
return 'id =' + this.id + ', username =' + this.username;
},
};
console.log(obj2.getUser());
4.2.3.函数
函数是对象,也是一个值,可以当成参数传递
,也可以当成返回值
//1)参数传递
function f1(callback) {
console.log(typeof callback);
console.log(callback());
}
f1(function() {
return 'Hello aaaa';
});
//2)返回值: 闭包
function f2() {
// a是 f2的私有变量
let a = 1;
return function() {
// return (a += 1);
// 而此时,子函数中的a并不是自己的,是父函数的
return a++;
};
}
console.log(f2());
const f = f2();
// console.log(f);
console.log(f());
console.log(f());
//3)函数就是对象,对象就可以添加属性和方法