JavaScript 中,num = num || 1 这种写法有哪些优缺点?

语法糖,等价于 if(!!num === false) num=1; 类似于java的 num=null ? 1 : num

以下是来自某位知友的解答:

就是个简写法而已。好处就是短一点,但是其实坏处更大

你是否确切知道什么时候会变成1?

——当num有值为0时,也会变成1!
——当num有值为NaN时(很可能意味着前面的计算出错了),也会变成1!
——另外当传入的值类型错误时,本来或许你的程序会报错,但是经过这个语句,也许就不报错了。

这些很可能不是你想要的结果,尤其是许多函数可能会加上针对0这个特殊值的处理,这往往会导致错误。就算现在正好是你想要的结果,但是以后的维护者(包括1个月以后的你自己)未必能一眼看出来!

所以个人建议在一定规模以上的团队或项目中,不要用 || 的短路,还是老老实实的写:

if (num == null) num = 1

唯一的例外是,如果你确切的知道那是一个对象而不可能是primitive值,可以用。
option = option || defaultOption

作者:贺师俊
来源:https://www.zhihu.com/question/20377595/answer/14948746

 

时间: 2024-08-15 20:41:01

JavaScript 中,num = num || 1 这种写法有哪些优缺点?的相关文章

js(javascript)中的奇特for循环写法!

本文章为JavaScript强化教程系列介绍js开发 最近在在一份面试题中看到这样几种for循环的写法第一反应是懵逼的 之后仔细看一下还是没有问题的 首先上代码第一种 正常的循环 [javascript] view plain copy  forvar i=0;i<10;i++{} 这种f循环是正常的循环完全没有问题 第二种 [javascript] view plain copy  forvar i=10;i--;{} 循环结果是正常循环10次 第三种 for(;;); 这种会死循环 第四种

JavaScript中匿名函数的多种写法

匿名函数没有实际名字,也没有指针,怎么执行滴?  其实大家可以看看小括号的意义就应该可以理解.小括号有返回值,也就是小括号内的函数或者表达式的返回值,所以说小括号内的function返回值等于小括号的返回值,不难理解 (function(){})()可以将没有名字的函数执行了把- 关于匿名函数写法,很发散~ 最常见的用法: 代码如下: (function() { alert('water'); })(); 当然也可以带参数: 代码如下: (function(o) { alert(o); })('

javascript中经典继承的兼容写法

function create(obj) { // 2.1 判断浏览器支持不支持 Object.create // 如果支持,直接使用 Object.create // 如果不支持,自己实现 if(Object.create) { return Object.create(obj); } else { function F() {} F.prototype = obj; return new F(); } }

详解JavaScript中的replace()函数

Javascript中字符串对象有一个方法replace(),它的作用非常强大.这里把它的用法整理一下.  一.方法简介 该方法的签名是:replace([RegExp|String],[String|Function]). 该方法 返回一个新的字符串,但并不改变字符串本身. 该方法接收2个参数,第一个参数可以是字符串,也可以是一个正则表达式:第二个参数可以是一个字符串,也可以是一个函数.其中第2个参数如果是函数,那么用起来是十分强大而且灵活的,不过相对来说也比较难掌握.下面就其用法进行详细说明

javascript中&quot;return obj === void 0&quot;这种写法的原因和好处

学习underscore.js的时候,发现源码中经常出现类似下面的代码: if (context === void 0) return func; if (array == null) return void 0; 以前没有见过这种写法,到网上搜了一些资料,刚好发现stackoverflow上也有人提出类似的疑问.这里总结归纳下,做个笔记.void其实是javascript中的一个函数,接受一个参数,返回值永远是undefined.可以说,使用void目的就是为了得到javascript中的un

在JavaScript中创建命名空间的几种写法

在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hello var'; }; function sayHello(name) { return 'Hello function'; }; sayHello(); 最终的输出为 > "Hello var" 为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是

JavaScript中模块“写法”

在JavaScript模块到底是什么 event = function() { // do more return { bind: function() {}, unbind: function() {}, trigger: function() {} }; }();这能代表"模块"吗?这就是一个JS对象啊,以为有多么深奥. 是的,JavaScript中模块多数时候被实现为一个对象.这么看来,多数时候我们都写过"模块"(但没有在整个项目中应用模块化思想).或许每个人

javascript中(function($){...})(jQuery)写法是什么意思

在javascript中 (function($){...})(jQuery)的写法是什么意思. ======================================================================   //这是一条分割线. 首先 function(arg){ //.... } 这种形式的在javascript中称之为匿名函数.arg则是匿名函数的参数. 而(function($){ })(jQuery);这种形式则是执行匿名函数并且传递参数jQuery.

Javascript 中的回调函数和递归函数简单实际分析学习

Javascript 中的回调函数和递归函数简单实际分析学习 1 回调函数 所谓回调函数简单理解就是将一个函数做为参数传递给其他的函数供其使用.(只是在js中,因为其它的语言中有指针这个概念). 举一个简单的例子,当我们在统计账单的时候就要整理材料这些,然后就需要计算器,计算器我们想象成为一个可以实现计算的函数.统计账单是另外的另一个函数,当统计账单的时候就会需要计算器这个函数的支持,其实这就是一个简单的回调.可以按这个理解. 下来我借用网上的一个例子: //先定义一个函数fun1 functi