整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript中的函数前缀:~和!的误区与真相

JavaScript中的函数前缀:~和!的误区与真相

JavaScript编程中,我们经常使用各种运算符来处理数据和控制程序流程。然而,对于函数定义和调用前的 ~(按位取反)和 !(逻辑非)的使用,存在一些常见的误区。本文将介绍这两个运算符的正确用法,并澄清一些常见的误解。

一、逻辑非运算符!

! 是JavaScript中的一元逻辑非运算符,它用来反转布尔值。如果一个表达式的结果为 true,使用 ! 后将变为 false;反之,如果结果为 false 或任何假值(如 0、""、null、undefined、NaN),! 将使其变为 true。

示例

let isActive=true;
console.log(!isActive); // 输出:false

二、按位取反运算符~

~ 是按位取反运算符,它对数值的每个位执行取反操作,然后加1。在JavaScript中,所有的数字都是以32位浮点数的形式存储,因此 ~ 运算符会对32位的二进制数进行操作。

示例

let num=5;
console.log(~num); // 输出:-6

三、函数调用前的~和!

在函数调用前使用 ~ 和 ! 是不标准的。~ 需要一个数值类型的操作数,而函数调用本身并不返回一个数值,除非函数明确返回了一个数值类型。而 ! 虽然可以用于逻辑反转,但在函数调用前使用它并没有实际意义。

误区示例

function doSomething() {
  return true;
}
console.log(!doSomething()); // 正确用法,输出:false
console.log(~doSomething()); // 错误用法,doSomething() 不返回数值

四、立即执行函数表达式(IIFE)与!

在某些情况下,使用 ! 前置立即执行函数表达式(IIFE)可以避免函数声明提升带来的问题,尤其是在使用ES6模块或在严格模式下。这里有个JS的小技巧,如果上一句句末没有分号结尾,下一句function前面写~或者!可以正常执行哦,否则会报错。

示例

!function() {
  console.log("This will run immediately and won't cause hoisting issues.");
}();

console.log("the end no ;")

!(function(){ // 这种表达式的用法,上一句句末可以不用写;号
    console.log("hello")
})();

五、结论

  • ~ 和 ! 在JavaScript中的主要作用分别是按位取反和逻辑非。
  • 在函数调用前使用这两个运算符没有实际意义,应避免这种用法。
  • ! 和 ~可以用于立即执行函数表达式,以避免函数提升问题,但这不是一个常见的做法。

了解这些运算符的正确用法可以帮助你编写更清晰、更有效的JavaScript代码。记住,代码的可读性和一致性对于团队协作和代码维护至关重要。

开始学Python的你一定很疑惑,为什么Python里会出现各种各样的下划线 “_”,而且位置都不相同,有时候在名称后面,有时候在前面,有时候还会在数字中间......这些下划线都分别代表了什么意思?本文就给大家普及普及。

