【问题标题】:php isset() equivalent in javascriptphp isset() 等价于 javascript
【发布时间】:2011-07-23 03:47:48
【问题描述】:

我正在寻找 php 函数 isset() 的 javascript 等效项。我已经尝试过JavaScript isset() equivalent 此处描述的方法,但在萤火虫中,出现错误提示

data.del is undefined                          //Firebug warning/error
 if(typeof data.del[0].node != 'undefined') { // codes in my js file

在某些情况下

data is null                                  //Firebug warning/error
  if(typeof data.storyLine != 'undefined') { // codes in my js file

逻辑似乎有效,但我想知道为什么会出现错误??

基本上,我想检查data.del[0].nodedata.storyLine isset 与否??

【问题讨论】:

  • 或者你可以使用hasOwnProperty
  • 请详细说明什么条件会为isset() 返回true 的结果,具体为:NaNundefined
  • @zzzzBov,这只是我做一个 msql 查询,如果有数据,我会使用数组的 json_encode 返回它们。如果数据不存在,则什么都不返回。
  • 然后使用data.hasOwnProperty('foo');
  • @Jared Farrish,我清楚地记得看过lecture given by Douglas Crockford 提到了一些关于in 的问题,但我相信这是在for...in 循环的上下文中。我相信in 会在大多数情况下工作,但我更确定hasOwnProperty 会按预期工作。

标签: javascript


【解决方案1】:

ECMAScript 定义了 hasOwnProperty 方法来检查对象是否具有给定名称的属性:

var foo = {'bar':'bar'}

alert( foo.hasOwnProperty( 'bar' ) ); //true
alert( foo.hasOwnProperty( 'baz' ) ); //false

编辑:这并不能完全回答您的问题

属性可以设置为undefined

foo.bar = undefined;

alert( foo.hasOwnProperty( 'bar' ) ); //still true

重要的问题是:你需要你的真值表是什么?

在php中:

type  | isset() | == true
------+---------+----------
null  | false   | false
false | true    | false
true  | true    | true
""    | true    | false
"a"   | true    | true
0     | true    | false
1     | true    | true

在 JS 中:

type      | isset() | truthy
----------+---------+--------
NaN       | ?       | false
undefined | ?       | false
null      | false   | false
true      | true    | true
false     | true    | false
""        | true    | false
"a"       | true    | true
0         | true    | false
1         | true    | true

【讨论】:

  • 只是在进行mysql_query 之后,如果我要查找的数据在数据库中,我会使用PHP 的json_encode() 函数返回数据。如果数据库中没有数据,则永远不会返回。所以我想检查数据是否确实来自数据库。如果我得到数据..我做的东西..如果我不做的东西..就是这样。
  • 它有效...我已经尝试过if(typeof data.node != 'undefined')if(data.node != 'undefined' && data.node != 'null')data.hasProperty('node').. 它们似乎都有效.. 但它们都在萤火​​虫中抛出了这个红色错误所以我只是担心并想知道它是否是幸运的!
  • @zzzzBov - 糟糕,抱歉,我移动了评论,因为我不知道你是否会看到它。这是一个我没有足够信心作为答案发布的测试,它使用 in: jsfiddle.net/ZRnda 注意:没有 Firebugz 错误! (FF 4,FB 1.7)
  • @ptamzz,我假设您在第二个示例中忘记了typeof。它们都是检查是否设置了属性的有效方法,它们之间的唯一区别是边缘情况。
  • @Jared Farrish,in 是 JS 中的有效操作,它不会抛出错误,只是在某些边缘情况下可能会出现意外行为。
【解决方案2】:

isset() 生成two checks:如果变量已定义,则为第一个,如果为空,则为第二个。

您必须同时检查“未定义”情况和空情况,例如:

if (typeof data !== 'undefined' && data !== null)

【讨论】:

    【解决方案3】:

    我认为最好的解决方案是查看php.js的源代码:

    function isset () {
        // !No description available for isset. @php.js developers: Please update the function summary text file.
        // 
        // version: 1103.1210
        // discuss at: http://phpjs.org/functions/isset
        // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +   improved by: FremyCompany
        // +   improved by: Onno Marsman
        // +   improved by: Rafał Kukawski
        // *     example 1: isset( undefined, true);
        // *     returns 1: false
        // *     example 2: isset( 'Kevin van Zonneveld' );
        // *     returns 2: true
        var a = arguments,
            l = a.length,
            i = 0,
            undef;
    
        if (l === 0) {
            throw new Error('Empty isset');
        }
    
        while (i !== l) {
            if (a[i] === undef || a[i] === null) {
                return false;
            }
            i++;
        }
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2015-02-10
      • 2020-07-27
      相关资源
      最近更新 更多