http://zhouhua.github.io/2013/07/09/UnaryOperator/

更多

在偶然打开d3 的源代码的时候,我看到了这样一段代码。

1
2
3
if (!Date.now) Date.now = function() {
    return +new Date;
};

大体上可以看出这是在 Date 对象中加入一个 now 方法以获得当前时间。但是 return +new Date; 似乎是一种很不合常规的写法,这个+ 是干什么用的呢?其实这里并没有用到很高级的javascript技巧,相反,只是用到了一个极其简单的一元操作符,只不过这样的用法比较少见,用法与其他编程语言太不一样,所以让人们有一种陌生的感觉。

翻开ECMAScript的规范,如果不算NOT运算的 ~ 操作符,一共有8个一元操作符。让我们逐一了解下。

+操作符


我们从开篇的 +操作符 开始介绍。使用方法上,这个操作符与各位从初中数学中见过的“正号”类似,放在一个变量或表达式的前面。对数字类型的变量而言,+操作符 对结果没有影响,对于其他类型的变量则是转化成数字类型的变量,如果转化失败,则为特殊数字类型常量 NaN 。那么运算+a ——假设 a 为一个非数字类型的对象——究竟对a执行了怎样的操作呢?一种说法是默认调用valueOf方法,相当于 a.valueOf() ;不过经过我的具体实验,似乎另一种说法更可信,即 +a=Number(a)

-操作符


与 +操作符 类似,-操作符 就像是数学里的负号,所以我们可以知道 -a=0-(+a),以上两个符号为一组。

++操作符


这个段落里其实会包含两种操作符,分别是类似 a++和类似 ++a 。熟悉C语言或者Java的读者都很了解 ++ 的含义。的确,这两操作符是EmacScript直接借鉴java的自增操作符,表示将操作数加上1,即 a++ 等价于 ++a 等价于 a+1。然而数值上运算结果的等价不代表这两种操作符是相同的,其实它们之间还明差异的,相信了解C语言或Java的读者听说过它们之间“先赋值再运算”和“先运算再赋值”的差异。

那它们的差异具体是什么样的呢?还是以具体的实验结果来说明吧。

Javascript代码
1
2
var a=10;
console.log(a++ - 1);

图1:a++ 运算结果

Javascript代码
1
2
var a=10;
console.log(++a - 1);

图2:++a 运算结果

从以上实验结果我们知道,a++ - 1 先执行出 a - 1 的结果,再执行 a=a+1,所以相当于“先运算再赋值”;而 ++a - 1 则不同,它是先执行 a=a+1,再用新的a来参与运算 a - 1,因而这是“先赋值再运算”。

–操作符


同样,这里也是 a-- 和 --a 两个操作符,具体含义与 ++操作符相反,表示操作数减1,具体特点与上段相同,不再赘述。

delete操作符


这里的 delete 与C++中的 delete 关键字不同,这不是用来释放一个对象的内存空间,而是释放对象内部的一个自定义属性和方法的引用。对于 delete 的用法,我用一张图片来说明。

我们定义了一个Date类型的对象 a,并给它定义一个属性 name 和一个方法 speak,然后我们用 delete 操作符将自定义的属性和方法删除。同时我们也发现,对于Javascript内置的属性和方法是不可以通过delete 操作符删除的,这里我们测试的是Date对象的valueOf方法。

我再抛出一个简单的问题,如果我们定义一个变量或函数,是否可以用delete 操作符来删除这个变量或函数?为什么?

void操作符


void 操作符的用途是对所有的表达式返回 undefined,这个功能似乎很奇怪,或许在防止产生意外计算结果的时候会有用吧……看到比较多的应用,一个是作为死链接,一个是打开新窗口。

void操作符制作死链接

1
<a href="javascript:void(0)">我是一个死链接</a>

我是一个死链接

打开新窗口

要打开一个新窗口,我们可以用这个代码:

1
<a href="javascript:window.open('about:blank')">打开新窗口</a>

我不建议读者点这个链接,不过我测试下来,chrome浏览器是对这个问题做了处理,如果你是想故意测试这个bug,请换IE浏览器来点击前面的链接。这个时候 void 操作符就能够发挥作用了,我们把代码改为:

1
<a href="javascript:void(window.open('about:blank'))">打开新窗口</a>

