是否有通用的JavaScript函数可检查变量是否具有值并确保其undefined
或为null
? 我有以下代码,但是不确定是否能涵盖所有情况:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
#1楼
这是最安全的支票,我还没有看到它完全像这样张贴在这里:
if (typeof value != 'undefined' && value) {
//deal with value'
};
它将涵盖从未定义过价值的情况,以及以下任何一种情况:
- 空值
- 未定义(未定义的值与从未定义的参数不同)
- 0
- “”(空字符串)
- 假
- N
PS不需要在typeof值中严格相等!='undefined'
#2楼
这是我的-如果value为null,undefined等或空白(即仅包含空格),则返回true:
function stringIsEmpty(value) {
return value ? value.trim().length == 0 : true;
}
#3楼
评分最高的第一个答案是错误的。 如果值未定义,它将在现代浏览器中引发异常。 您必须使用:
if (typeof(value) !== "undefined" && value)
要么
if (typeof value !== "undefined" && value)
#4楼
! 检查空字符串(“”),null,undefined,false以及数字0和NaN。 说,如果字符串为空,则var name = ""
console.log(!name)
返回true
。
function isEmpty(val){
return !val;
}
如果val为空,null,未定义,false,数字0或NaN,则此函数将返回true。
要么
根据您的问题域,您可以仅使用!val
或!!val
。
#5楼
您可能会发现以下功能有用:
function typeOf(obj) {
return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
或在ES7中(如果有进一步改进,请评论)
function typeOf(obj) {
const { toString } = Object.prototype;
const stringified = obj::toString();
const type = stringified.split(' ')[1].slice(0, -1);
return type.toLowerCase();
}
结果:
typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map
“请注意,绑定操作符(::)根本不是ES2016(ES7)的一部分,也不是ECMAScript标准的任何更高版本。它目前是该语言引入的阶段0(strawman)建议。” –西蒙·凯尔伯格。 作者希望对这个美丽的接受皇家提升的提议表示支持。
#6楼
此条件检查
if (!!foo) {
//foo is defined
}
是你所需要的全部。
#7楼
如果您喜欢普通的javascript,请尝试以下操作:
/**
* Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
* length of `0` and objects with no own enumerable properties are considered
* "empty".
*
* @static
* @memberOf _
* @category Objects
* @param {Array|Object|string} value The value to inspect.
* @returns {boolean} Returns `true` if the `value` is empty, else `false`.
* @example
*
* _.isEmpty([1, 2, 3]);
* // => false
*
* _.isEmpty([]);
* // => true
*
* _.isEmpty({});
* // => true
*
* _.isEmpty('');
* // => true
*/
function isEmpty(value) {
if (!value) {
return true;
}
if (isArray(value) || isString(value)) {
return !value.length;
}
for (var key in value) {
if (hasOwnProperty.call(value, key)) {
return false;
}
}
return true;
}
否则,如果您已经在使用下划线或破折号,请尝试:
_.isEmpty(value)
#8楼
检查默认值
function typeOfVar (obj) {
return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function isVariableHaveDefaltVal(variable) {
if ( typeof(variable) === 'string' ) { // number, boolean, string, object
console.log(' Any data Between single/double Quotes is treated as String ');
return (variable.trim().length === 0) ? true : false;
}else if ( typeof(variable) === 'boolean' ) {
console.log('boolean value with default value \'false\'');
return (variable === false) ? true : false;
}else if ( typeof(variable) === 'undefined' ) {
console.log('EX: var a; variable is created, but has the default value of undefined.');
return true;
}else if ( typeof(variable) === 'number' ) {
console.log('number : '+variable);
return (variable === 0 ) ? true : false;
}else if ( typeof(variable) === 'object' ) {
// -----Object-----
if (typeOfVar(variable) === 'array' && variable.length === 0) {
console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
return true;
}else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
console.log('\t Object String with length = ' + variable.length);
return true;
}else if (typeOfVar(variable) === 'boolean' ) {
console.log('\t Object Boolean = ' + variable);
return (variable === false) ? true : false;
}else if (typeOfVar(variable) === 'number' ) {
console.log('\t Object Number = ' + variable);
return (variable === 0 ) ? true : false;
}else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
console.log('\t Object Regular Expression : ');
return true;
}else if (variable === null) {
console.log('\t Object null value');
return true;
}
}
return false;
}
var str = "A Basket For Every Occasion";
str = str.replace(/\s/g, "-");
//The "g" flag in the regex will cause all spaces to get replaced.
检查结果:
isVariableHaveDefaltVal(' '); // string
isVariableHaveDefaltVal(false); // boolean
var a;
isVariableHaveDefaltVal(a);
isVariableHaveDefaltVal(0); // number
isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true
isVariableHaveDefaltVal(null);
isVariableHaveDefaltVal([]);
isVariableHaveDefaltVal(/ /);
isVariableHaveDefaltVal(new Object(''));
isVariableHaveDefaltVal(new Object(false));
isVariableHaveDefaltVal(new Object(0));
typeOfVar( function() {} );
我使用@Vix function()检查哪种类型的对象。
使用«
var prototypes_or_Literals = function (obj) {
switch (typeof(obj)) {
// object prototypes
case 'object':
if (obj instanceof Array)
return '[object Array]';
else if (obj instanceof Date)
return '[object Date]';
else if (obj instanceof RegExp)
return '[object regexp]';
else if (obj instanceof String)
return '[object String]';
else if (obj instanceof Number)
return '[object Number]';
else
return 'object';
// object literals
default:
return typeof(obj);
}
};
output test «
prototypes_or_Literals( '' ) // "string"
prototypes_or_Literals( new String('') ) // "[object String]"
Object.prototype.toString.call("foo bar") //"[object String]"
#9楼
我认为使用? 操作员比较干净。
var ? function_if_exists() : function_if_doesnt_exist();
#10楼
这将检查不确定嵌套的变量是否未定义
function Undef(str)
{
var ary = str.split('.');
var w = window;
for (i in ary) {
try { if (typeof(w = w[ary[i]]) === "undefined") return true; }
catch(e) { return true; }
}
return false;
}
if (!Undef("google.translate.TranslateElement")) {
上面检查了Google翻译功能TranslateElement是否存在。 这等效于:
if (!(typeof google === "undefined"
|| typeof google.translate === "undefined"
|| typeof google.translate.TranslateElement === "undefined")) {
#11楼
就我而言,我尝试使用if null,'',!variable,但是没有用。
请参阅下面的代码以从html字段获取文本
var status=$(this).text(); //for example (for my case)
如果状态变量中没有值(无文本),我试图将值“ novalue”设置为状态变量。
以下代码有效。
if(status == false)
{
status='novalue';
}
当找不到饱和状态变量的文本时,上述代码将“ novalue”分配给状态变量
#12楼
尽管很老套,但忘记的是他们应该包装自己的代码块,然后捕获错误,然后进行测试...
function checkup( t ){
try{
for(p in t){
if( p.hasOwnProperty( t ) ){
return true;
}
}
return false;
}catch(e){
console.log("ERROR : "+e);
return e;
}
}
因此,您真的不必事先检查潜在的问题,只需抓住它,然后按需要进行处理即可。
#13楼
function isEmpty(val){
return !val;
}
但是此解决方案是过度设计的,如果您以后不想为业务模型需求修改功能,那么直接在代码中使用它更干净:
if(!val)...
#14楼
var myNewValue = myObject && myObject.child && myObject.child.myValue;
这将永远不会引发错误。 如果myObject , child或myValue为null,则myNewValue将为null。 没有错误将被抛出
#15楼
对于来这里提出类似问题的每个人,以下工作都很出色,最近几年我将其保存在我的图书馆中:
(function(g3, $, window, document, undefined){
g3.utils = g3.utils || {};
/********************************Function type()********************************
* Returns a lowercase string representation of an object's constructor.
* @module {g3.utils}
* @function {g3.utils.type}
* @public
* @param {Type} 'obj' is any type native, host or custom.
* @return {String} Returns a lowercase string representing the object's
* constructor which is different from word 'object' if they are not custom.
* @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
* http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
* http://javascript.info/tutorial/type-detection
*******************************************************************************/
g3.utils.type = function (obj){
if(obj === null)
return 'null';
else if(typeof obj === 'undefined')
return 'undefined';
return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
};
}(window.g3 = window.g3 || {}, jQuery, window, document));
#16楼
这可能是有用的。
数组中的所有值都表示您想要的内容(空,未定义或其他内容),然后在其中搜索所需内容。
var variablesWhatILookFor = [null, undefined, ''];
variablesWhatILookFor.indexOf(document.DocumentNumberLabel) > -1
#17楼
此函数检查empty object {}
, empty array []
, null
, undefined
和blank string ""
function isEmpty(val) {
//check for empty object {}, array []
if (val !== null && typeof val === 'object') {
if (Object.keys(obj).length === 0) {
return true;
}
}
//check for undefined, null and ""
else if (val == null || val === "") {
return true;
}
return false;
}
var val = {};
isEmpty(val)-> true
val = [];
isEmpty(val)-> true
isEmpty(未定义)-> true
isEmpty(null)-> true
isEmpty(“”)-> true
isEmpty(假)->假
isEmpty(0)->否
#18楼
您可以直接使用相等运算符
<script>
var firstName;
var lastName = null;
/* Since null == undefined is true, the following statements will catch both null and undefined */
if(firstName == null){
alert('Variable "firstName" is undefined.');
}
if(lastName == null){
alert('Variable "lastName" is null.');
}
</script>
demo @ 如何使用JavaScript确定变量是未定义还是为null
#19楼
您可以使用下面的代码检查所有四(4)条条件以进行验证,例如not null,not blank,not undefined和not zero仅在javascript和jquery中使用此代码(!(!(variable)))。
function myFunction() {
var data; //The Values can be like as null, blank, undefined, zero you can test
if(!(!(data)))
{
alert("data "+data);
}
else
{
alert("data is "+data);
}
}
#20楼
function isEmpty(obj) {
if (typeof obj == 'number') return false;
else if (typeof obj == 'string') return obj.length == 0;
else if (Array.isArray(obj)) return obj.length == 0;
else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
else if (typeof obj == 'boolean') return false;
else return !obj;
}
在带有修剪以处理空白字符串的ES6中:
const isEmpty = value => {
if (typeof value === 'number') return false
else if (typeof value === 'string') return value.trim().length === 0
else if (Array.isArray(value)) return value.length === 0
else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
else if (typeof value === 'boolean') return false
else return !value
}
#21楼
如果您使用的是TypeScript
并且不想考虑“那些false
值”,那么这是适合您的解决方案:
首先: import { isNullOrUndefined } from 'util';
然后: isNullOrUndefined(this.yourVariableName)
请注意: 如下所述 ,现在不建议使用,使用value === undefined || value === null
value === undefined || value === null
。 参考 。
#22楼
try{
let vari = obj.propTest; // obj may be don't have propTest property
...
} catch(NullException){
// do something here
}
我认为使用try catch可以避免任何null检查错误,即使在Angular或JavaScript中,也只需捕获null异常并在其中进行处理。
#23楼
return val || 'Handle empty variable'
是在很多地方处理它的一种非常不错的方法,也可以用来分配变量
const res = val || 'default value'
#24楼
我非常喜欢的解决方案:
让我们定义一个空白变量为null
或undefined
,或者如果它具有长度,则为零,或者如果它是一个对象,则没有键:
function isEmpty (value) {
return (
// null or undefined
(value == null) ||
// has length and it's zero
(value.hasOwnProperty('length') && value.length === 0) ||
// is an Object and has no keys
(value.constructor === Object && Object.keys(value).length === 0)
)
}
返回值:
- true:
undefined
,null
,""
,[]
,{}
- 假:
true
,false
,1
,0
,-1
,"foo"
,[1, 2, 3]
{ foo: 1 }
#25楼
您可以只检查变量是否具有truthy
值。 那意味着
if( value ) {
}
如果value
不是,将评估为true
:
- 空值
- 未定义
- N
- 空字符串(“”)
- 0
- 假
上面的列表表示ECMA- / Javascript中所有可能的falsy
值。 在规范的ToBoolean
部分中找到它。
此外,如果您不知道变量是否存在(也就是说,是否已声明 ),则应使用typeof
运算符进行检查。 例如
if( typeof foo !== 'undefined' ) {
// foo could get resolved and it's defined
}
如果可以确定至少声明了一个变量 ,则应直接检查它是否具有truthy
所示的truthy
值。
进一步阅读: http : //typeofnan.blogspot.com/2011/01/typeof-is-fast.html
#26楼
function isEmpty(value){
return (value == null || value.length === 0);
}
这将返回true
undefined // Because undefined == null
null
[]
""
和零参数函数,因为函数的length
是它需要的已声明参数的数量。
要禁止使用后一种类别,您可能只需要检查空白字符串即可
function isEmpty(value){
return (value == null || value === '');
}
#27楼
检查value是undefined还是null的详细方法是:
return value === undefined || value === null;
您也可以使用==
运算符,但这希望人们知道所有规则 :
return value == null; // also returns true if value is undefined
#28楼
你有点过分了。 要检查变量是否没有赋值,只需要检查undefined和null。
function isEmpty(value){
return (typeof value === "undefined" || value === null);
}
假设0
, ""
和对象(甚至是空对象和数组)都是有效的“值”。
#29楼
如果尚未声明该变量,则将无法使用函数测试未定义变量,因为会出现错误。
if (foo) {}
function (bar) {}(foo)
如果尚未声明foo,则两者都会产生错误。
如果要测试是否已声明变量,可以使用
typeof foo != "undefined"
如果要测试是否已声明foo并且它具有一个值,则可以使用
if (typeof foo != "undefined" && foo) {
//code here
}
#30楼
空虚
我不建议尝试定义或使用一个函数来计算整个世界中是否有任何空值。 “空”到底意味着什么? 如果我let human = { name: 'bob', stomach: 'empty' }
, isEmpty(human)
是否应返回true
? 如果我let reg = new RegExp('');
, isEmpty(reg)
应该返回true
吗? 那么isEmpty([ null, null, null, null ])
-该列表仅包含空性,因此列表本身是否为空? 我想在这里提出一些有关javascript中的“空缺”(故意模糊的词,以避免预先存在的关联)的注意事项-我想指出,javascript值中的“空缺”永远都不应加以处理。
真实/虚假
为了决定如何确定值的“空缺”,我们需要适应javascript对值是“真实”还是“虚假”的内在固有感觉。 自然, null
和undefined
都是“虚假的”。 不太自然的是,数字0
(除了NaN
之外没有其他数字)也是“虚假的”。 至少自然而然: ''
是虚假的,但是[]
和{}
(以及new Set()
和new Map()
)是真实的-尽管它们看起来都一样虚空!
空值与未定义
还有一些关于null
与undefined
讨论-为了在我们的程序中表达虚无,我们真的需要两者吗? 我个人避免在我的代码中按顺序出现字母u,n,d,e,f,i,n,e,d。 我总是使用null
来表示“空缺”。 同样,尽管如此,我们需要适应javascript固有的意义,即null
和undefined
不同之处:
- 尝试访问不存在的属性给出
undefined
- 调用函数时省略参数会导致该参数接收到
undefined
:
let f = a => a; console.log(f('hi')); console.log(f());
- 具有默认值的参数仅在给定
undefined
而非null
时才接收默认值:
let f = (v='hello') => v; console.log(f(null)); console.log(f(undefined));
非通用性
我相信,空虚绝不应该以一般方式处理。 相反,在确定数据是否为空之前,我们应该始终严格要求获取有关数据的更多信息-我主要是通过检查要处理的数据类型来做到这一点的:
let isType = (value, Cls) => { try { return Object.getPrototypeOf(value).constructor === Cls; } catch(err) { return false; } };
请注意,此函数忽略多态性-它期望value
是Cls
的直接实例,而不是Cls
子类的实例。 我避免instanceof
有两个主要原因:
-
([] instanceof Object) === true
(“数组是对象”) -
('' instanceof String) === false
(“字符串不是字符串”)
请注意,使用Object.getPrototypeOf
可以避免类似let v = { constructor: String };
对于isType(v, String)
(false)和isType(v, Object)
(true) isType(v, Object)
isType
函数仍然正确返回。
总体而言,我建议将此isType
函数与以下提示结合使用:
- 最小化未知类型的代码处理值的数量。 例如,
let v = JSON.parse(someRawValue);
,我们的v
变量现在为未知类型。 我们应该尽早限制我们的可能性。 最好的方法是通过要求特定的类型:例如,if (!isType(v, Array)) throw new Error('Expected Array');
-这是删除v
的泛型特性并确保其始终为Array
一种非常快速且富有表现力的方法。 但是,有时我们需要允许v
为多种类型。 在这种情况下,我们应该尽早创建不再具有v
泛型的代码块:
if (isType(v, String)) { /* v isn't generic in this block - It's a String! */ } else if (isType(v, Number)) { /* v isn't generic in this block - It's a Number! */ } else if (isType(v, Array)) { /* v isn't generic in this block - it's an Array! */ } else { throw new Error('Expected String, Number, or Array'); }
- 始终使用“白名单”进行验证。 如果您需要一个值,例如字符串,数字或数组,请检查这3种“白色”可能性,如果不满足3种,则抛出错误。 我们应该能够看到检查“黑色”可能性不是很有用:假设我们写
if (v === null) throw new Error('Null value rejected');
-这对于确保null
值不会通过它很有用,但是如果一个值确实通过它,我们几乎一无所知。 通过此空检查的值v
仍然非常通用-它除了null
什么都没有 ! 黑名单很难消除通用性。 除非值是
null
,否则不要考虑“null
值”。 取而代之的是考虑“一个空虚的X”。 本质上,永远不要考虑做if (isEmpty(val)) { /* ... */ }
-不管isEmpty
函数是如何实现的(我不想知道...),这都没有意义! 而且太普通了! 仅应在了解val
类型的情况下计算其柔度。 连通性检查应如下所示:- “没有字符的字符串”:
if (isType(val, String) && val.length === 0) ...
- “具有0个道具的对象”:
if (isType(val, Object) && Object.entries(val).length === 0) ...
- “等于或小于零的数字”:
if (isType(val, Number) && val <= 0) ...
“一个没有项目的数组”:
if (isType(val, Array) && val.length === 0) ...
唯一的例外是使用
null
表示某些功能时。 在这种情况下,有意义的是说:“空泡值”:if (val === null) ...
- “没有字符的字符串”:
#31楼
根据jAndy的回答 ,如果您希望避免以下情况中的任何一项成为真,则:
- 空值
- 未定义
- N
- 空字符串(“”)
- 0
- 假
一种可能避免获得真实值的可能解决方案如下:
function isUsable(valueToCheck) {
if (valueToCheck === 0 || // Avoid returning false if the value is 0.
valueToCheck === '' || // Avoid returning false if the value is an empty string.
valueToCheck === false || // Avoid returning false if the value is false.
valueToCheck) // Returns true if it isn't null, undefined, or NaN.
{
return true;
} else {
return false;
}
}
它的用法如下:
if (isUsable(x)) {
// It is usable!
}
// Make sure to avoid placing the logical NOT operator before the parameter (isUsable(!x)) and instead, use it before the function, to check the returned value.
if (!isUsable(x)) {
// It is NOT usable!
}
除了这些方案之外,如果对象或数组为空,则可能要返回false:
您可以这样处理:
function isEmptyObject(valueToCheck) {
if(typeof valueToCheck === 'object' && !Object.keys(valueToCheck).length){
// Object is empty!
return true;
} else {
// Object is not empty!
return false;
}
}
function isEmptyArray(valueToCheck) {
if(Array.isArray(valueToCheck) && !valueToCheck.length) {
// Array is empty!
return true;
} else {
// Array is not empty!
return false;
}
}
如果要检查所有空格字符串(“”),则可以执行以下操作:
function isAllWhitespace(){
if (valueToCheck.match(/^ *$/) !== null) {
// Is all whitespaces!
return true;
} else {
// Is not all whitespaces!
return false;
}
}
注意:如果变量被声明为空字符串,则hasOwnProperty
对空字符串,0,false,NaN,null和undefined返回true,因此可能不是最好的用法。 可以修改该函数以使用它来表明它已被声明,但不可用。