2016-11-08 111 views
2

我正在做一些JavaScript比较。我复制像这样的代码:数组是否有一个元素等于元素?

if (input.val() != input.data('original')) 
    //do stuff 

我希望我将不得不改变一些东西,因为在这种情况下input<select multiple>与限制为1可选择的选项号码,但工作没有变化。

我检查,事实证明:

13 == [13] //true 
13 === [13] //false 

我没想到的是,比较会解开的阵列。

这是我可以使用和依赖的JavaScript中的一个预期和记录的功能吗?或者这只对我有用,因为一些浏览器开发人员决定使其工作?

+1

见规格的''==。这是你应该总是使用'==='代替的许多原因之一。 – SLaks

+0

parseInt(13,10)=== 13'对于'+ [13]'是相同的,所以强制该数组返回'13',并且比较非严格的类型强制 – adeneo

+0

@SLaks我不能找到它,'=='不是最可以googleable的字符串。谷歌搜索'JavaScript比较'我找不到明确说明这种行为的资源。 –

回答

2

loose equality (==)用于比较ObjectNumber

它试图其对象参数转换为原始值,通过尝试>调用A.toString和A的变化的序列上的一个

的valueOf方法,这样你实际上这样做,得到:

13 == [13] 

是:

13 == ([13].toString().valueOf()) 
0

这就是javascript的工作原理。 5 == '5' == true。 5 == [5]也是如此。

看看这些例子。 http://www.w3schools.com/js/js_comparisons.asp \

在进行任何必要的类型转换之后,==运算符将进行比较以获得相等性。 ===运算符不会执行转换,所以如果两个值不是相同的类型===将简单地返回false。

==都将值转换为同样的类型,然后更在这里使用相同的比较,因为=== 阅读关于如何==改建工程和图表。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

+0

我没有看到任何关于'[5]'或您链接的资源中的转换。 –

+0

@Juris我连接到例子。我解释了如何在链接之后使用'=='进行类型转换。 –

+0

如何选择“必要”转换以及在不同情况下选择哪种转换?你知道这是否记录在任何地方? –

3

不,这取决于,如果元素是一个字符串或不是。

带有一个元素的结果是toString方法的结果,它看起来像一个元素与元素相等。但结果总是一个字符串,而该值可能不是一个字符串。

与阵列

array toString value 
------- -------------- 
    [1]    '1' 
[1, 2]   '1,2' 

为评价顺序例如,您可能看一下标准ECMA 262 Version 5.1

Equality == (MDN)

等于运算符转换,如果操作数他们不是山姆的e型,然后进行严格比较。如果这两个操作数都是对象,那么当操作数引用内存中的同一对象时,JavaScript会比较内部引用相等。

+0

那么'=='每次都使用'toString'吗?或者在某些特定情况下? –

+0

不,命令是检查是否可以进行严格比较,然后检查'toString'方法的值。 –

相关问题