JS中“==”运算符研究

看到这个标题,也许你觉得没什么可研究的。下面我们给出具体的测试方法。首先我们看看在ECMA-262中对“==”运算符是怎么定义和执行的:
11.9.1 The Equals Operator ( == )
The production EqualityExpression : EqualityExpression == RelationalExpression is evaluated as
follows:
1. Evaluate EqualityExpression.
2. Call GetValue(Result(1)).
3. Evaluate RelationalExpression.
4. Call GetValue(Result(3)).
5. Perform the comparison Result(4) == Result(2). (see 11.9.3).
6. Return Result(5).

下面我们做一些具体的测试:

 

一:

var str1 = ‘welefen’;//字符串值

var str2 = ‘welefen’;//字符串值

/** 结果为true **/

 

二:

var str1 = ‘welefen’;//字符串值
var str2 = new String(’welefen’);//字符串对象,但他们却是相等的。
/* 猜测:比较时如果发现有一边是值形式,则将另一边执行toString方法,然后在进行比较。结果为true */

 

三:

var str1 = new String(’welefen’);//字符串对象
var str2 = new String(’welefen’);//字符串对象
/** 由于都是字符串对象,所以比较内存地址是否相同,所以结果是false **/

/**
以上对字符串进行了测试,对于第二个可能你还会费解,其实也不难理解
对于 ‘test’+1,此时会将数字1强制转换成’1′在进行连接。
**/

 

四:

var obj1 = ‘welefen’; //字符串值
var obj2 = ['welefen'];//数组对象
/**由于一个是值形式,一个是对象形式,所以强制将对象形式转换成值形式,在进行比较。结果为true */

 

五:

var obj1 = ‘welefen,suredy’;
var obj2 = ['welefen','suredy'];
/** 解释同上,数组的toString方法默认是将各个元素用逗号隔开。结果为true */

 

六:

var obj1 = new String(’welefen’);
var obj2 = ['welefen'];
/** 两个都是对象,所以不会强制转换。结果为false **/
/** 对于number和boolean类型同上 **/

 

该文章转自:http://www.welefen.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值