JS中“==”运算符研究

    技术2022-05-11  14

    看到这个标题,也许你觉得没什么可研究的。下面我们给出具体的测试方法。首先我们看看在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/


    最新回复(0)