如何检测变量是不是包含任何内容
Posted
技术标签:
【中文标题】如何检测变量是不是包含任何内容【英文标题】:how to detect if a variable contains anything如何检测变量是否包含任何内容 【发布时间】:2019-05-08 14:05:17 【问题描述】:我正在创建一个网站,如果您的位置未被阻止,则仅允许用户访问该网站,我试图创建如果位置不存在,则不允许该用户
我尝试过使用
if (typeof(showPosition)=="undefined")
document.getElementById("x").innerhtml = "object is null ";
和
if (!showPosition)
document.getElementById("x").innerHTML = "object is null ";
和
if (showPosition == "null")
document.getElementById("x").innerHTML = "object is null ";
但以上方法均无效。
这是我的两个函数
if (navigator.geolocation)
navigator.geolocation.getCurrentPosition(showPosition, showError);
else
x.innerHTML = "Geolocation is not supported by this browser.";
function showPosition(position)
x.innerHTML = "Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
【问题讨论】:
包含您所说的行的代码在哪里?据我所知,您还没有定义一个名为showPosition
的变量
你定义的函数叫做showPosition
,所以它是typeof showPosition === "function"
尝试if ( showPosition === undefined )
与三重等于===
该函数不返回任何内容,它是异步调用的,所以没有意义。
所有关于检查的 cmets 都是无用的,因为 OP 试图做的事情是不可能的。必须改变逻辑才能使其正常工作。
【参考方案1】:
我理解您的问题的方式是,您希望允许用户访问,前提是他们的浏览器具有定位功能并允许访问,这是一个可能有帮助的解决方案:
if (!navigator.geolocation)
// Location does not exist, do what you wanna do
// Always remember to exit your functions early
return;
// Location exists, proceed to ask for location permissions
navigator.geolocation.getCurrentPosition(showPosition, showError);
// Function to call when permission granted
function showPosition(location)
x.innerHTML = "Latitude: " + position.coords.latitude + "<br>Longitude: " + position.coords.longitude;
// Function to call when permission denied
function showError(error)
// error has code and message; goto: https://developer.mozilla.org/en-US/docs/Web/API/PositionError
希望能解决你的问题
以后如果你想测试一个变量是否有任何值,只需这样做:
if (typeof variable === 'undefined' || variable === null)
// variable is either undefined or null, so basically does not contain anything
如果你这样做:
if (!variable)
// variable is either undefined or null, so basically does not contain anything
如果变量的值为 0
或为空字符串 (''
)(包括 undefined
和 null
),这将返回 true。
【讨论】:
如果我这样做var test = "" if (typeof test === 'undefined' || test === null) document.getElementById("demo").innerHTML = "object is null ";
,那么它不会显示任何内容,但如果我这样做 if (typeof test1 === 'undefined' || test1 === null)
然后它说“对象为空”,所以它似乎没有工作跨度>
是的,因为当您将test
变量分配给空字符串时,它不再是undefined
,而是现在的string
,现在当您执行typeof test === 'string'
时,它将返回true。这解释了为什么第一个条件失败而最后一个条件通过,因为在最后一个场景中,您没有为变量 test1
分配任何东西,因此它未定义
如果它是一个空字符串,它应该归类为 null
@DasShield null 和空字符串是两个不同的非常独立的东西,null 表示没有值,空字符串表示有一个值是字符串并且值是空字符串,继续做@987654335 @ 和 typeof ''
并观察输出
如果它解决了你的问题,请接受这个答案【参考方案2】:
似乎普遍缺乏对geoLocation
api 的理解。 mdn website 会很有帮助,但要让你开始,试试这个 sn-p:
这是一个 codepen 版本,因为 *** 显然阻止了它的 sn-ps 访问用户位置 (https://codepen.io/anon/pen/VOvrwb)
const NOT_SUPPORTED_BY_BROWSER = 0, SUPPORTED_BUT_BLOCKED = 1, SUPPORTED_AND_ALLOWED = 2;
let getGeoLocationStatus = () =>
if (!navigator.geolocation)
return Promise.reject(NOT_SUPPORTED_BY_BROWSER);
return new Promise((resolve, reject) =>
navigator.geolocation.getCurrentPosition(
position => resolve(position),
() => reject(SUPPORTED_BUT_BLOCKED)))
;
let x = document.getElementById("x");
getGeoLocationStatus().then(position =>
x.innerHTML = "Latitude: " + position.coords.latitude + "<br>Longitude: " + position.coords.longitude;
).catch(reason =>
x.innerHTML = reason === NOT_SUPPORTED_BY_BROWSER ? 'Geolocation is not supported by this browser.' : 'blocked by user';
);
<div id="x"></div>
【讨论】:
请在您的代码中添加一些解释,以便 OP 可以从中学习 没有太多我可以添加的内容尚未在 wiki 上。满足他们用例的简短 sn-p 应该足以让他们走上正确的道路【参考方案3】:用 Promise 试试看:
//this is the function you wanna test it returns
function showPosition()
//Do some staff
return 1;
//Creating a promise
var promise = new Promise(function(resolve, reject)
try
let sp = showPosition();
if( sp !== undefined && sp !== null )
resolve(sp);
else
reject(err);
catch
reject(err);
);
promise.then((res)=>
console.log('response of function is '+res);
).catch((err)=>
console.debug('erreur'+err);
);
【讨论】:
以上是关于如何检测变量是不是包含任何内容的主要内容,如果未能解决你的问题,请参考以下文章