读者再点击链接,就不会再有上面的bug了。


本文基于署名-非商业性使用 3.0许可协议发布,转载、演绎必须保留本文的署名周骅(包含链接http://zhouhua.github.io),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。

从 +new Date 说起,Javascript的一元操作符相关推荐

  1. 【javascript】操作符:一元操作符

    一.一元操作符++ <script>//     var num1,num2,num3;     num1=1;num2=2;     alert(++num1+num2);//4   + ...

  2. java 赋值,算术,一元操作符(翻译自Java Tutorials)

    原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/15/2819621.html 英文出自 http://docs.oracle.com/ja ...

  3. 一元操作符“++”,“- ” 之强制转换数值

    递增和递减分别有前置型和后置型,这里不作区分. 下面的代码全部是后置型递增: var str = "z"; console.log(str++) //NaN console.log ...

  4. 一元操作符——递增和递减操作符(第一次写博客,紧张.)

    一元操作符,即只能操作一个值的操作符,是JS中最简单的操作符. 1.递增和递减操作符 分为2个版本:前置型和后置型.若使用前置递增操作符给一个数值加1,要把(++)放在数值前面: var a = 1; ...

  5. 一元操作符、强制类型转换表达式、乘除操作符、加法操作符、移位操作符、关系操作符、判等操作符、位操作符与逻辑操作符、条件与操作符、条件或操作符--运算机制与返回值

    操作符处理及返回值 先遣提示 一元操作符 前缀递增操作符 ++ 前缀递增操作符 - - 一元加号操作符 + 关于一元数值提升或二元数值提升 可以看这篇博客 一元减号操作符 - 这里涉及了 原码,反码, ...

  6. html date 设置时间,JavaScript Date(日期)

    JavaScript Date(日期) 对象 日期对象用于处理日期和时间. 在线实例 getFullYear() 使用 getFullYear() 获取年份. getTime() getTime() ...

  7. JavaScript运算符——一元、二元、三元运算符

    JavaScript 一元运算符 一.js中的一元(一目)运算符 i++ 先赋值,再自加1 i++ 结果为 num1=4 num2=5 document.write()打印 反过来 1> str ...

  8. 一元操作符和使用Number()方法的区别

    操作数本身会变 转载于:https://www.cnblogs.com/kerola/p/5427301.html

  9. javascript 的位操作符转换推断

    var a = "10" | 0;alert(a);alert (typeof a); 结果为10,number. 这就是说这条语句可以将字符串转化为number. 如果: var ...

最新文章

  1. vasp安装包_【问题集锦】VASPamp;MedeA 第十一期
  2. iOS进阶之底层原理-锁、synchronized
  3. C#/Net代码精简优化技巧(3)
  4. 谷歌开源 tf-seq2seq,你也能用谷歌翻译的框架训练模型
  5. 用vmware-converter4把linux 迁移到ESX4.1中
  6. cf1453B. Suffix Operations
  7. 实例54:python
  8. 【牛客 - 318M】被打脸的潇洒哥(几何问题,水题,结论,知识点)
  9. 在PHP中如何要json中的数据,如何在不知道键值的情况下在php中读取JSON数据
  10. SCOI2014极水的题解- -
  11. Unity2019.2中文更新日志速览版
  12. python删除文件命令_python 删除文件夹
  13. 学习SQL 的网址集合
  14. 《精通软件性能测试与LoadRunner最佳实战》—第1章1.5节软件开发与软件测试的关系...
  15. 暴风影音CTO:暴风门事件给研发团队带来的启示
  16. 面经 - 计算机网络知识点
  17. 抓取青果教务系统信息
  18. 十分钟学懂Python入门基础3(中)
  19. Chang-Xiao Li Machine Learning 2019 Task10
  20. 机械转行java自学经历,零基础学java,血泪总结的干货

热门文章

  1. Swift之捕捉侧滑返回事件并跳转指定控制器
  2. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第三题:日期差
  3. PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
  4. 第十届 蓝桥杯样题 —— 信用卡号验证
  5. 征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1101:不定方程求解
  7. Exp5 MSF基础应用 20164309 欧阳彧骁
  8. 【Qt】MainWindow窗口状态栏
  9. 【STM32】FreeRTOS列表和列表项详解
  10. 【STM32】FreeRTOS任务挂起和恢复API