为什么underscore.js的isUndefined是这样定义的?_.isUndefined = function(obj) { return obj === void 0; };为什么这行不通?typeof obj === 'undefined'
_.isUndefined = function(obj) { return obj === void 0; };
typeof obj === 'undefined'
gstyhher1#
好的,首先typeof obj === 'undefined'比较慢,你可以很容易地验证。那么问题是为什么要做这样的比较
obj === void 0
对比
obj === undefined
让我们看看:void 0;返回一元运算符void的结果,void将始终返回undefined(即void 1不会产生任何差异)undefined指向全局变量undefined。在正常情况下,这两个是一样的。我认为,虽然void 0是首选,因为它可以阴影undefined与局部变量undefined:)这是愚蠢的,但它发生了。
void 0;
void
undefined
void 1
void 0
ar7v8xwq2#
这样写可能更有效率。你为什么不分析一下这两个定义呢?
5jdjgkvh3#
如果你写viod,你会得到一个语法错误。你把“undefined”拼错为'undeifned',但是你没有得到任何错误。所以,一个可能的原因是调试更容易!:)
viod
'undeifned'
brc7rcf04#
截至今天(2023-01-23),lodash的实现(不是我的)如下所示:
function isUndefined(value) { return value === undefined }
我猜这个更新是由于undefined从ECMAScript 5开始是只读的,不能再被阴影化。但是,这也带来了一个问题,如果变量value没有定义,函数就不会像您期望的那样返回true,而是抛出'Uncatch ReferenceError'使用void 0的解决方案也有同样的问题。因此,使用typeof obj === 'undefined'是安全的。
value
true
4条答案
按热度按时间gstyhher1#
好的,首先
typeof obj === 'undefined'
比较慢,你可以很容易地验证。那么问题是为什么要做这样的比较
对比
让我们看看:
void 0;
返回一元运算符void
的结果,void
将始终返回undefined
(即void 1
不会产生任何差异)undefined
指向全局变量undefined
。在正常情况下,这两个是一样的。我认为,虽然
void 0
是首选,因为它可以阴影undefined
与局部变量undefined
:)这是愚蠢的,但它发生了。ar7v8xwq2#
这样写可能更有效率。你为什么不分析一下这两个定义呢?
5jdjgkvh3#
如果你写
viod
,你会得到一个语法错误。你把“undefined”拼错为'undeifned'
,但是你没有得到任何错误。所以,一个可能的原因是调试更容易!:)brc7rcf04#
截至今天(2023-01-23),lodash的实现(不是我的)如下所示:
我猜这个更新是由于
undefined
从ECMAScript 5开始是只读的,不能再被阴影化。但是,这也带来了一个问题,如果变量
value
没有定义,函数就不会像您期望的那样返回true
,而是抛出'Uncatch ReferenceError'使用void 0的解决方案也有同样的问题。
因此,使用
typeof obj === 'undefined'
是安全的。