广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript的高级概念和用法详解
  • 225
分享到

JavaScript的高级概念和用法详解

2024-04-02 19:04:59 225人浏览 薄情痞子
摘要

目录1. 闭包2. 函数绑定3.使用命名空间4. 判断属性是否存在5. 解构赋值6.遍历对象属性7. 过滤数组8. 消除重复值9. 判断是否数组10. 转换数字和字符串11. 转换为

javascript语言不断发布一些新特性,感觉要上天的节奏啊。本文搜集整理了一些它的高级概念和用法,来看看你是否都了解?代码这样写是不是更优雅了?

1. 闭包

闭包是Javascript中的一项重要技术,内部函数始终可以访问其外部函数的变量和参数,即使在外部函数返回后也是如此。我们使用闭包来保护我们不想向外部范围公开的数据。

//
<button onclick=”increaseCounter()”>Increase Counter</button>
//1. 全局变量,变量会被意外修改
let counter = 0;
function increaseCounter() {
  counter++;
}
//2. 局部变量,每次调用都重置为0
function increaseCounter() {
  let counter = 0;
  counter++;
}
//3. 闭包函数,符合要求
const increaseCounter = (function() {
  let counter = 0;
 
  return function() {
    counter = counter + 1;
    console.log(counter);
  };
})();

2. 函数绑定

在上下文丢失时,this将无法被确定,可以通过函数绑定解决。

// 1. 与预期不符,得到undefined
let book = {
  title: ‘Learn JavaScript',
  printTitle() {
    console.log(`Book's title: ${this.title}`);
  }
}
setTimeout(book.printTitle, 1000); // Book's title: undefined

// 2. 利用函数绑定,符合预期
let book = {
  title: ‘Learn JavaScript',
  printTitle() {
    console.log(`Book's title: ${this.title}`);
  }
}
let printTitle = book.printTitle.bind(book);
setTimeout(printTitle, 1000); // Book's title: JavaScript

3.使用命名空间

使用命名空间可以防止代码冲突。

