JavaScript中的一元运算符

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

加运算符 +

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

+{
  valueOf: function(){
    return '0xFF'
  }
}
//returns 255

减运算符 -

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

逻辑取反运算符 !

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

递增 ++ 和递减 --

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

按位非运算符 ~

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

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 (表达式) 两种code

附:加法的隐式装箱

在加法的过程当中,首先把等号左右两边进行了求原值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

相关文章
相关标签/搜索