函数
函数就是一个内部封装了部分代码的盒子,可以在多个位置被调用
函数的使用
函数的定义(创建)
声明式定义
function 函数名(参数:非必传) { 函数被调用的时候需要执行的某一段代码 }
function sum() {
for(var i = 1; i <= 10; i++){
if (i % 2 === 0) {
console.log(i);
}
}
}
赋值式定义
var 函数名 = function (参数: 非必传) {}
var num = function () {
console.log(1);
}
函数的调用
调用的时候 不管如何定义, 都是使用 函数名()
如果一个函数只定义, 而不调用, 那么永远不会执行
函数的参数
为了 让函数的功能 更加灵活, 不会导致函数的功能太过于死板
一个函数可以接收多个形参与实参, 多个形参与实参使用、间隔,不能多到影响阅读
形参和实参的数量可以不一致 (非常不推荐)
函数中 参数可以具有默认值 (ES6 的新写法):如果一个 函数的参数给了 默认值, 那么这个参数永远不会是 undefined
形参
函数定义时小括号中书写的内容, 相当于在函数中 创建了一个变量
具体的值 有实参提供, 如果 实参没有传递对应的内容, 那么值为 undefined
实参
函数调用时小括号中书写的内容, 这里书写的内容, 会传递给 对应的 形参
num()
//函数定义的小括号里为形参
function num(a,b){
console.log(a, b);
}
//函数调用的小括号里为实参
num(1,2)
//实参给的多了忽略多出内容
// 第一个实参会按照顺序给第一个形参, 并以此类推
//多写的实参, 没有对应的形参接收, 那么在函数中暂时无法使用
num(1,2,3)
//实参给的少了,多写的形参没有对应的实参传递具体的值,相当于 变量定义了但没有赋值,输出undefined
num(1)
//解决上述问题方法函数中 参数可以具有默认值
//es5
function num2(a, b) {
if (b === undefined) {
b = '未给出b的值'
}
console.log(a,b);
}
num2(1)
//es6 只有实参给的少了才将赋值号右侧的值赋给形参
function num3(a, b = '未给出b的值') {
console.log(a,b);
}
num3(1)
num3(1, 2)
函数的返回值
每一个函数调用完毕后 都会有一个结果(值), 默认为 undefined
关键字 return:后边可以跟 任何的数据, 包括表达式 函数中 return 只会生效一个, 因为 return 具有中断函数的能力, 所以一般 return 会写在函数的末尾,如果想要写在函数的 开头, 必须结合 分支语句
// function fn () {}
// // 将 fn 函数的 执行/调用 结果, 存到一个变量 res 中
// var res = fn()
// console.log(res) // undefined
// console.log(fn()) // undefined
// function fn () {
// return '书写你要返回的内容'
// return 1 + 1 // 函数中 return 只会生效一个
// }
// // 将 fn 函数的 执行/调用 结果, 存到一个变量 res 中
// var res = fn()
// console.log(res)
// console.log(fn())
// return 具有中断函数的能力 return 不具备 打印的功能, 如果你想看在控制台看到数据, 请书写 console
function fn(x, y) {
var min = x > y ? y : x
// 拿到 1~较小值 之间的所有数字
for (var i = min; i >= 1; i--) {
// 寻找 x 和 y 的公约数
if (x % i === 0 && y % i === 0) {
// console.log(i)
/**
* 当前 分支语句执行的时候, 代表找到了 公约数
* 顺序中 第一个就是最大公约数, 所以当前分支第一次执行完毕后, 就等于找到了最大公约数
*
* 然后直接 return i 将最大公约数返回给外部, 并且函数到此结束, 后续不在运行
*/
return i
}
}
}
对象
属于 引用数据类型,存储基本数据类型的集合
对象的花括号中书写的不是代码, 而是键值对格式的数据
键值对 --- key/value --- 属性名:属性值
冒号左边的统称为: 键/key/属性名
右边统称为: 值/value/属性值
创建对象
- 字面量方式创建对象
- 语法:
var obj = {} var obj1 = {键值对, 键值对}
- 语法:
- 内置构造函数创建
- 语法:
var obj = new Object()
- 语法:
- 对象内对于 键(key) 的要求
- 推荐使用符合变量命名规则和规范的名字
- 可以使用纯数字当作 键名
- 这种情况下该属性会排列在最前面
- 可以使用任何特殊符号
- 使用特殊符号的时候,在书写时需要被引号包裹
对象数据类型的操作(增删改查)两种语法
//点语法
var obj = {
name : '张三',
id : 119,
}
console.log(obj);
// 2.1 增 对象名.新的属性名 = 对应的属性值
obj.sex = '男'
console.log(obj);
// 2.2 删 delete 对象名.要删除的属性名
delete obj.name
console.log(obj);
// 2.3 改 对象名.要修改属性值的属性名 = 新的属性值
obj.id = 120
console.log(obj);
// 2.4 查 对象名.要查询的属性名 会得到对应的属性值
console.log(obj.sex);
//中括号语法
var ob = {
tel:119,
email:223,
name:'班晨然'
}
console.log(ob);
// 增 对象名['要新增的属性名'] = 对应的属性值
ob['sex'] = '男'
console.log(ob);
// 删 delete 对象名['要删除的属性名']
delete ob['email']
console.log(ob);
// 改 对象名['要修改的属性名'] = 新的属性值
ob['tel'] = 110
console.log(ob);
// 查 对象名['要查询的属性名']
console.log(ob['name']);
对象点语法和中括号语法的区别
- 只要正常情况, 对象的属性名符合变量的命名规则与规范的情况下, 使用点语法或者中括号语法 没有任何区别
- 是在遇到一些特殊的属性名的时候 就要更换了, 比如 说属性名为数字
- 还有一种情况, 属性名想要使用变量的时候, 也需要使用中括号语法
//二者区别
var obe = {
0: '这是零',
1: '这是一'
}
console.log(obe);
//console.log(obe.0); //错误
console.log(obe['0']); //可以
var obw = {
name : 'yao'
}
var myName = 'name'
console.log(obw.myName); //.对象的点语法, 会将 . 后边的 这个单词/属性 视为一个普通字符串,而不会当成一个变量,所以现在相当于 去 对象 obj 中 查找一个 属性名为 myName 的键值对,但是对象中并没有, 所以得到了一个 undefined
console.log(obw[myName]); //加引号同上,不加是变量名,所以可以查到
//通常用点语法,键为数字或者要写变量名用中括号语法