JavaScript通常被认为是一门容易上手但不太容易掌握的语言。是的,这是因为JavaScript是一种非常古老且非常灵活的语言。它充满了神秘的语法和过时的功能。到目前为止,我已经使用JavaScript多年,时不时地发现一些我不知道的隐藏语法或技巧。我试图列出一些鲜为人知的JavaScript特性。尽管其中一些函数在严格模式下无效,但它们仍然是完全有效的JavaScript代码。但是请注意,我不建议您开始使用所有这些功能。虽然它们非常酷,但如果您开始使用它们,您的队友很可能会非常生气。所有使用的源代码都可以在这里找到。快乐编码!注意:本文不涉及提升、闭包、代理、原型继承、异步等待、生成器等内容。虽然这些功能可能不为大多数人所知,但它们仍然是众所周知的。void运算符JavaScript有一个一元void运算符。您可能已经看到它用作void(0)或void0。它的一生只有一个目标-在表达式的正确位置返回**undefined**。使用“0”只是一种约定。您不一定必须使用“0”,它可以是任何有效的表达式void并且仍然返回**undefined。**为什么要创建一个特殊的关键字来返回undefined而不是只返回undefined?听起来有点多余吧?有趣的事实事实证明,在ES5之前,您实际上可以使用为原始未定义分配一个新值,例如undefined="abc"。定义未定义?!所以在这一点上,使用void是确保您始终返回原始undefined的一种方法。构造函数后面的括号是可选的,我们在调用构造函数的时候在类名后面加的括号是完全可选的!😮(前提是你不需要向构造函数传递任何参数)以下两种代码风格都被认为是有效的JS语法,结果是一样的!IIFE函数的括号可以省略IIFE(立即调用的函数表达式)的语法对我来说总是有点奇怪。我到底应该用这些括号做什么?事实证明,那些额外的括号只是为了告诉JavaScript解析器即将发出的代码是函数表达式,而不是函数。正如您可以想象的那样,知道这一点后,有一些方法可以跳过那些额外的括号并仍然生成有效的IIFE。void运算符告诉解析器该代码是一个函数表达式。因此,我们可以跳过函数定义的括号。你猜怎么了?我们可以使用任何一元运算符(void、+、!、-等)它会影响IIFE返回的任何结果吗?好吧,这会影响结果。然而,好消息是如果你关心结果并说你想把它存储在某个变量中,你一开始就不需要额外的括号。确切地!我们添加这些括号只是为了便于阅读。有关IIFE签出的更多信息,请查看ChandraGundamaraju撰写的这篇关于with语句的精彩文章你知道JavaScript有一个with语句块吗?它实际上是JS中的关键字。写一个with块的语法如下:with(object)statement//formmultiplestatementsaddablockwith(object){statementstatement...}with添加传入对象的所有属性到当前作用域链:anecdotewith听起来很酷,对吧??它甚至比对象解构更好。好吧,不是这样。通常不推荐使用with语句,因为它已被弃用。这在严格模式下是完全禁止的。事实证明,使用块会增加语言的性能和安全问题!译者注:不推荐使用with,因为with语句是把对象的成员加入到当前作用域中,这样就无法说block里面的变量到底指的是什么。由于这些类型的函数难以调试和阅读,很多人认为这是一种不好的做法,您可以参考以下信息了解更多信息:https://eslint.org/docs/rules...https://eslint。org/docs/rules...Functionconstructor函数声明不是定义新函数的唯一方式;您可以使用Function()构造函数和new运算符动态定义函数。最后一个构造函数参数是函数的字符串化代码,它之前的其他参数是函数参数。有趣的事实Function构造函数是JavaScript中所有构造函数之母。甚至Object的构造函数也是Function构造函数。Function自身的构造函数也是Function本身。所以调用object.constructor.constructor...足够多次最终将在JavaScript中的任何对象上返回Function构造函数。函数属性众所周知,函数是JavaScript中的“一等公民”。所以没有人阻止我们向函数添加自定义属性。这在JS中是正确的做法。然而,它很少被使用。那么我们什么时候要这样做呢?嗯,有一些很好的用例。示例:可配置函数假设我们有一个名为greet的函数。我们希望我们的函数根据语言环境打印不同的问候消息。该语言环境也应该是可配置的。我们可以在某处维护一个全局区域设置变量,或者我们可以使用函数属性实现一个函数,如下所示:Functionwithstaticvariable另一个类似的例子。假设您想要实现一个数字生成器——一个生成有序数字序列的数字生成器。通常,您会使用带有静态计数器变量的类或IIFE来跟踪先前的值。这样,我们可以限制对计数器的访问,也可以避免额外变量污染全局空间。但是如果我们想要在不污染全局空间的情况下灵活地读取甚至修改计数器怎么办?是的,我们仍然可以创建一个带有计数器变量的类和一些其他方法来读取计数器;或者我们可以偷懒,只在函数上使用属性。这是一个很长的列表,我们只完成了一半。如果你想休息一下,现在是个好时机。如果您要继续阅读,那么,我向您致敬!让我们继续前进!参数属性我相信你们中的大多数人都知道函数中的参数对象。它是一个数组,就像一个对象,可以在所有函数中使用。它有一个参数列表在调用时传递给函数。但它还有一些其他有趣的特性,arguments.callee:指的是当前调用的函数arguments.callee.caller:指的是调用过当前函数的函数注意:虽然ES5在严格模式下禁止使用callee和caller,在许多编译库中仍然很常见。因此,值得学习。标记模板字符串除非您生活在黑暗中,否则您一定听说过模板字符串。模板字符串是ES6提供的众多优秀特性之一。但是,您知道标记模板字符串吗?带标签的模板字符串通过向模板字符串添加自定义标签,使您可以更好地控制将模板字符串解析为字符串的过程。Tag只是一个解析器函数,它接受字符串模板解释的所有字符串和值的数组,并返回最终的字符串。在下面的示例中,我们的自定义标记高亮解释了模板字符串的值,并且还使用结果字符串中的元素将解释的值包装起来以进行高亮显示。在许多利用此功能的库中可以找到一些有趣的用例。这里有一些很酷的例子,用于翻译的Reactstyled-componentses2015-i18n-tag和用于彩色logGetters&SettersJavaScript对象的国际化粉笔在大多数情况下都很简单。假设我们有一个用户对象并尝试使用user.age访问它的年龄属性,如果定义了年龄属性,我们将获得年龄属性的值;否则,我们将得到未定义的属性。简单的。然而,它不必那么简单。JavaScript对象具有Getters和Setters的概念。不是直接返回对象的值,而是可以编写一个自定义的Getter函数来返回任何你想要的。设置值也是如此。这为我们在获取或设置字段时提供了强大的功能,如虚拟字段、字段验证、副作用等。Getters和Setters在ES5中并不是新的。他们总是在那里。ES5只是为现有功能添加了方便的语法。要了解有关Getters和Setters的更多信息,请参阅这篇不错的文章)Colors是一个流行的node.js库,它是利用Getters的一个很好的例子。这个库扩展了String类并在其上添加了一堆Getter方法。这使我们能够通过简单地访问其属性将任何字符串转换为其彩色版本以便于打印。逗号运算符JavaScript有一个逗号运算符。它允许我们在一行中编写多个逗号分隔的表达式并返回最后一个表达式的结果//syntaxletresult=expression1,expression2,...expressionN在上面的代码中,所有的表达式都会被求值,并将返回的值赋值给expressionN到结果变量。你可能在for循环中使用过逗号运算符:for(vara=0,b=10;a<=10;a++,b--)有时它可以用来帮助我们在同一行写多个语句:functiongetNextValue(){returncounter++,console.log(counter),counter}或者写一个简短的lamda函数:constgetSquare=x=>(console.log(x),x*x)plusoperator你有没有遇到过需要快速转换a的场景字符串到数字?只需在字符串前加上+运算符。加号运算符也适用于负数、八进制、十六进制和指数值。而且,它甚至可以将Date或Moment.js对象转换为时间戳!!!BangBang运算符那么,从技术上讲,它不是一个独立的JavaScript运算符。它只是使用了两次JavaScript否定运算符。但是BangBang(!!)听起来很酷!BangBang或DoubleBang是将所有表达式转换为布尔值的巧妙技巧。如果表达式为真值,则返回真;否则返回假。~按位运算符让我们面对现实吧——没有人关心按位运算符。我们什么时候用啊!好吧,按位非(~)运算符每天都有用例。事实证明,按位NOT运算符仅在与数字一起使用时才有效。例如:~N=>-(N+1)。仅当N==-1时,此表达式的计算结果为“0”。我们可以通过将~放在indexOf(...)函数前面来检查一个项目是否存在于字符串或数组中:注意:ES6和ES7分别为String和Array添加了一个新的.includes()方法。毫无疑问,这是一种比~运算符更简洁的检查数组或字符串中是否存在项目的方法。标签语句JavaScript有标签语句的概念。它允许我们在JavaScript中命名循环和块。然后我们可以在使用break或continue时使用这些标签来引用代码。带标签的语句在嵌套循环中特别方便。但我们也可以使用它们来简单地将代码组织成块或创建可退出的块。
