者:Daniel 译者:半糖学前端 来源:js-craft
原文:http://www.js-craft.io/blog/the-double-negation-in-javascript/
JS 是一种灵活且轻量级的语言,这种特性让我们经常觉得它是一门最简单的语言,也是最难掌握的语言。虽然经常使用,但我仍然偶然发现一些我不知道的隐藏语法或技巧。
在处理错误时,我偶然发现了以下代码。
return !!(this.isFirstOverall() || this.get('videoId')
我非常确定这是一个错误,这就是该错误的根源。否定否定没有任何意义。
但是经过一番谷歌搜索后,我发现Javascript中存在诸如消极负数之类的问题。
简而言之,其目的是将任何表达式转换为实际的true/false布尔值,就像具有Boolean( insert_value_here.)。
例如下面的表达式:
const isIE8 = navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8);
这将记录一个Array或null。是的,我们可以将其评估null为错误。实际上,更确切地说,null是一个错误的值。
但是,如果我们对此双重否定:
const isIE8 = !!navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8);
实际的true/false布尔值将被输出。
双重否定!!是不实际的操作,如&&或||。它只是两个否定!符号的序列。
第一个否定将数据(无论数据类型如何)转换为布尔值,但值相反。第二个否定再次更改布尔值以提供实际结果。
// example - the long version
const x = {}; // truthy
const y = !x; // false
const z = !y; // true
// or by using the double negation
const x = {}; // truthy
const z = !!x; // true
好吧,这取决于您要弄清楚什么。当然,对于不知道这种双重否定把戏的人(例如我)来说,实际的代码看起来会很奇怪。
另一方面,它将为实际评估提供更清晰的价值。结果将是对还是错。例如,您不必再怀疑一个空对象是true还是false。
const result = {};
if(result) {
// make something
}
如果本篇文章有任何错误和建议,欢迎留言,最后,谢谢大家的观看。
我是@半糖学前端 ,一个前端从业者,专注前端技术领域分享,关注我和我一起学习,共同进步!
喽,大家好啊,这里是雷工笔记,我是雷工。
数据类型比较常见,无论是对程序员,还是电气工程师来说,都再熟悉不过了,这里跟着教程了解一下,主要看跟自己以往在其他PLC,C#,组态软件中应用的有啥不同。
在计算机的世界就像黑客帝国中的超级计算机,其中的人、物其实都是虚拟的数据。
数据类型:用来在计算机中标记程序的运算规则的。
计算机程序可以处理海量的数据,为啥要给数据分类?
1、为了更加充分和高效的应用计算机内存。
2、为了更加方便程序猿合理的使用数据。
JavaScript中的数据类型整体分为两大类:
1、基本数据类型;
2、引用数据类型(复杂类型);
数字型即我们小学中学到的数字,可以是整数、小数、正数、负数。
数字类型:只要变量的值是纯数字,且没有引号,那么当前变量就是数字类型。
相比其他组态软件中分16位整型,双整型,有符号,无符号,浮点数等类型要简单些。
示例:
let age =20 //整数
let pi = 3.14 //小数
在JavaScript语言中正数、负数、小数等统称为数字类型Number。
注意事项:
1、JavaScript语言属于弱数据类型,变量到底属于什么类型,需要等赋值后,才能确定。
2、Java语言属于强数据类型,例如:int b=4;定义时就确认了,必须是整数。
1、数字类型在程序中可以有许多操作,例如,加+,减-,乘*、除/,等待,经常涉及运算。
运算涉及到算术运算符,也称作数学运算符,主要包括加、减、乘、除、取余等。
2、说到计算就涉及计算的优先级,在JavaScript中的优先级和小学数学中的算术优先级一样,都是先乘除,后加减,想改变加括号。
3、NaN代表一个计算错误。它是一个不正确的或者一个未定义的数学操作所得到的结果。
示例:
console.log('老师'-2) //NaN
NaN是粘性的。任何对NaN的操作都会返回NaN。
示例:
console.log(NaN +2) //NaN
1、通过单引号(‘’)、双引号(“”)包裹的数据都叫字符串,单引号和双引号没有本质上的区别,推荐使用单引号。
示例:
let myName = '雷工笔记' //使用单引号
let name = “雷工” // 使用双引号
let tel = '18712345678' // 看上去是数字,但是是引号包裹了,就是字符串。
let str = ‘ ’ // 这种是空字符串
2、注意事项:
2.1、无论单引号或是双引号必须成对应用;
2.2、单引号/双引号可以互相嵌套,但是不可以自己嵌套自己;
2.3、必要时可以使用转义符\,输出单引号或者双引号。
3、拼接字符串
使用场景:+运算符,可以实现字符串的拼接。
使用口诀:数字相加,字符相连;
示例:
document.write(‘我是’+‘雷工笔记’) //我是雷工笔记
let myName = ‘高启强’
let work = ‘卖鱼’
document.write( myName + work) //高启强卖鱼
注意:
只要变量中有一个数据类型是字符串类型,那么在计算的时候遇到加号,则直接拼接字符串;
如果遇到除加号以外的符号,那么计算机先将字符串转换为对应的数字,然后再计算,
4、模板字符串
4.1、应用场景
拼接字符串和变量
在没有它之前,要拼接变量比较麻烦
示例:
document.write(‘哈喽,大家好,我是’+name+‘!今年‘+age+岁’)
4.2、模板字符串语法
● ``(反引号)
●在模板字符串中通过${变量}获取变量的值。
● 反引号在英文输入模式下,键盘键Tab上面那个按键(1左边那个按键)
● 内容拼接时,用${}包裹住变量。
示例:
document.write(`哈喽,大家好,我是${name}!今年${name}岁`)
好像C#中也有类似的应用方法。
表示开关量,是或否时在计算机中对应的是布尔类型。
他有两个固定的值,True与False,表示真时用true,表示假时用False。
true:代表正确的,条件成立的;
False:代表错误的,条件不成立的;
示例:
//雷工笔记有趣嘛?
let isFun = true
console.log(isFun)
7.1、未定义是比较特殊的类型,只有一个值undefined。
7.2、什么情况下出现?
只声明变量,不赋值的情况下,变量的默认值为undefined,一般很少【直接】为某个变量赋值为undefined。
undefined值本身表示的含义未定义;
示例:
let name // 声明变量但是未赋值
document.write(name) //输出undefined
7.3、实例场景:
我们开发中经常声明一个变量,等待传送过来的数值。
如果我们不确定这个数据是否有传递过来,此时我们可以通过检测这个变量是不是undefined,来确定是否有数据传递过来。
8.1、如果变量的值是null,那么变量的数据类型叫空类型,——对象类型。
JS中的null仅仅是一个表示“无”、“空”或“值未知”的特殊值。
示例:
let name=null
console.log(name) //null
8.2、null和undefined的区别:
● undefined表示木有赋值
● null 表示赋值了,但是内容为空
8.3、null实例场景:
官方说明:把null作为尚未创建的对象。
将来有个变量里面存放的是一个对象,但是对象还没创建好,可以先给个null
以上为学习JavaScript基础知识数据类型的相关笔记。
在前端开发中经常会遇到这样一种需求,使用Javascript格式化数字进行输出。最常见的是金额,比如人民币最小表示单位为分,一般需要精确到小数点后两位数字,而且整数位每隔三位数字需要用逗号隔开。
今天我们就一起来看看如何使用原生Javascript和开源类库来实现这样一种功能吧。
感兴趣的可以自行去github上去看源码,github地址为:
https://github.com/zhouxiongking/article-pages/blob/master/articles/formatNumber/formatNumber.js
Javascript
首先我们看看最简单的实现方法,需要达到这样的目的。
输入一串数字或者字符串,最后返回格式化后的字符串,每隔3位用逗号分隔,通过四舍五入保留小数点后2两位。
我们来分析下方法的实现过程。
替换掉原本传入数据中可能出现的'$'和',',然后判断是否为数字。
判断传入的数字是正数还是负数。
判断小数位数的舍入性。
每隔三位,添加一个逗号。
重新拼接字符串,正负号+整数位+小数点+小数位
根据上述的分析过程,得到的代码如下。
方法1
第二种实现方法可以选择保留小数位数,它的做法如下。
将传入的数字或者字符串转化为float类型数据,并进行四舍五入
用小数点进行分割,并将整数位逆序
对于整数位,每隔三位添加一个逗号
再次进行逆序,得到正确的整数位后拼接小数位。
通过上述的分析,得到代码如下。
方法2
方法3中,是一个最全面的实现,可以选择向上,向下或者四舍五入来保留小数位数;同时可以选择小数点符号和千分位符号。
为了让方法的代码看起来更清晰,将方法拆分成两个function,每个function实现自己的功能。
第一个function作为入口函数,主要包含小数位的处理,千分位符号位的处理,以及最后返回结果的处理。
主function
第二个function的主要功能是根据传入的参数对数字进行取整或者四舍五入。
第二个function
针对以上的方法,我们可以通过代码测试。
测试结果
在这里也推荐两款非常好用的用于格式化数字的开源库Numeral.js和accounting.js,两者都可以格式化货币,百分比,时间,几个小数位数,千分位等等
Numeral.js的github地址为:
https://github.com/adamwdraper/Numeral-js
目前在Github上超过5K的star,而且呈现增长的趋势。
accounting.js的github地址为:
https://github.com/openexchangerates/accounting.js
目前在github上有超过3K的star,可以说是非常受欢迎。
这里简要介绍下Numeral.js的用法。
使用
在浏览器中使用,可以通过以下代码去实现。
使用
格式化
通过给numeral传递数字,然后通过format方法进行数字的格式化。
格式化数字
数字格式化的规则如下。
数字格式化规则
其他的类似于货币,字节,百分数,时间,科学计数等的格式化规则大家可以去官网看看。
今天这篇文章主要讲解了如何格式化数字成指定的格式,包括原生JS实现以及后面推荐的几个开源类库,希望能对大家有帮助。
*请认真填写需求信息,我们会在24小时内与您取得联系。