【转载】让你彻底地、永久地搞懂JavaScript的==
大家知道,==
是JavaScript中比较复杂的一个运算符。它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一。在仔细阅读了ECMAScript规范的基础上,我画了一张图,我想通过它你会彻底地搞清楚关于==
的一切。同时,我也试图通过此文向大家证明==
并不是那么糟糕的东西,它很容易掌握,甚至看起来很合理。

大家知道,==
是JavaScript中比较复杂的一个运算符。它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一。在仔细阅读了ECMAScript规范的基础上,我画了一张图,我想通过它你会彻底地搞清楚关于==
的一切。同时,我也试图通过此文向大家证明==
并不是那么糟糕的东西,它很容易掌握,甚至看起来很合理。
JavaScript中的递增和递减运算符都是一元操作符,言外之意就是只能操作一个值的操作符。递增和递减操作符直接借鉴自C语言,各有两种版本:前置型(递增++i
,递减--i
)和后置型(递增i++
,递减i--
)。在JavaScript中,递增(递减)的前置和后置运算符对于初学者都非常容易混淆。我就属于这一类型,这次下定决心把这两者的使用和不同之处了解清楚。如果你和我一样,不仿一起来了解一二。
当在函数调用中通过arguments
对象访问参数时,我总是感觉很不爽。它那硬编码的名字使得要想在内层函数(它拥有自己的arguments
)中访问外层函数的arguments
变得很困难。更糟糕的是它是一个类数组对象。这意味着你不能直接在它身上调用类似.map()
或是.forEach()
这样的方法。
许多时候,this
关键词对我以及许多刚起步的JavaScript程序员来说,都是一个谜。它是一种很强大的特性,但是理解它需要花不少功夫。对有Java, PHP或者其他常见的编程语言背景的人来说,this
仅仅被看成是类方法中当前对象的一个实例:不会多也不会少。多数时候,它不能在方法外被使用。正是这样一种简单的使用方法,避免了混淆。
一个函数一次性定义的代码块可以多次调用。在JavaScript中,一个函数有很多元素组成,同时也受很多元素影响:函数体的代码、函数的参数列表、 接受外部变量域的变量、返回值、当函数被调用时,this
指上下文、 命名和匿名函数、 函数对象作为变量声明和 arguments
对象(在ES6中的箭头函数中将丢弃这个)等。这些元素都会影响到函数,但具体影响函数的行为还是取决于函数的声明类型。
理解一段代码最大的阻碍是大量的变量。而变量可以引入状态,这又将成倍的增加复杂性。每一个变量都使得理解代码更加困难。一个布尔值可以有两个状态,两个布尔值有四个。如果你的方法里有十个布尔值的话,它们可以产生1024种不同的状态。这远远超出人们的理解范畴。正确划分代码的作用域以及利用常量取代变量可以大大增加代码的可读性。从长远来看,几乎在所有情况下这都是最重要的。
在《JavaScript变量:变量声明》一文中了解了,在JavaScript中可以通过关键词var
、let
和const
来声明一个变量。并且提到过,使用let
和const
声明的变量不存在变量提升;而使用var
声明的变量存在变量提升。那么什么是变量提升,这篇文章主要来介绍的就是这方面的知识。
JavaScript的每个变量都会有有一个变量值,变量值都有对应的数据类型。在JavaScript中变量有两种不同的数据类型:基本类型和引用类型。在不同的地方对这两种数据类型的称呼也略有不同。比如,基本类型又称之为原始类型(拥有方法的类型或者可变类型),引用类型又称之为对象类型(不能拥有方法的类型或者不可变类型)。不管怎么称呼,都是依据数据类型的特点来命名的。
这篇文章主要介绍了在JavaScript中通过push()
、concat()
和reduce()
等方法的组合,实现数组合并的功能。并且在此基础上结合《JavaScript学习笔记:数组去重》一文介绍的方法,还可以轻松的实现合并后的数组,把重复的数组项删除。
昨天做一个页面有一个需求,需要把服务器取过来的数字(也有可能是数字字符串),将小数点前的数字每隔三位添加一个逗号(前面数是一个四位数的值)。比如取到的值是123456
,要将其转换成123,456
。搜索了一下,这叫数字分位符号。