在本文中,我们将介绍 Python 中 _ 字符的不同用法。就像 Python 中的许多其他内容一样,我们会看到 “_” 的不同用法主要是惯例问题。这里我们将介绍的五种不同情况:

  1. 单下划线(例如 _
  2. 名称前加一个下划线(例如 _total
  3. 名称后加一个下划线(例如 total_
  4. 数字文字中的单个下划线(例如 100_000
  5. 名称前加上双下划线(例如 __total
  6. 名称前后加双下划线(例如 __init__

一.单下划线(_)

单下划线通常在3种情况下使用:

1.在解析程序中

_名称指向交互式解释器会话中,最后执行的语句结果。这首先是由标准CPython解释器完成的,其他解析器也紧随其后。

>>> _
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_' is not defined
>>> 42
>>> _
42
>>> 'alright!' if _ else ':('
'alright!'
>>> _
'alright!'

2.作为名称

这与上一点有些关联,_ 用作一次性的名称。这为了让阅读代码的人知道,这里分配了某个名称,但是不打算使用。例如,你可能对循环计数器的实际值不感兴趣:

n=42
for _ in range(n):
    do_something()

3.i18n

我们可以看到 _ 还可以用作函数。在这种情况下,它通常用于执行国际化和本地化字符串转换查找的函数的名称。这似乎源于并遵循 C 语言的相关规则。如在Django文档中所见:

from django.http import HttpResponse
from django.utils.translation import gettext as _

def my_view(request):
    output=_("Welcome to my site.")
    return HttpResponse(output)

第二个和第三个用法可能会发生冲突,因此,在任何还将 _ 用作 i18n 查找和翻译的代码块中,都应避免使用 _ 作为一次性使用的名称。

二.名称前加单下划线(例如_total

名称前的单个下划线用于指定程序员将名称视为“私有”。这可以视为一种约定,方便阅读代码的人知道以 _ 开头的名称供内部使用。 正如Python文档所述:

带有下划线的名称(例如 _spam)应被视为 API 的非公开部分(无论是函数、方法还是数据成员)。它应被视为实现细节,如有更改,恕不另行通知。

*之所以说是一种约定,是因为它实际上对解析程序而言有着某种意义;如果我们从 <module / package> import *,除非以模块/软件包的 __all__ 列表明确包含它们,否则不会导入以 _ 开头的名称。

三. 名称后的单下划线(例如 total_

名称后面的单个下划线用于避免名称遮盖另一个名称,当然是惯例。例如,如果你想命名某种格式,为了避免掩盖 Python 的内置格式,你可以将其命名为 format_

四. 数字字面中的单下划线(例如 100_000

PEP 515 指数建议扩展 Python 的语法,以便下划线可以用作整体、浮点和复杂数字文本中数字分组的可视分隔符,理由是:

这是其他现代语言的常见特征,可以帮助提高较长的文字或文本的可读性,其值应清楚地分隔成部分,如字节或十六进制表示法中的单词。

因此,我们可以执行以下操作::

# 十进制数按千分组
amount=10_000_000.0

# 按字对十六进制地址进行分组
addr=0xCAFE_F00D

# 用二进制文字将位分组为半字节
flags=0b_0011_1111_0100_1110

#相同,用于字符串转换
flags=int('0b_1111_0000', 2)

五. 姓名前的双下划线(例如__total

在名称(特别是方法名称)前使用双下划线(__)不是约定,只是对解析程序有特殊的意义。Python 管理这些名称,它用于避免名称与子类定义的名称冲突。正如Python文档所指出的那样,任何形式为__spam 的标识符(至少两个前导下划线,并且最多一个尾随下划线)在文本上均被 _classname__spam替换,其中 classname 是当前类名,其中前导下划线被去除。

以以下示例为例:

>>> class A(object):
...     def _internal_use(self):
...         pass
...     def __method_name(self):
...         pass
... 
>>> dir(A())
['_A__method_name', ..., '_internal_use']

如上所示,_internal_use 不变,但是 __method_name 被改成 _ClassName__method_name。 现在,如果你创建 A 的子类,比如说 B(坏、坏名字),那么你将无法轻易覆盖 A 的__method_name

>>> class B(A):
...     def __method_name(self):
...         pass
... 
>>> dir(B())
['_A__method_name', '_B__method_name', ..., '_internal_use']

这里的预期行为几乎等同于Java中的最终方法和C ++中的常规(非虚拟)方法。

六. 在名称之前和之后加上双下划线(例如__init__

这些是 Python 使用的特殊方法名称。对于我们来说,这只是一个约定,即 Python 系统使用与用户定义的名称不冲突的名称的一种方式。然后,我们通常会覆盖这些方法并为 Python 调用它们时定义所需的行为。例如,在编写类时__init__重写方法。

没有什么可以阻止我们编写自己的特殊方法名称(但是最好别这么做):

>>> class C(object):
...     def __mine__(self):
...         pass
...
>>> dir(C)
... [..., '__mine__', ...]

尽量不要使用这种命名方式,只需要让Python定义的特殊名称遵循该约定即可。


参考链接:

Django官方文档:https://docs.djangoproject.com/en/dev/topics/i18n/translation/

Python官方文档:https://docs.python.org/3/tutorial/classes.html#private-variables

PEP515:https://www.python.org/dev/peps/pep-0515/


--END--

以上为本文所有内容,希望能帮助各位Python爱好者答疑解惑!

希望本文的同学,记得点赞哈~也可以关注我们!

天继续为大家分享前端的知识,如果对前端比较感兴趣的小伙伴,可以关注我,我会更大家继续分享更多与前端相关的内容,当然如果内容中又不当的或者文字错误的,欢迎大家在评论区留言,我会及时修改纠正。

1.初识HTML

  • HTML指的是超文本标记语言(Hyper Text Markup Language),是用来描述网页的一种语言。
  • HTML不是一种编程语言,而是一种标记语言(markup language),标记语言是一套标记标签(markup tag)。
  • HTML标签描述网页元素,比如图片标签、文字标签、链接标签等。
  • HTML标签有自己的语法规范,并且所有的HTML标签都是用尖括号(<>)包起来。

2.HTML骨架结构

HTML基本骨架语法如下所示:

HTML基本骨架结构

HTML骨架标签说明:

HTML骨架标签说明

下面通过对HTML骨架的基本认识,你也可以小试牛刀,打开记事本,新建一个带有HTML骨架标签的.txt文件。

在.txt中写入HTML骨架标签,保存,并将.txt的后缀名修改为.html,右键单击你写好的文件,然后选择你要显示的浏览器,本人习惯用谷歌的浏览器,这个根据个人的习惯来选择就好了。

示例代码如下:

我的第一个HTML页面

注意:HTML标签名、标签的属性名以及大部分属性值都统一用小写,不要问我为什么,这是人家W3C的规范,咱们按规范行事就好啦。

正确示范:

书写规范

错误示范:

错误的规范

3.HTML标签的分类

HTML标签:在HTML页面中,带有“<>”尖括号符号的元素被称为HTML标签元素,如上面的<html>、<head>、<body>,它们都是用尖括号包起来,而且这几个标签还是HTML的骨架结构标签,就好比人之所以能站立,就是因为有骨架支撑。

通常我们将其分为常规元素和空元素,以下是对两种类型的介绍。

常规元素(双标签)

语法:<标签名>内容</标签名>,如<body>我的网页内容</body>。

说明:

  • 该语法中"<标签名>"表示该标签的作用开始,一般称为"开始标签(start tag)","</标签名>"表示该标签的作用结束,一般称为"结束标签(end tag)"。
  • 和开始标签相比,结束标签只是在前面加了一个封闭符"/"。
  • 提示:HTML多数都是双标签。

空元素(单标签或自封闭标签)

语法:<标签名 /> ,比如 <br />

说明:

  • 空元素用单标签来表示。简单说,就是里边不需要包含内容,属于自封闭标签。
  • 提示:此类标签较少,只需要用到的时候记住就行,在开发过程中自己不断的积累。

4.HTML标签的关系

标签之间的关系主要是针对双标签,双标签之间的关系分为如下几种。

嵌套关系:

嵌套关系

并列关系:

并列关系

提示:在开发的过程中,如果标签之间是嵌套关系,那么子元素可以通过tab键进行缩进,让其结构和格式更加的清晰。

5.前端开发工具

之前我们是通过记事本来写html骨架结构,会发现这种情况针对几行代码,还是能消化的,但是碰上几千甚至几万以及更多,此时应该怎么办呢?这个时候就得用到我们的前端开发工具,通过前端开发工具,可以更快更高效的提高我们的开发效率,那我们常见的前端开发工具有如下几种:

常见的前端开发工具

说明:

  • Dreamweaver:学校用得多。
  • Sublime:推荐使用,轻量级,效率高,打开速度快,优点多,但是使用插件的时候,需要下载哦。
  • WebStorm:这个我没用过,但是有的人很喜欢,属于付费的。
  • Hbuilder:推荐使用,轻量级,免费,效率高,打开速度快,现在都是使用HbuilderX版本,这个是可以去官网下载到的,重点它免费、免费、免费,重要的事情说三遍!!!。
  • VS Code:这个是微软的,也属于开源免费的,功能很强大的,尤其是在JavaScript开发方面,也是本人推荐使用的。

提示:Hbuilder和VS Code谁更好?我只能说各有千秋,根据个人的习惯,我个人就比较喜欢Hbuilder,偶尔会用VS Code,如果你习惯用VS Code,继续用就行了。

以上开发工具的安装使用,在网络上都会有很多资料,可以动动小手指就能查到哦。

今天就分享到这儿吧,如果喜欢的记得点关注哦,也欢迎在留言区留言。