博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
6748
积分:0
P豆:617

运算符中的一些小技巧

2021年10月21日 18:57:00阅读数:11博客 / Sky

记下一些关于运算符的小技巧或容易出错的地方

%运算符

取余运算符运算结果的正负号由第一个运算子的正负号决定,比如:

1 -1 % 2 // -1
2 1 % -2 // 1

所以有时候对负数取余会出现错误,使用绝对值函数可以避免错误:

// 会出错
function isOdd(n) {
return n % 2 === 1;
}
isOdd(-5) // false
isOdd(-4) // false

// 正确了
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false
+运算符

+运算符与其他运算符不太一样,我们知道它可以用来连接字符串操作,是因为用+运算符的时候它通常会将其他类型的值转为字符串,但是除了它比如说-运算符等都会将其他类型的值转换为数值,像这样:

var now = new Date();
typeof (now + 1) // "string"
typeof (now - 1) // "number"

当运算子中出现对象的时候:

1 + [1,2]
// "11,2"
1 + {a:1}
// "1[object Object]"

则先调用该对象的valueOf方法。如果返回结果为原始类型的值,则转换为字符串;否则继续调用该对象的toString方法,然后转换为字符串。
但是:

{a:1} + 1
// 1
({a:1})+1
"[object Object]1"

这是为什么呢?此时{a:1}被当做了代码块处理,而这个代码块没有返回值,所以整个表达式就返回1了。但是放在了圆括号中的{a:1},因为js预期()中是一个值,所以它就又被当做对象处理了。

特殊表达式:

1.空数组+空数组

先调用valueOf()返回空数组本身,再调用toString(),返回空字符串。

[] + []
// ""

2.空数组+空对象

[]得到'',{}得到"[object Object]"

[] + {}
// "[object Object]"

3.空对象+空数组

{}被视作代码块省略,+[]就是将[]转换为数值的意思了得到0.

{} + []
// 0

4.空对象+空对象

同样{}被当做代码块省略了,+{}转数值得到NaN

{} + {}
// NaN

如果第一个空对象不被当做空代码块的话:

({}) + {}
// "[object Object][object Object]"

({} + {})
// "[object Object][object Object]"

console.log({} + {})
// "[object Object][object Object]"

var a = {} + {};
a
// "[object Object][object Object]"

此外,当+运算符作为数值运算符放在其他值前面的时候,可以用于将任何值转为数值,就像Number函数那样:

+true // 1
+[] // 0
+{} // NaN
!取反运算符

!取反运算符连续对同一个值进行取反运算等于将其转换为对应的布尔值,卖二手手机就像Boolean函数那样:

!!x

// 等同于

Boolean(x)

此外,如果我们想排除null这个对象,可以这样写:

if(!!x){
//do something!
}

这是因为:!!null 值是 false,其他的 object !!obj 值都是 true。

~否运算符

~运算符是根据值的二进制二进制形式进行运算的。

~ 3 // -4

它的运算原理就是根据数值的32位二进制整数形式运算,补码存储的原理如果是负数,需要将取反后的值减一再取反然后加上负号。
比较麻烦,但是我们可以记成一个值与它取反后的值相加等于-1.

~~2.9
// 2

两次否运算能够对小数取整,并且这是取整方法中最快的一种。

^异或运算符

两次异或运算交换两个数的值:

var a = 10;
var b = 99;

a^=b, b^=a, a^=b;

a // 99
b // 10
<< 左移运算符

左移0位可用于取整:

13.5 << 0
// 13

-13.5 << 0
// -13

左移运算可以将颜色的RGB值转为HEX值:

var color = {r: 186, g: 218, b: 85};

// RGB to HEX
var rgb2hex = function(r, g, b) {
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).substr(1);
}

rgb2hex(color.r,color.g,color.b)
// "#bada55"
右移运算

右移运算可以模拟2的整除运算:

5 >> 1
// 相当于 5 / 2 = 2

