欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数与数据类型详解

程序员文章站 2022-05-21 22:51:07
...

函数

1. 命名函数:(有名字的函数,命名采用动名词结构,动词 + 名词)

实例:

  1. function getName(username) {
  2. return "hello " + username;
  3. }
  4. console.log(getName("小柯"));

2. 匿名函数:没有名字的函数

  • 执行方式1: 立即执行:声明 + 执行 2合1,
  • 立即执行函数( IIFE ): 阅后即焚,不会给全局环境带来任何的污染,用来创建临时作用域
    实例:

    1. (function (username) {
    2. console.log("hello " + username);
    3. })("小柯");
  • 执行方式2: 函数表达式,将匿名函数保存到一个变量中

  • 将”函数声明”, 变成”变量声明”, 只不过, 变量的值,是一个函数声明
    1. const getUserName = function (username) {
    2. return "hello" + username;
    3. };
    4. console.log(getUserName("小柯"));
  • 执行方式3: 重点学习,箭头函数 =>

  • 举例:有两个参数的情况

    1. let f1 = function sum(a, b) {
    2. return a + b;
    3. };
    4. console.log(f1(10, 50));

// 使用 箭头函数 来简化匿名函数的声明
// 匿名函数转箭头函数的语法
// 1. 去掉 function ,去掉函数名
//
2. 在参数括号(…) 与 大括号{…} 之间使用 胖箭头 => 连接
// 3.只有一个参数的时候, 参数列表的小括号也可以不要了
//
4.只有一条语句的时候,return和大括号都可以不要了
// 4.只有一条语句的时候,没有参数的情况小括号()必须写上,也可以用”$”或者”_”来代替(特殊情况)
//
6.箭头函数,内部的 this ,是固定的,与它的上下文绑定,不能充当构造函数来创建对象,内部没有 arguments 对象

  • 有两个参数的情况简化例如:
    1. f2 = (a, b) => {
    2. return a + b;
    3. };
    4. console.log(f2(10, 50));
  • 只有一个参数的情况,例如:
    1. f3 = username => {
    2. return "hello " + username;
    3. };
    4. console.log(f3("小柯"));
  • 只有一条语句的时候,例如
    1. f4 = c => c * 10;
    2. console.log(f4(8));
    // 没有参数的情况小括号必须写上,也可以用”$”或者”_”来代替(特殊情况)
  1. f5 = () => "小柯语录";
  2. console.log(f5());
  3. f6 = _ => "小柯语录2";
  4. console.log(f6());

// ! 使用场景

// 1. 如果函数需要多次调用, 用命名, 函数表达式, 都可以
// 2. 如果代码要求,必须遵循”先声明, 再调用”的规则, 那就必须用”函数表达式”
// 3. 如果只有完成一些特定的,一次性的工作, 不想留下任何痕迹, 用”IIFE”(立即执行函数), 模块
// 4. 如果调用函数时,需要一个函数充当参数,例如:回调, 就可以使用箭头函数来简化 匿名函数的 声明

数据类型

1. 原始类型:也叫简单类型

//基本类型: 一个变量,就存一个值,变量类型完全由这个值来决定的
// * number, string, boolean, undefined, null
// 不可再分, 是构成其它复合类型的基本单元

  1. // 数值类型;
  2. console.log(123456, typeof 123456);
  3. // 字符串类型
  4. console.log("你好", typeof "你好");
  5. //布尔类型
  6. console.log(true, typeof true);
  7. // undefined类型:已声明未赋值变量的默认值
  8. console.log(undefined, typeof undefined);
  9. // 未赋值;
  10. let a;
  11. console.log(a);
  12. // 已赋值
  13. a = 1;
  14. console.log(a);
  15. // 对象类型:null是一个空值。
  16. console.log(null, typeof null);

2. 引用类型

// 引用类型: 类似其它语言中的”复用类型”, 集合类型
// 引用类型的数据,由一个或多个, 相同, 或不同类型的”原始类型”的值构造
// 是一个典型的多值类型,一个变量里面对应的是多个值
// * array, object, function(数组,对象,函数)
// 引用类型, 都是对象, 默认返回 object ,函数除外 function

2.1 数组

// 声明格式:const arr = [数组成员1,数组成员2];
实例1:

  1. const arr = ["笔记本电脑", 99, 9999];
  2. console.log(arr);
  3. // 数组的索引是从0开始递增的正整数, 0, 1, 2
  4. console.log(arr[0]);
  5. console.log(arr[1]);
  6. console.log(arr[2]);
  7. console.log(arr[3]);
  8. //超过了就没有值了,越界了

实例2:

  1. // 判断数组类型的正确方法,记牢
  2. console.log(Array.isArray(arr));
  3. // 为了更直观的表达数据之间的关联, 可以将 数字索引 换 有意义 的"字符串",以下举例对象字面量
  4. const arr1 = { name: "笔记本电脑", num: 99, price: 9999 };
  5. console.log(arr1);
  6. const arr2 = { 0: "笔记本电脑", 1: 99, 2: 9999 };
  7. console.log(arr2);

2.2 对象

