`
乱蓬头199303
  • 浏览: 80437 次
文章分类
社区版块
存档分类
最新评论

从JS对象开始_谈一谈究竟什么是“不可变数据”和函数式编程

阅读更多

摘要: js中的对象是那么美妙:我们可以随意复制他们,改变并删除他们的某项属性等。但是要记住一句话: “伴随着特权,随之而来的是更大的责任。” (With great power comes great responsibility)

作为前端开发者,你会感受到JS中对象(Object)这个概念的强大。我们说“JS中一切皆对象”。最核心的特性,例如从String,到数组,再到浏览器的APIs,对象这个概念无处不在。这里你可以了解到JS Objects中的一切。

 

同时,随着React的强势崛起,不管你有没有关注过这个框架,也一定听说过一个概念—不可变数据(immutable.js)。究竟什么是不可变数据?这篇文章会从JS源头—对象谈起,让你逐渐了解这个函数式编程里的重要概念。

 

JS中的对象是那么美妙:我们可以随意复制他们,改变并删除他们的某项属性等。但是要记住一句话:

 

“伴随着特权,随之而来的是更大的责任。”

(With great power comes great responsibility)

 

的确,JS Objects里概念太多了,我们切不可随意使用对象。下面,我就从基本对象说起,聊一聊不可变数据和JS的一切。

 

这篇文章缘起于Daniel Leite在本月16日的文章:Things you should know about Objects and Immutability in JavaScript,我进行了翻译,并改写了用到的例子,以及进行了大量更多的扩展。

 

可变和共享是万恶之源

 

不可变数据其实是函数式编程相关的重要概念。相对的,函数式编程中认为可变性是万恶之源。但是,为什么会有这样的结论呢?

 

这个问题可能很多程序员都会有。其实,如果你的代码逻辑可变,这并不是“政治错误”的。比如JS中的数组操作,很对都会对原数组进行直接改变,这当然并没有什么问题。比如:

 

let arr = [1, 2, 3, 4, 5];

arr.splice(1, 1); // 返回[2];

console.log(arr); // [1, 3, 4, 5];

 

这是我们常用的“删除数组某一项”的操作。好吧,他一点问题也没有。

 

问题其实出现在“滥用”可变性上,这样会给你的程序带来“副作用”。先不必关心什么是“副作用”,他又是一个函数式编程的概念。

​​​​​​​

原文链接

 
 
分享到:
评论

相关推荐

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或缺。面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一个重要概念,它允许开发者通过对象来组织代码...

    浅谈Javascript编程风格

    JavaScript编程风格是编程实践中至关重要的一个方面,它不仅关乎个人编程习惯,更是直接影响代码的可读性、可维护性和减少潜在错误的关键因素。本文将基于Douglas Crockford的演讲和其编写的代码规范,探讨...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言...

    浅谈JavaScript编程语言的编码规范.docx

    变量、函数和对象的命名应清晰、有意义,遵循驼峰式命名(camelCase)或下划线分隔(snake_case)的约定。避免使用保留字,并保持命名一致性。 在变量声明时,推荐使用`var`、`let`或`const`关键字明确声明变量的...

    浅谈Javascript嵌套函数及闭包

    闭包是一个强大且有用的特性,它在函数式编程范式中扮演着重要角色,但过度使用闭包或对其原理理解不足也可能会导致程序出现难以跟踪的错误和性能问题。因此,掌握闭包,特别是嵌套函数和作用域链的概念,是每一个...

    浅谈计算机应用软件开发中编程语言的选择研究中英文对照.doc

    - **灵活性**:C语言支持过程化编程、函数式编程等多种编程范式,为开发者提供了灵活多样的编程方式。 - **广泛应用领域**:除了系统开发之外,C语言还广泛应用于嵌入式系统、游戏开发等领域。 - **学习曲线**:尽管...

    关于JavaScript 数组你应该知道的事情(推荐)

    注意: 在开始之前,不得不了解一件事:我比较偏爱函数式编程。所以我倾向于使用的方法不会直接改变原来的数组。这种方法,我避免了副作用。我不是说不应该改变数组,但至少要了解那些方法会改变,那些会有副作用。...

    浅谈js对象的创建和对6种继承模式的理解和遐想

    JavaScript中的继承机制是其面向对象编程的核心特性,它允许我们创建类似的对象并共享属性和方法。在这篇文章中,我们将探讨六种不同的继承模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承和寄生组合...

    浅谈JS继承_寄生式继承 & 寄生组合式继承

    在JavaScript中,继承是...这两种模式都是JavaScript实现面向对象编程的重要工具,理解它们的原理和应用对于编写可维护、高效的代码至关重要。在实际开发中,可以根据需求选择合适的继承策略,以实现代码的复用和扩展。

    浅谈javascript 函数表达式和函数声明的区别

    在JavaScript编程中,函数作为一等公民,其声明的方式主要有两种:函数声明式和函数表达式。它们在使用上有一些差异,这会影响程序的行为和执行方式。 首先,函数声明式是一种在代码中直接声明函数的方式。它的语法...

    浅谈js继承的实现及公有、私有、静态方法的书写

    JavaScript是Web开发中不可或缺的一部分,尤其在前端领域,它的灵活性和强大的功能使得它成为构建交互式用户界面的主要语言。在JavaScript中,继承是面向对象编程的一个核心概念,它允许一个对象(子对象)继承另一...

    浅谈JavaScript编程语言的编码规范

    `let`和`const`则在块级作用域内生效,`const`声明的变量不可重新赋值,但其属性可修改(如果它是对象)。 此外,避免使用全局变量,因为它们可能引发命名冲突和内存泄漏。善用模块化技术(如CommonJS、ES6模块)来...

    浅谈javascript中的作用域

    在JavaScript编程中,作用域是一个重要的概念,它决定了变量和函数可以被访问和使用的区域。与一些其他编程语言相比,JavaScript的作用域机制有所不同,因此开发者需要特别注意。 首先,JavaScript中的作用域分为两...

    浅谈AngularJs 双向绑定原理(数据绑定机制)

    在AngularJS中,双向绑定是其核心特性之一,它极大地简化了...这种设计理念在现代前端框架如React、Vue等中得到了广泛应用,体现了声明式编程的优势。理解并掌握双向绑定机制对于高效使用AngularJS进行开发至关重要。

    浅谈Angular.js中使用$watch监听模型变化

    总结来说,Angular.js的$watch机制是实现数据绑定和响应式编程的关键。正确使用$watch,理解其参数和相关函数,以及注意性能优化,可以帮助你构建更高效、更健壮的Angular应用。在实际开发中,应尽可能减少不必要的$...

Global site tag (gtag.js) - Google Analytics