// 1. move、jump函数在animal命名空间下,需要通过animal.move()来调用
let animal = {
  move: () => {
    console.log(‘Move!');
  },
  jump: () => {
    consle.log(‘Jump!');
  }
};

// 2. 真实项目中,可能会按如下方式使用命名空间
if (typeof APP === "undefined") {
  APP = {};
  APP.ANIMAL = {};
}
APP.ANIMAL.move = () => {
  console.log(‘Move');
};
APP.ANIMAL.jump = () => {
  console.log(‘Jump');
};
APP.ANIMAL.move(); // Move
APP.ANIMAL.jump(); // Jump

4. 判断属性是否存在

使用in关键字可以判断对象中是否存在某个属性。

const person = {
  id: "123",
  name: "张三"
}
console.debug("id" in person) //true
console.debug("age" in person) //false

5. 解构赋值

利用解构赋值表达式,可以将属性、值从对象、数组中取出,赋值给其它变量,非常方便。

const { address: addressLine } = { address: "长安街20号", postcode: "518118" };
console.warn(addressLine); // 长安街20号
const [first, second] = [1, 2, 3, 4]
console.warn(first, second) // 1 2
//动态解构
const extracTKEy = "postcode"
const { [extractKey]: youbian } = { address: "长安街20号", postcode: "518118" };
console.log(youbian) //518118

6.遍历对象属性

使用Object.entries可以遍历对象的属性和值。

const data = { address: "长安街20号", postcode: "518118" };
Object.entries(data).forEach(([key,value]) => {
  if (["address", "postcode"].includes(key)) {
    console.log('key:', key , 'value:', value)
  }
})
//输出结果如下
key: address value: 长安街20号
key: postcode value: 518118

7. 过滤数组

利用数组的filter、some对数组进行筛选。

const fruits = ["apple", null, "monGo", undefined, ""]
const filted = fruits.filter(Boolean)
console.debug(filted) //(2) ["apple", "mongo"]
const any = fruits.some(Boolean)
console.log(any) //true

8. 消除重复值

const fruits = ["apple", null, "mongo", "apple", ""]
const uniqued = [...new Set(fruits)]
console.debug(uniqued) //(4) ["apple", null, "mongo", ""]

9. 判断是否数组

利用Array.isArray,而不是typeof判断。

const fruits = ["apple", null, "mongo", "apple", ""]
console.debug(typeof fruits) //object
console.error(Array.isArray(fruits)) //true

10. 转换数字和字符串

const text = "12345"
console.debug("text:", +text, "typeof:", typeof(+text)) //text:12345 typeof:number
const num = 123456
console.debug("number:", num+"", "typeof:", typeof(num+"")) //number:123456 typeof:string

11. 转换为boolean

利用!!运算符可以将其它类型转换为Boolean类型。

console.log(!!null, typeof(!!null)) //false, boolean
console.log(!!"", typeof(!!"")) //false, boolean
console.log(!!undefined, typeof(!!undefined)) //false, boolean
console.log(!!null, typeof(!!null)) //false, boolean
console.log(!!true, typeof(!!true)) //true, boolean
console.log(!!false, typeof(!!false)) //false, boolean
console.log(!!{id:"", name:""}, typeof(!!{id:"", name:""})) //true, boolean

12. 可选链

可选链 ?. 是一种访问嵌套对象属性的安全的方式,可避免在对象或属性不可用时抛出异常。由于JavaScript不是类型化语言,该特性还是很有用。

//未使用可选链接,将抛出异常
const contactInfos = { address: "长安街20号" };
console.warn(contactInfos.user.phoneNumber)
// 以上语句将报错:Cannot read properties of undefined (reading 'phoneNumber')
//使用可选链接,将打印undefined
const contactInfos = { address: "长安街20号" };
console.warn(contactInfos.user?.phoneNumber) // undefined

13. 合并运算符

合并运算符的写法为两个问号 ??,对于该运算符连接的两个参数,如果第一个参数不是 null,也不是undefined,则返回第一个参数,否则返回第二个参数。

const contactInfos = { address: "长安街20号" };
console.warn(contactInfos.user?.phoneNumber ?? "") // ""
const contactInfos = { address: "长安街20号", addressNumber: 0 };
console.warn(contactInfos.addressNumber || undefined) // undefined
console.warn(contactInfos.addressNumber ?? undefined) // 0

14. 有条件地添加属性

使用...扩展语法,可以仅当某个条件成立时,才为对象添加某个属性。

const moreInfos = { info: "请开车前往." }
return {
  address: "长安街20号",
  postcode: "518118",
  ...(moreInfos !== undefined && { moreInfos }) //仅当moreInfos不是undefined时,才添加moreInfos属性
}

15. 异步调用异常捕获

以下写法让处理异步调用异常的代码变得更为简洁。

const results = await getPosts().catch((err) => {
  return {
    type: "error",
    message: err.message
  }
});
console.warn(results) // { type: "error", message: "cannot get posts from this endpoint" }

16. 弱引用Map

Weakmap不同于Map,它的键必须是引用对象,不能是基础类型,如果没有对该键对象引用时,该对象将被从Map和内存中移除。

const videoSegments = new WeakMap()
let options = { id: "1234", timeStart: 1653831957378, size: 10000 }
const segment = { data: new Uint8Array(200) }
videoSegments.set(options, segment)
console.warn(videoSegments.get(options)) // { data: new Uint8Array(200) }
//以下当options被赋值为null后,该对象将被移除和回收
options = null
console.warn(videoSegments.has(options)) // false, the `options` key object is deleted from the WeakMap

17. 反射

Reflect是一个全局对象,它为元编程提供了一些有用的静态方法。

const person = { 
  name: 'Bob', 
  [Symbol('email')]: 'bob@evil.com' 
};
Reflect.get(person, 'name'); // = Bob
Reflect.has(person, 'email'); // = true
Reflect.has(person, 'phone'); // = false
Reflect.getPrototypeOf(person); // = { constructor ... }
Reflect.getOwnPropertyDescriptor( person, 'name'); // = { value: 'Bob', writable: true, enumerable: true, configurable: true }
Reflect.ownKeys(person); // name, Symbol(email)
Reflect.defineProperty(person, 'phone', { writable: true });
Reflect.has(person, 'phone'); // = true
Reflect.set(person, 'phone', '123456789');
Reflect.deleteProperty(person, 'phone');
Reflect.has(person, 'phone'); // = false

18. 柯里化

柯里化(Currying)是一种关于函数的高阶技术,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。柯里化不会调用函数,它只是对函数进行转换。

// 完成银行转账交易函数,余额+转入金额-费用
const transaction = (fee, balance, amount) => (
  balance + amout - fee;
);
// 简单实现的柯里化函数
const curry = (fn, ...args) => (
  (..._arg) => (
    fn(...args, ..._arg)
  )
);
// 复用了transaction函数的免交易费函数
const freeTransaction = curry(transaction, 0);
freeTransaction(10, 90); // = 100

19. 组合

组合是一种技术,其中一个函数的结果被传递到下一个函数,该函数被传递到下一个函数,依此类推......直到执行最终函数并计算出一些结果。函数组合可以由任意数量的函数组成。

//f 和 g 都是函数,x 是在它们之间通过“管道”传输的值
var compose = function(f,g) {
  return function(x) {
    return f(g(x));
  };
};
var toUpperCase = function(x) { return x.toUpperCase(); };
var exclaim = function(x) { return x + '!'; };
var shout = compose(exclaim, toUpperCase);
shout("send in the clowns"); //=> "SEND IN THE CLOWNS!"
// 组合函数
const compose = (...fns) => x => fns.reduce((y, f) => f(y), x); 
// 原函数
const addFee = amount => amount + 2;
const aDDDiscount = amount => amount - 5;
// 函数组合
const composition = compose(addFee, addDiscount)(100);
console.log(composition) //97

到此这篇关于JavaScript的高级概念和用法的文章就介绍到这了,更多相关js高级用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript的高级概念和用法详解

本文链接: https://www.lsjlt.com/news/153388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript的高级概念和用法详解
    目录1. 闭包2. 函数绑定3.使用命名空间4. 判断属性是否存在5. 解构赋值6.遍历对象属性7. 过滤数组8. 消除重复值9. 判断是否数组10. 转换数字和字符串11. 转换为...
    99+
    2022-11-13
  • 详解Vue input model的概念和用法
    Vue.js是一种流行的JavaScript框架,它提供了许多方便的功能来简化前端开发。其中,Vue的input model是一种非常方便的方法,可以允许您跟踪输入字段的状态,并使其更容易进行验证。在本文中,我们将介绍Vue input m...
    99+
    2023-05-14
  • Mybatis基础概念与高级应用方法
    今天小编给大家分享一下Mybatis基础概念与高级应用方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Mybatis基础回...
    99+
    2023-07-02
  • MySQL游标概念与用法详解
    本文实例讲述了MySQL游标概念与用法。分享给大家供大家参考,具体如下: 1、游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行。如果开发过安卓的同...
    99+
    2022-10-18
  • MySQL高级特性——数据表分区的概念及机制详解
    目录分区机制SELECT 查询INSERT 操作DELETE 操作UPDATE 操作分区的类型MySQL 的分区的实现方式是对数据表进行一层包装,这意味着索引实际是基于每个分区定义的,而不是整张表。这个特性和 Ora...
    99+
    2022-05-16
    MySQL 高级特性 MySQL 数据表分区
  • python链表的基础概念和基础用法详解
    本文为大家分享了python链表的基础概念和基础用法,供大家参考,具体内容如下 一、什么是链表 链表是由多个不同的节点组成,每个节点通过指针区域关联到一起链表的头指针,指向了头节点,...
    99+
    2022-11-10
  • javascript闭包的概念和作用
    这篇文章主要讲解了“javascript闭包的概念和作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript闭包的概念和作用”吧!1 闭包--...
    99+
    2022-10-19
  • 关于Eureka的概念作用以及用法详解
    目录一、概念1.1、什么是服务治理1.2、 什么是Eureka1.3、 Eureka包含两个组件1.4、 什么场景使用Eureka1.5、 Eureka停更1.6、代码要实现的内容二...
    99+
    2023-05-20
    Eureka概念 Eureka作用 Eureka用法
  • MySQL 事务概念与用法深入详解
    本文实例讲述了MySQL 事务概念与用法。分享给大家供大家参考,具体如下: 事务的概念 MySQL事务是一个或者多个的数据库操作,要么全部执行成功,要么全部失败回滚。 事务是通过事务日志来实现的,事务日志包括:red...
    99+
    2022-05-25
    MySQL 事务
  • vuex的核心概念和基本使用详解
    目录介绍开始安装 ①直接下载方式 ②CND方式③NPM方式④Yarn方式NPM方式安装的使用方式 store概念及使用概念:定义使用mutations概念及使用概念:使用:定义使用a...
    99+
    2022-11-12
  • 一文详解DOM的概念和常用操作
    目录DOM 的概念和常用操作什么是 DOM如何操作 DOM一些常用的 HTML DOM 方法:核心就是增删改查操作,一些常用的 HTML DOM 属性DOM 的概念和常用操作 什么是...
    99+
    2023-05-17
    DOM概念 DOM常用操作
  • JavaScript类型概念及使用的方法
    这篇文章主要介绍“JavaScript类型概念及使用的方法”,在日常操作中,相信很多人在JavaScript类型概念及使用的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • CSS定位的概念和用法
    这篇文章主要讲解了“CSS定位的概念和用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS定位的概念和用法”吧!一、Position(定位)CSS定位属...
    99+
    2022-10-19
  • 拆解 MySQL 的高阶使用与概念
    前面我们主要分享了MySQL中的常见知识与使用。这里我们主要分享一下MySQL中的高阶使用,主要包括:函数、存储过程和存储引擎。 对于MySQL中的基础知识,可以参见 《与 MySQL 的零距离接触...
    99+
    2022-05-19
    MySQL MySQL
  • 详解OpenCV图像的概念和基本操作
    前言: opencv最主要的的功能是用于图像处理,所以图像的概念贯穿了整个opencv,与其相关的核心类就是Mat。 像素: 图片尺寸以像素为单位时,每一厘米等于28像素,如15...
    99+
    2022-11-12
  • MySQL视图的概念和操作函数详解
    目录常见的数据库对象视图的概念创建视图查看视图更新视图数据修改视图删除视图视图的优缺点常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段...
    99+
    2023-03-03
    MySql视图创建 MySql视图的操作 MySQL视图
  • Mybatis Example的高级用法详解
    目录Mybatis Example的高级用法一. mapper接口中的函数及方法二. example实例方法三. 使用案例说说Mybatis Example常见用法一. 说明二. 排...
    99+
    2022-11-12
  • 详解C#中委托的概念与使用
    目录委托的概念多播委托拖动按钮委托的概念 委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数。对于C语言程序员来说,就是把函数指针当作参数传递给另一个函数...
    99+
    2023-02-27
    C#委托使用 C#委托
  • 详解JavaScript数组reduce()方法的高级技巧
    目录1、语法2、实例解析 initialValue 参数3、reduce的简单用法4、reduce的高级用法reduce()方法可以搞定的东西,for循环,或者forEach方法有时...
    99+
    2023-03-24
    JavaScript reduce()方法用法 JavaScript reduce()方法 JavaScript reduce
  • JavaScript中高级语法??表达式用法示例详解
    目录前言具体用法。那么双问号表达式和其他的相似方法有什么不同呢?那么二者之间有什么明显的区别呢?总结前言 在JavaScript中,双问号()表达式是一种非常有用的方法。它的作用是...
    99+
    2023-05-16
    JavaScript语法??表达式 JavaScript高级语法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作