在这些例子中,我正在破坏一个有条件的函数;
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
答案 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 )
,所有这些都可以很容易地简化为“定价”
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
进行此比较,看看price
是undefined
并且类型为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> 严格平等 比较。但是,如果其中一个操作数为null
或undefined
,则当且仅当另一个操作数为null
或undefined
时才进行比较。
因此,简而言之,==
等式运算符被许多人视为不安全。要查看差异结帐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