资讯专栏INFORMATION COLUMN

JavaScript中的一元运算符

fnngj / 1360人阅读

摘要:中有种常用的一元运算符,本文做简单罗列和说明。第二个过程是相同的,返回。进行,依然是以为转换标准。在金丝雀版本的浏览器和中,结果符合预期。这是为什么呢原因是在中会将以开始,结束的语句外面包裹一层,就变成了,结果就符合预期。

JavaScript中有9种常用的一元运算符,本文做简单罗列和说明。

加运算符 +

将操作数转换为数字
function与object大部分情况都会被转换为NaN
除非对象拥有一个名为valueOf函数值且其函数有返回值

+{
  valueOf: function(){
    return "0xFF"
  }
}
//returns 255
减运算符 -

也是将操作数转数字,同时变为负数

逻辑取反运算符 !

在取反前,会进行隐式类型转换

递增 ++ 和递减 --

将操作数递增或递减,注意位置放到前面和后面会有区别,如同C语言中一样

按位非运算符 ~

对任一数值x进行按位非运算操作的结果为-(x+1)

typeof

操作数放到typeof的后面,会返回当前操作数的类型,对于数值类型可以准确返回,对于引用类型,Function会返回"function",其他都只会返回"object"

delete

删除数组或对象中特定索引的值
删除成功时会返回true,删除失败时返回false

// 删除变量
var hi = 1;
delete hi;          // returns false
console.log(hi);    // returns 1

// 删除函数
function yo(){ };
delete yo;           // returns false
console.log(yo);     // returns function foo(){ }

// 删除对象
var pub = {bar: "1"}
delete pub           // returns false
console.log(pub);    // returns {bar: "1"}

//删除数组
var code = [1,1,2,3,5]
delete code          // returns false
console.log(code);   //  [1,1,2,3,5]

对于数组的索引删除:

// 删除数组中的某个值
var lol=[20,30,40];
console.log(lol.length);     // returns 3
delete lol[2]                // returns true
console.log(lol);            // returns [ 20, 30,  ]
console.log(lol[2]);         // returns undefined
console.log(lol.length);     // returns 3
void

丢弃表达式的返回值,而返回undefined
使用方式有void 表达式,void (表达式) 两种

附:加法的隐式装箱

在加法的过程中,首先把等号左右两边进行了求原值ToPrimitive()操作,然后如果两个原值只要有一个是String类型,就把两个原值都进行转化字符串ToString()操作,进行字符串拼接;否则把两个原值都进行转化数字ToNumber()操作,进行数字相加。
ToPrimitive(input [, PreferredType])
将input转换为原始值,PreferredType为可选参数,只接受Number或String,用来设置转换偏好
一般情况下,对Date求原值,则PreferredType是String,其他Object对象均为Number

PreferredType转换策略

PreferredType是String,则先调用toString(),结果不是原始值,则再调用valueOf(),还不是原始值的话则抛出错误

PreferredType是Number,则先调用valueOf(),再调用toString()

练习
[] + [] // ""

进行ToPrimitive,两个都是Array对象,不是Date对象,所以以Number为转换标准,所以先调用valueOf(),结果还是[ ],不是原始值,所以继续调用toString(),结果是“”原始值,将“”回。第二个[ ]过程是相同的,返回“”。加号两边结果都是String类型,所以进行字符串拼接,结果是“”。

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

进行ToPrimitive,依然是以Number为转换标准。
[ ]的结果是“”。
{ }先调用valueOf(),结果是{ },不是原始值,所以继续调用toString(),结果是“[object Object]”,是原始值,将“[object Object]”返回。
加号两边结果都是String类型,所以进行字符串拼接,结果是“[object Object]”。

{} + [] // 0

这道题按照上一题的步骤,讲道理的话,结果应该还是“[object Object]”,但结果却如人意料——显示的答案是0!
这是什么原因呢?原来{ } + [ ]被解析成了{ };+[ ],前面是一个空代码块被略过,剩下+[ ]就成了一元运算。[ ]的原值是””, 将””转化成Number结果是0。

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

在金丝雀版本的chrome浏览器和node中,结果符合预期。
结果是”object Object”。
在普通版本的chrome浏览器中结果是NaN。
这是为什么呢?原因是在node中会将以“{”开始,“}”结束的语句外面包裹一层( ),就变成了({ } + { }),结果就符合预期。而普通版本的chrome依然会解析成{};+{},结果就变成了NaN

参考

developer.mozilla Bitwise operators
JavaScript Unary Operators: Simple and Useful
js隐式装箱-ToPrimitive

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94369.html

相关文章

  • JavaScript 一元正号算符

    摘要:一元正号介绍一元正号运算符位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。一元正号施加于,结果还是。 本文适合JavaScript初学者。 一元正号介绍 一元正号运算符(+)位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。 尽管一元负号也能转换非数值类型,但是一元正号是转换其他对象到数值的最快方法,也是最推...

    chanjarster 评论0 收藏0
  • 从 ++[[]][+[]]+[+[]]==10? 深入浅出弱类型 JS 的隐式转换

    摘要:与此相对,强类型语言的类型之间不一定有隐式转换。三为什么是弱类型弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等。在中,加性运算符有大量的特殊行为。 从++[[]][+[]]+[+[]]==10?深入浅出弱类型JS的隐式转换 本文纯属原创? 如有雷同? 纯属抄袭? 不甚荣幸! 欢迎转载! 原文收录在【我的GitHub博客】,觉得本文写的不算烂的...

    miya 评论0 收藏0
  • javascript —— 算符

    摘要:算术运算符中的算术操作主要通过算术运算符来实现,算术运算符包括一元算术运算符和二元算术运算符两种。一元算术运算符一元算术运算符用于一个单独的操作数,并产生一个新值。 算术运算符 javascript中的算术操作主要通过算术运算符来实现,算术运算符包括一元算术运算符和二元算术运算符两种。 一元算术运算符 一元算术运算符用于一个单独的操作数,并产生一个新值。在javascript中,一元运...

    Ethan815 评论0 收藏0
  • JavaScript字符串转数字的5种方法及其陷阱

    摘要:例如注意字符串中的负十六进制数字是一个特殊情况,如果你用解析,结果是不正确的。转换十六进制数时要小心,如果你不知道要转换对象的类型,不要使用。字符串转换为数字的方式总结负十六进制数字符串转换为数字时。 摘要 :JavaScript 是一个神奇的语言,字符串转数字有 5 种方法,各有各的坑法! 原文: Converting Strings to Number in Javascript...

    shengguo 评论0 收藏0
  • 爬虫不得不学之 JavaScript 入门篇

    摘要:为数值固定的表示法,用来表示整数和浮点数的。无论你写何种进制,它的存储还是以二进制来存储的,所以这样就弄成了浮点数的存储精确度,浮点数只能精确到位小数。关系运算符关系运算符有和。赋值运算符赋值运算符有六个。 现在的爬虫越来越难了,不再和之前的那样,随便抓个包就可以找到相关的 url ,然后 post 一下或者 get 一下数据就出来了。还有一个可能就是可能你以前用来学习的爬虫网站太简单...

    tracymac7 评论0 收藏0

发表评论

0条评论

fnngj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<