从 +new Date 说起,Javascript的一元操作符
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的读者听说过它们之间“先赋值再运算”和“先运算再赋值”的差异。
那它们的差异具体是什么样的呢?还是以具体的实验结果来说明吧。
1
2
|
var a=10;
console.log(a++ - 1);
|
图1:a++
运算结果
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的一元操作符相关推荐
- 【javascript】操作符:一元操作符
一.一元操作符++ <script>// var num1,num2,num3; num1=1;num2=2; alert(++num1+num2);//4 + ...
- java 赋值,算术,一元操作符(翻译自Java Tutorials)
原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/15/2819621.html 英文出自 http://docs.oracle.com/ja ...
- 一元操作符“++”,“- ” 之强制转换数值
递增和递减分别有前置型和后置型,这里不作区分. 下面的代码全部是后置型递增: var str = "z"; console.log(str++) //NaN console.log ...
- 一元操作符——递增和递减操作符(第一次写博客,紧张.)
一元操作符,即只能操作一个值的操作符,是JS中最简单的操作符. 1.递增和递减操作符 分为2个版本:前置型和后置型.若使用前置递增操作符给一个数值加1,要把(++)放在数值前面: var a = 1; ...
- 一元操作符、强制类型转换表达式、乘除操作符、加法操作符、移位操作符、关系操作符、判等操作符、位操作符与逻辑操作符、条件与操作符、条件或操作符--运算机制与返回值
操作符处理及返回值 先遣提示 一元操作符 前缀递增操作符 ++ 前缀递增操作符 - - 一元加号操作符 + 关于一元数值提升或二元数值提升 可以看这篇博客 一元减号操作符 - 这里涉及了 原码,反码, ...
- html date 设置时间,JavaScript Date(日期)
JavaScript Date(日期) 对象 日期对象用于处理日期和时间. 在线实例 getFullYear() 使用 getFullYear() 获取年份. getTime() getTime() ...
- JavaScript运算符——一元、二元、三元运算符
JavaScript 一元运算符 一.js中的一元(一目)运算符 i++ 先赋值,再自加1 i++ 结果为 num1=4 num2=5 document.write()打印 反过来 1> str ...
- 一元操作符和使用Number()方法的区别
操作数本身会变 转载于:https://www.cnblogs.com/kerola/p/5427301.html
- javascript 的位操作符转换推断
var a = "10" | 0;alert(a);alert (typeof a); 结果为10,number. 这就是说这条语句可以将字符串转化为number. 如果: var ...
最新文章
- vasp安装包_【问题集锦】VASPamp;MedeA 第十一期
- iOS进阶之底层原理-锁、synchronized
- C#/Net代码精简优化技巧(3)
- 谷歌开源 tf-seq2seq,你也能用谷歌翻译的框架训练模型
- 用vmware-converter4把linux 迁移到ESX4.1中
- cf1453B. Suffix Operations
- 实例54:python
- 【牛客 - 318M】被打脸的潇洒哥(几何问题,水题,结论,知识点)
- 在PHP中如何要json中的数据,如何在不知道键值的情况下在php中读取JSON数据
- SCOI2014极水的题解- -
- Unity2019.2中文更新日志速览版
- python删除文件命令_python 删除文件夹
- 学习SQL 的网址集合
- 《精通软件性能测试与LoadRunner最佳实战》—第1章1.5节软件开发与软件测试的关系...
- 暴风影音CTO:暴风门事件给研发团队带来的启示
- 面经 - 计算机网络知识点
- 抓取青果教务系统信息
- 十分钟学懂Python入门基础3(中)
- Chang-Xiao Li Machine Learning 2019 Task10
- 机械转行java自学经历,零基础学java,血泪总结的干货
热门文章
- Swift之捕捉侧滑返回事件并跳转指定控制器
- 2014年第五届蓝桥杯C/C++ A组国赛 —— 第三题:日期差
- PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
- 第十届 蓝桥杯样题 —— 信用卡号验证
- 征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1101:不定方程求解
- Exp5 MSF基础应用 20164309 欧阳彧骁
- 【Qt】MainWindow窗口状态栏
- 【STM32】FreeRTOS列表和列表项详解
- 【STM32】FreeRTOS任务挂起和恢复API