如果我有一个对象的引用:
var test = {};
Run Code Online (Sandbox Code Playgroud)
可能(但不是立即)有嵌套对象,如:
{level1: {level2: {level3: "level3"}}};
Run Code Online (Sandbox Code Playgroud)
在最深层嵌套的对象中测试密钥是否存在的最佳方法是什么?
alert(test.level1);
收益率undefined
,但alert(test.level1.level2.level3);
失败了.
我现在正在做这样的事情:
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法.
javascript/jQuery中有什么东西可以检查变量是否设置/可用?在php中,我们isset($variable)
用来检查这样的东西.
谢谢.
如何测试变量是否定义?
if //variable is defined
//do this
else
//do this
Run Code Online (Sandbox Code Playgroud) 有关简单的示例,请参见http://jsfiddle.net/FDhQF/1/.
未定义的内容与Javascript中未定义的内容之间有什么区别?例如,尝试访问未定义的对象的属性(实际上,尝试访问变量)将返回undefined
.但你也可以设置一些东西= undefined
.当你这样做,尝试访问它仍然返回undefined,但指针仍然存在.如上所示,一个例子是如何迭代对象仍然遍历您已经(重新)声明为未定义的属性.看起来有两种不同的未定义.任何人都可以对这种情况有所了解吗?
我最近在Swift编程了很多.今天,当我遇到问题时,我在JavaScipt做了一些工作:
是否有类似于JavaScript中的可选链接?一种防止undefined is not an object
没有任何变量的方法?
例:
function test(){
if(new Date() % 2){
return {value: function(){/*code*/}};
}
}
test().value();
Run Code Online (Sandbox Code Playgroud)
将失败一半的时间因为有时会test
返回undefined.
我能想到的唯一解决方案是功能:
function oc(object, key){
if(object){
return object[key]();
}
}
oc(test(), 'value');
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
test()?.value()
Run Code Online (Sandbox Code Playgroud)
问号后面的部分仅在test
返回对象时执行.
但这不是很重要.还有更好的东西吗?运营商的神奇组合?
编辑我知道我可以重写test
以返回一些东西.但我想知道是否有类似可选链接的东西.我对上面例子的特定解决方案不感兴趣.如果无法控制返回undefined的函数,我也可以使用的东西.
在jQuery中,无论是$('#foo').height()
和$('#foo').css('height')
返回值,即使没有高属性是使用CSS明确设置.有没有办法检测元素是否没有明确的高度,即它只是根据其内容呈现?
这是我写的一个例子来演示:http://jsfiddle.net/Enn6p/2/
编辑
为了进一步澄清我的问题,$('#foo').css('min-height')
并$('#foo').css('max-height')
已经正确地返回一个空字符串,如果他们没有明确设定.我正在寻找一种方法来确定是否height
通过CSS设置显式值.
使用案例
我有一个脚本,试图使浮动元素具有相同的高度.它通过循环元素来查看哪一个是最高的,然后将该高度应用于所有元素.在某些情况下,这些元素已经具有明确的高度设置,但其他元素是隐式呈现的.
我现在想要添加撤消它的功能,并使一切恢复到原来的高度.为了做到这一点,我需要知道元素最初是否设置了高度,或者高度是否为"auto".一旦我能够做到这一点,我可以将原始值存储在元素的数据集合中,然后使用它来稍后恢复到原始高度.
如何检查isset
javascript.
我用以下方式.
var sessionvalue = document.getElementById('sessionvalue').value;
if(Here I have to check if isset the sessionvalue or not){
if(sessionvalue == "" || sessionvalue == null)
{
document.getElementById('sessionvalue').style.borderColor="red";
return false;
}
else
{
document.getElementById('sessionvalue').style.borderColor="#ccc";
}
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找相当于php函数的javascript isset()
.我已经尝试过这里描述的JavaScript isset()等效的方法但是在firebug中,错误出现了
data.del is undefined //Firebug warning/error
if(typeof data.del[0].node != 'undefined') { // codes in my js file
Run Code Online (Sandbox Code Playgroud)
在某些情况下
data is null //Firebug warning/error
if(typeof data.storyLine != 'undefined') { // codes in my js file
Run Code Online (Sandbox Code Playgroud)
逻辑似乎有效,但我想知道为什么会出现错误?
基本上,我想检查是否data.del[0].node
或是否data.storyLine
?
我从CouchDB数据库中获得了一组完全不同的复杂JSON对象.每个都包含许多级别的嵌套属性 - 例如,
tps_report.personnel_info.productivity.units_sold = 8
Run Code Online (Sandbox Code Playgroud)
我想迭代这些对象并用它们做些事情:例如,
// writes units sold from each TPS report:
for (i in tpsReports) {
if (tpsReports[i].personnel_info.productivity.units_sold < 10) {
fireEmployee();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是许多TPS报告没有设置所有这些属性.因此,如果我尝试这个,我将在第一次循环到达没有"personnel_info"属性的报告时出现错误,从而尝试找到"未定义"的"生产力"属性.我宁愿发生的是条件只是跳过它并继续.
我看到了两种方法,这两种方式对我来说都很难看
我更喜欢的是PHP的isset()函数,它不会抛出错误,无论你提供什么 - 它只会告诉你你正在寻找的特定变量是否存在.所以,就像
// writes units sold from each TPS report:
for (i in tpsReports) {
if (isset(tpsReports[i].personnel_info.productivity.units_sold)){
if (tpsReports[i].personnel_info.productivity.units_sold < 10) {
fireEmployee();
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
假设我有一个JavaScript对象:
var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";
Run Code Online (Sandbox Code Playgroud)
现在,我可以轻松检查null,如:
if(obj != 'undefined' && obj != null) {
if(obj.computers != 'undefined' && obj.computers != null)) {
.....
Run Code Online (Sandbox Code Playgroud)
如您所见,如果我需要查看是否obj.computers.favorite
已设置,我必须在那里嵌套一些条件逻辑.我们的一些物体深入3,4,5级.
这是我希望能够做到的:
var fav = obj.computers.favorite || 'Unknown';
Run Code Online (Sandbox Code Playgroud)
但我意识到我需要用某种方法包装它.就像是:
var fav = getValueOrDefault(obj.computers.favorite, 'Unknown');
Run Code Online (Sandbox Code Playgroud)
建议表示赞赏.
谢谢
编辑
我检查'undefined'实际上并不是我使用的.在提出这个问题时,我只是想到了.大声笑
但我想知道,如果异常,我可以在try/catch中包装并抛出默认值吗?
function(obj, default) {
try {
if(obj != null) {
return obj;
} else {
return default;
}
} catch(ex) {
return default;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,感谢Shusi指出冗余的变量.
我想要的是
我正在尝试使用typeof来检查数组元素是否存在.原因是为了防止Cannot read property '0' of null
错误.但是,只是尝试检查元素是否存在会导致错误.
我试过的
if (typeof foo[0] !== 'undefined')
{
// I want to get here
}
Run Code Online (Sandbox Code Playgroud)
和
if (typeof(foo[0]) !== 'undefined')
{
// I want to get here
}
Run Code Online (Sandbox Code Playgroud)
这是循环的一部分,前四次迭代起作用,第五次迭代不起作用,第六次假设起作用.但是,它在第五个循环中失败了.我不能写一个异常,因为输入可以改变循环的哪些迭代假设起作用,哪些不能起作用.
我相信这是正确的方法,我不应该根据这些stackoverflow答案接收这种行为.
我认为关键是你可以在尝试使用它之前检查元素是否已设置并自行抛出错误.其他用户似乎可以使用完成此操作.我猜我在做一些与众不同的事情.如何在不使脚本失败的情况下检查是否设置了数组索引,因为我正在查看未设置的数组索引.
更多背景下的代码
不应该需要,但只是想要.
for (templ_i=0; templ_i<number_of_fields; templ_i++)
{
// Font size
if (d['font_size_group'][templ_i]['font_size'])
{
size_re = new RegExp('"text_' + line + '" font-size="\\d+(\\.[0-9]+)?"', 'g');
current_line = svg_template.match(size_re);
size_re = new RegExp('[^_"]\\d+(\\.[0-9]+)?', 'g');
if (typeof current_line[0] !== 'undefined') …
Run Code Online (Sandbox Code Playgroud)