(a ==1 && a== 2 && a==3) 怎样才能为true?

JavaScript奇技淫巧

一个有趣的问题:

在 JavaScript 中, (a ==1 && a== 2 && a==3) 是否有可能为 true ?      

解法一:利用松散相等运算符 == 的工作原理

你可以简单地创建一个带有自定义toString( 或者 valueOf)函数的对象,在每一次使用它时候改变它所的返回值,使其满足所有三个条件。

const a = {

  i: 1,

  toString: function () {

    return a.i++;

  }

}

if(a == 1 && a == 2 && a == 3) {

  console.log('Hello World!');

}

// Hello World!

之所以会得到如此结果,是由于表达式中使用了松散相等的运算符 ==。使用松散相等时,如果其中一个操作数与另一个类型不同,则 JS 引擎将尝试将一个操作转换为另一个类型。在左边对象、右边的数字的情况下,它会尝试将对象转换为一个数,首先通过调用 valueOf 如果是可调用的。否则,它会调用toString方法。如果我不从toString返回一个字符串(而是返回数字),JS 引擎会尝试将字符串转换为一个数字,虽然有一个稍长的路径,但它仍然会给我们同样的结果。

解法二:利用Object.defineProperty  方法:

var val = 0;

Object.defineProperty(window, 'a', {

  get: function() {

    return ++val;

  }

});

if (a == 1 && a == 2 && a == 3) {

  console.log('yay');

}

使用一个get,让 a 的返回值为三个不同的值。然而这并不意味着我们应该在真正的代码中使用。。。

。 

总结:

1. 利用松散相等运算符 == 的原理,自定义 toString 和 valueOf 返回对应值

2. 劫持 JS 对象的 getter,不过这种方式对于严格相等 === 同样有效

### C++ 中复合赋值与逻辑运算表达式的含义 在 C++ 中,`res &= x == a && y == b` 是一种典型的复合赋值与逻辑运算相结合的表达式。以下是对其解析和运算顺序的具体分析: #### 1. **复合赋值运算符 `&=`** 复合赋值运算符是一种简化写法,表示先执行某种二元操作再将结果赋值给左操作数。具体到这里的 `&=`, 它的作用可以分解为以下两步[^1]: ```cpp res = res & (x == a && y == b); ``` 这意味着 `res` 将被更新为其当前值按位与 (`&`) 新计算得到的布尔值 `(x == a && y == b)`。 --- #### 2. **逻辑比较运算符 `==` 和 `&&`** - **`x == a`**: 这是一个相等性判断,如果变量 `x` 的值等于常量或另一个变量 `a` 的值,则返回布尔值 `true` 或 `false`。 - **`y == b`**: 同理,这是另一个相等性判断,用于验证变量 `y` 是否等于 `b`。 - **`&&`**: 逻辑与运算符会依次评估两个子表达式的结果。只有当两侧都为真时,整个表达式才返回 `true`。否则返回 `false`。注意,在 C++ 中,短路求值机制意味着如果左侧已经为假,则右侧不会被执行[^2]。 因此,`(x == a && y == b)` 整体上代表了一个条件组合:即同时满足 `x == a` 和 `y == b` 才能成立。 --- #### 3. **整体优先级与运算顺序** C++ 中不同运算符具有不同的优先级。按照优先级从高到低排列如下: 1. `()` 圆括号内的表达式总是最先计算; 2. `==` 相等性比较次之; 3. `&&` 逻辑与再次之后; 4. `&=` 复合赋值最低。 基于此规则,上述表达式的实际运行过程如下: - 首先分别计算 `x == a` 和 `y == b`; - 接着通过 `&&` 对这两个布尔值进行逻辑与运算; - 最终利用 `&=` 把该布尔结果应用至原变量 `res`. 需要注意的是,虽然这里涉及到了布尔型数据,但在某些编译器环境下可能会自动将其转化为整数值(如 true 转化成 1, false 成 0),以便参与后续的按位操作. --- #### 示例代码展示 下面给出一段完整的演示代码来帮助理解这一复杂语句的行为: ```cpp #include <iostream> using namespace std; int main(){ bool res = true; int x = 5, a = 5, y = 8, b = 8; cout << "Before: res=" << res << endl; res &= x == a && y == b; // Equivalent to : res = res & ((x == a) && (y == b)) cout << "After: res=" << res << endl; } ``` 假设初始状态 `res=true`, 并且各参数均匹配成功(`x=a,y=b`), 则最终输出应显示仍保持为 `true`. 若任一部分失败则变为 `false`. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值