函数中未定义或null变量

时间:2014-08-16 19:22:10

标签: javascript jquery

在这些例子中,我正在破坏一个有条件的函数;

function validPrice(price)
{
    if(price=="" || price==0 || price==null || price==undefined )
    { 
        //do something
    }
    else
    {
        // do something different
    }
}
var priceNew = $("li#listedProd").attr("price"); 

validPrice(priceNew);

我的问题是这些条件price=="" || price==0 || price==null || price==undefined

的不同之处

3 个答案:

答案 0 :(得分:4)

无论谁首先写下该代码都是

a)对未来的使用非常防守。 b)不明白attr的工作原理。

方法attr(或getAttribute的基础调用将返回

  • 找到属性的字符串值
  • null,如果不是。

重要的是,如果有0值,那么它将是字符串 0,因此不会在下面的测试中被捕获 - 遇到price == 0测试,因为系统会自动将其转换为==比较的一部分。

if(price=="" || price==0 || price==null || price==undefined )

而且,由于转换在内部工作的方式,这些测试不能按预期工作。 =====不同。它应该是:

if(price === "" || price === 0 || price === null || price === undefined )

由于如何coercion to boolean work

,所有这些都可以很容易地简化为“定价”
if (!price) 

或者,如果您想捕获"0"

if (!price || +price === 0)

(+价格迫使价格成为一个数字,因此我们会抓住0 0.00和其他变体。)

答案 1 :(得分:3)

让我们逐个看看你的条件陈述:

price == ""

如果price为空字符串,则为true,否则为false

price == 0

如果price是整数true,字符串0或空字符串,则为"0",否则为false。如果您希望在price === 0为整数price时捕获,则应将此比较更改为0

price == null

如果价格传递给您的函数并且类型为true,则为null,否则为false。

price == undefined

注意:您应该通过price === undefined进行此比较,看看priceundefined并且类型为undefined

如果价格未传递给您的函数,或者价格为true,则为undefined,否则为false

我建议只制作整个条件语句!price

function validPrice(price) {
    if (!price) { 
        //do something
    }
    else {
        // do something different
    }
};

var priceNew = $("li#listedProd").attr("price"); 

validPrice(priceNew);

答案 2 :(得分:0)

EDIT添加了定义

JavaScript有两个运算符可以测试相等性(相反,有两个运算符可以测试不等式。)

  • 严格相等 比较(例如===)仅在操作数为相同类型<时才为真strong> AND 如果对象实际上是同一个对象,或者基元具有相同的值(例如,0 === 0,并且&#39; a&#39; ===&#39; a&# 39;都是真的。 *请注意,此规则对NaN略有例外(见下文)

  • 抽象相等 比较(例如==)在制作<之前将操作数转换为相同的类型(如果它们已经不是) strong> 严格平等 比较。但是,如果其中一个操作数为nullundefined,则当且仅当另一个操作数为nullundefined时才进行比较。

因此,简而言之,==等式运算符被许多人视为不安全。要查看差异结帐http://dorey.github.io/JavaScript-Equality-Table/

例如'' ==0, '', [], false, [[]]

0 ==false, 0, '0', '', [], [[]], [0]

null ==null, undefined

最后undefined ==null, undefined

最好使用严格相等===或仅测试假名值('', 0, undefined, null, false

if (!price) { //do something }

下面我提供了有关严格与抽象平等比较的更多细节

细节来自ECMA-262,第5版11.9.1 严格平等算法摘要

1. If typeof(x) is different from typeof(y), return false.
2. If typeof(x) is undefined, return true.
3. If x is null, return true.
4. If typeof(x) is number, then
    a. If x is NaN, return false.
    b. If y is NaN, return false.
    c. If x is the same Number value as y, return true.
    d. If x is +0 and y is -0, return true.
    e. If x is -0 and y is +0, return true.
    f. Return false.
5. If typeof(x) is string, then
    a. If x and y are exactly the same sequence of characters (same length and same characters in
corresponding positions), return true.
    b. Else, return false.
6. If typeof(x) is boolean, then
    a. If x and y are both true or both false, return true.
    b. Else, return false.
7. If x and y are the same Object value, return true.
8. Return false.

而且......细节来自ECMA-262,第5版11.9.1 抽象等式算法摘要

1. If typeof(x) is the same as typeof(y), then
    return the result of performing strict equality comparison algorithm x === y.
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
4. If typeof(x) is number and typeof(y) is string,
    return the result of the comparison x == Number(y).
5. If typeof(x) is string and typeof(y) is number,
    return the result of the comparison Number(x) == y.
6. If typeof(x) is boolean, return the result of the comparison Number(x) == y.
7. If typeof(y) is boolean, return the result of the comparison x == Number(y).
8. If typeof(x) is either string or number and typeof(y) is object,
    return the result of the comparison x == [[ToPrimitive]](y).
9. If typeof(x) is object and typeof(y) is either string or number,
    return the result of the comparison [[ToPrimitive]](x) == y.
10. Return false.

[[ToPrimitive]] is an internal function call

子弹8和9基本上意味着对象的转换类似于object.valueOf()。toString()所以:

{} == '[Object object]' { hi: 'hi'} == '[Object object]' { valueOf: function(){ return 0; }} == 0 { toString: function(){ return 'hi'; }} == 'hi' { valueOf: function(){ return 0; }, toString: function(){ return 'hi'; }} == 0

Full ecma-262/5.1/#sec-11.9 spec