21 >> 2
// 相当于 21 / 4 = 5

21 >> 3
// 相当于 21 / 8 = 2

21 >> 4
// 相当于 21 / 16 = 1

此外,void运算符的作用是用来执行一个表达式,然后返回undefined,而且它的运算符优先级也比较高void 4+7 实际上等同于 (void 4) +7。一般运算符是左结合的,但是=和三目运算符?:却是右结合的:

w = x = y = z;
q = a?b:c?d:e?f:g;

//相当于:

w = (x = (y = z));
q = a?b:(c?d:(e?f:g));

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 在这篇文章将给大家分享12个有关于JavaScript,这可能在你实际工作或许能帮助你解决问题,起收纳学习吧。
    如果你从 Ruby 或者 Python 转型到 Go,将会有很多语言差异需要学习,其很多问题都是围绕处理 string 类型,下面是,这解决了我在使用 Golang 最初几周遇到问题
    扩展,也就是我们常用三个,让数组展开变成每个块。 然后使用括号语法[],重新组装这块构造个新数组。在这篇文章,我们会进行个有趣测试,看看我们如何提高扩展性能。
    在C语言,大于等于号是“>=”。
    python与其他语言样支持大多数、关系、逻辑以及位,并且有和大多数语言优先级。除此之外,还有是python独有
    对于php7空合并使用做说明
    php可能是有多个连接在,我们给其执行决定先后顺序,下面由编给大家介绍php优先级,希望对需要朋友有所帮助!
    本文主要介绍JS用到,可以在日常Coding提升幸福度,将不定期更新~ 感兴趣同学可以加文末微信群,起讨论吧~
    这篇文章主要是想和大家起学习下,工作之有哪让我们眼前JavaScript代码简洁。有需要朋友可以看看,起学习讨论。
    mysql语句查询:1、比较能用 “=”就不用“<>”;2、明知只有条查询结果,那请使用 “LIMIT 1”;3、为列选择合适数据类型;4、尽量避免使用 “SELECT *”;
    之前文章《手把手教你如何使用ps制作真实水波纹效果(分享)》,给大家介绍了使用ps自主制作逼真水波纹效果。下面本篇文章给大家分享ps如何给照片添加太阳光效果,我们起看看怎么做。
    用来表示内存储器容量大基本单位是:字节(Byte)。字节是二进制数据单位,是计机信息术用于计量存储容量种计量单位,也表示机编程语言数据类型和语言字
    AR术也被称为虚拟现实术。AR术是种将虚拟信息与真实世界妙融合术,广泛用于多媒体、智能交互、传感等多种术手段,将计机生成文字、图像等虚拟信息模拟仿真后应用到真实世界
    云计是对并行计、网格计、分布式计发展与用,是分布式计种,指是通过网络“云”将巨大数据计处理程序分解成无数个程序,然后通过多部服务器组成系统进行处理和分析这程序得到结果并返回给用户
    之前文章《你必须了解10个ps常用快捷键(分享)》,给大家介绍了这快捷键,轻松学PS从新手到高手,非常实用。

    2021-09-26

    760

    byte占1个字节,相当于个字;而字节是计机信息术用于计量存储容量种计量单位,也表示机编程语言数据类型和语言字
    在计1kb等于1024个字节。字节是计机信息术用于计量存储容量种计量单位,也表示机编程语言数据类型和语言字个字节存储8位无号数。
    文件夹不可存放是字;字包括字母、数字、号、标点号和其他号,以及功能性号;字在计机内存放,应规定相应代表字二进制代码。
    上篇文章给大家介绍了《什么是PHP,我们对于PHP如何使用?》,本文继续给大家介绍php8条件判断有哪?php8三元是什么意思?
    在JS,可以利用Math对象min()方法和扩展“...”来求数组值;min()方法可返回指定数字列表带有最数字,扩展可把个数组转化为用逗号分隔参数序列,实现语法“Math.min