// 对象 更像一个语义化的数组
// name, num , price叫做属性,类似于变量
实例1:

  1. const obj1 = { name: "笔记本电脑", num: 99, price: 9999 };
  2. console.log(obj1);
  3. //打印单个属性值,就访问那个语义化的属性名称即可,例如下方
  4. console.log(obj1["name"]);
  5. console.log(obj1["num"]);
  6. console.log(obj1["price"]);
  7. // 因为对象的属性名称都是合法的标识符,可以使用点来访问,结果都是一模一样的。例如下方
  8. console.log(obj1.name, obj1.num, obj1.price);
  9. // 当属性名是非常标识符时, 必须使用数组的方式来访问对象的属性,即外面加中括号,里面加双引号包裹,才可以实现正常访问
  10. obj2 = { "my email": "xiaoke@email.cn" };
  11. console.log(obj2["my email"]);

// * 对象最吸引人的,不是数组的语义化封装, 而是对数据操作的封装, 方法(语法与函数是一样的)
// 本质上来说, 对象, 就是变量与函数的封装, 内部, 变量改口叫属性, 函数改口叫方法
// 方法(语法与函数是一样的写在内部)
// total:function(){}

实例2:

  1. obj3 = {
  2. name: "笔记本电脑",
  3. num: 11,
  4. price: 9999,
  5. // 例如做一个数据格式化的输出,使用方法total
  6. total: function () {
  7. let str = obj3.name + " 总计: " + obj3.num * obj3.price + " 元 ";
  8. return str;
  9. },
  10. };
  11. console.log(obj3.total());
  12. //另外的一种写法
  13. obj4 = {
  14. name: "笔记本电脑",
  15. num: 10,
  16. price: 9999,
  17. // 反引号声明的模板字符串, 可以插入变量/表达式, 这叫"插值"
  18. total: function () {
  19. let str = `${obj4.name} 总计 ${obj4.num * obj4.price} 元`;
  20. return str;
  21. },
  22. };
  23. console.log(obj4.total());
  24. obj5 = {
  25. name: "笔记本电脑",
  26. num: 100,
  27. price: 9999,
  28. // 应该是对象内部, 使用 当前对象的一个引用, 这样才独立于外部对象,
  29. //即”obj4“这个改了一个其他的全部都要改太累了,则使用this来进行代替使用,不论现在改成obj5还是其他参数都不影响输出
  30. total: function () {
  31. let str = `${this.name} 总计 ${this.num * this.price} 元`;
  32. // this: 始终与当前对象绑定(执行环境 / 执行上下文 )
  33. // this实际上是 = obj5
  34. return str;
  35. },
  36. };
  37. console.log(obj5.total());

// 判断对象类型的更优雅的方法,记牢
//console.log(obj5 instanceof Object);

// 实际工作中, 而是将数组与对象组合起来一起用
// obj6是一个由三个对象构成的数组,外面是数组里面是三个对象
实例3:

  1. obj6 = [
  2. { name: "手机", num: 2, price: 5000 },
  3. { name: "电脑", num: 2, price: 5000 },
  4. { name: "相机", num: 2, price: 5000 },
  5. ];
  6. // 假设这个是购物车,求三个商品的价格总和
  7. let res = obj6.map(item => item.num * item.price).reduce((acc, cur) => acc + cur);
  8. console.log(res);

3. 函数

// 函数是一种数据类型 , 既是函数也是对象
// 判断是否是函数
console.log(typeof function () {});
// 判断是否是对象
console.log(function () {} instanceof Object);

函数是数据类型的好处?

// 可以当成普通值来使用, 例如充当函数的参数,或者函数的返回值
// 这个很重要, 当参数,就是回调函数, 当返回值,可以创建一个闭包
// js中很多高级应用, 都严重依赖这二个功能, 这也是”高阶函数”的基本特征
// 函数是js的一等公民, 就是通过这个体现的(可以当作函数参数,也可以当作函数的返回值)

实例1:

  1. function f7(callback) {
  2. // 参数 callback 是一个函数
  3. console.log(callback());
  4. }
  5. // 调用f1, 匿名函数当成f1的参数
  6. f7(function () {
  7. return "hello 树先生";
  8. });

应用场景2: 函数当成返回值, 这就是闭包
实例2:

  1. function f8() {
  2. let a = 1;
  3. return function () {
  4. //从1 开始就使用a++
  5. return (a = a + 1);
  6. };
  7. }
  8. console.log(f8);
  9. const f = f8();
  10. console.log(f);
  11. console.log(f());
  12. console.log(f());
  13. console.log(f());
  14. console.log(f());
  15. console.log(f());
  16. console.log(f());
  17. console.log(f());
  18. console.log(f());
  19. //* 以上的回调 + 闭包, 都是函数当成"值"来用的经典应用场景
  20. // * 下面是函数当成对象来用
  21. // * 对象有属性和方法, 当然函数也有属性有方法
  22. function xiaoke(a, b) {
  23. return a + b;
  24. }
  25. // 查看函数名
  26. console.log(xiaoke.name);
  27. // 查看函数需要几个参数
  28. console.log(xiaoke.length);
  29. //属性可以添加
  30. xiaoke.email = "840200456@qq.com";
  31. console.log(xiaoke.email);

函数当成对象有啥用呢?

//对象可以被继承,实现代码复用
// 而JS就是基于原型,实现的继承, 而原型,就是在函数上创建一个普通对象而已
// console.log(xiaoke.prototype);查看函数原型,可忽略
//
后面要学到的类class,构造函数, 他们都是基于”函数是对象”这个前提的