【问题标题】:Difference between if(x) and if(x==true) in a reactjs componentreactjs组件中if(x)和if(x==true)的区别
【发布时间】:2022-01-23 08:21:04
【问题描述】:

我在下面写ReactJs代码的时候,第一次使用if(this.state.username==true),并没有得到我期望的结果。 但是当我使用if(this.state.username) 时,它可以按我的需要工作。因此,我可以明显看到if(x==true)if(x) 之间存在差异。我也知道,有时,它们可能意味着相同并产生相同的结果。 我的问题是,如果我的构造函数设置如下,为什么这两个表达式的行为会有所不同。这里if(this.state.username)的真正含义是什么? 感谢您帮助我理解。

  constructor(props){
    super(props)
    this.state = {username:""}
  }

两个代码如下:

class MyForm extends React.Component {
  constructor(props){
    super(props)
    this.state = {username:""}
  }
  changeName = (e) =>{
    let target = e.target;
    let name   = target.name; 
      let value  = target.value;
    this.setState ({[name]: value});
  }
  render(){
    let myHeader;
    if(this.state.username==true){
        myHeader = <h1>Hello {this.state.username}</h1>;
    }else{
        myHeader = "";
    }
    return (
      <form>
        {myHeader}
        <h1>{this.state.username}</h1>
        <p>Enter your name:</p>
        <input
          name='username'
          type="text"
          onChange = {this.changeName}
        />
      </form>
    );
  }
}   
ReactDOM.render(<MyForm />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>


<div id="root"></div>

class MyForm extends React.Component {
  constructor(props){
    super(props)
    this.state = {username:""}
  }
  changeName = (e) =>{
    let target = e.target;
    let name   = target.name; 
      let value  = target.value;
    this.setState ({[name]: value});
  }
  render(){
    let myHeader;
    if(this.state.username){
        myHeader = <h1>Hello {this.state.username}</h1>;
    }else{
        myHeader = "";
    }
    return (
      <form>
        {myHeader}
        <h1>{this.state.username}</h1>
        <p>Enter your name:</p>
        <input
          name='username'
          type="text"
          onChange = {this.changeName}
        />
      </form>
    );
  }
}   
ReactDOM.render(<MyForm />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>


<div id="root"></div>

【问题讨论】:

  • 在您的问题中,您首先提到=== 运算符,然后是==。到底是哪一个?
  • 这是一个错字。我的意思是 == 而不是 ===。感谢您缓存它。我更正了。
  • 首先,this.state.username 是一个字符串,而不是一个布尔。所以你不应该将它与true 进行比较。其次,如果你只输入if(x),它会检查x 是否真实。你应该知道真假,因为它们会出现很多:sitepoint.com/javascript-truthy-falsy

标签: javascript html reactjs


【解决方案1】:

如果expr"truthy",则if (expr) 将被视为true

如果&lt;str&gt; 等于'1',则'&lt;str&gt;' == true 表达式将被视为true

在你的情况下,这样做可能更有意义

if (this.state.username !== '') {

参考资料:

【讨论】:

  • 在这种情况下我们如何应用它?
  • @ITselect 你是什么意思?
  • @ITselect—在 IsLooselyEqual 算法的第 10 步是 如果 Type(y) 是布尔值,则返回 IsLooselyEqual(x, !ToNumber(y))。,其中 ToNumber(true) 返回 1。因此评估现在是 &lt;str&gt; == 1,这是第 6 步:如果 Type(x) 是 String 并且 Type(y) … 等等
  • 哦,另一个 ECMA-262 使用术语 Abstract Equality Comparison 而不是 IsLooselyEqual,但它们是同一个东西。
  • @RobG 可能是 ES2021 与 ES2022 的变化?
【解决方案2】:

使用if(this.state.username==true)if(this.state.username) 是有区别的。使用前者将this.state.username 的值与true 进行比较,这当然是假的,除非它返回一个字符串值1,在这种情况下它将返回true
但是,执行后者会将this.state.username 转换为布尔值并检查this.state.username 是否有值(比如不是undefined)。
所以如果你想使用if(this.state.username==true),你必须首先使用!!(或Boolean)将this.state.username转换为布尔值:

if(!!this.state.username==true) {
  // your code goes here
}

【讨论】:

  • 前者将this.state.username的值与true进行比较,当然是false”的说法是错误的。如果 this.state.username 返回字符串值“1”,则表达式解析为 true
  • @RobG 感谢您指出这一点。我对其进行了编辑以使其更准确:D
【解决方案3】:

哈哈,太好笑了。我已经用所有真假都试过了。让我们看看结果:

console.log('Truthies:')
console.log('"a" == true           returns:', "a" == true)
console.log('"1" == true           returns:', "1" == true)
console.log('1 == true             returns:', 1 == true)
console.log('3 == true             returns:', 3 == true)
console.log('-1 == true            returns:', -1 == true)
console.log('[] == true            returns:', [] == true)
console.log('{} == true            returns:', {} == true)
console.log('function a(){return true} == true    returns:', function
a(){return true} == true)
console.log('"true" == true        returns:', "true" == true)

console.log('')
console.log('Falsies:')
console.log('NaN == false          returns:', NaN == false)
console.log('"" == false           returns:', "" == false)
console.log('`` == false           returns:', `` == false)
console.log('0 == false            returns:', 0 == false)
console.log('undefined == false    returns:', undefined == false)
console.log('null == false         returns:', null == false)


console.log('')
console.log('Truthies not-equal false:')
console.log('"a" !== false           returns:', "a" !== false)
console.log('1 !== false             returns:', 1 !== false)
console.log('"1" !== false           returns:', "1" !== false)
console.log('3 !== false             returns:', 3 !== false)
console.log('-1 !== false            returns:', -1 !== false)
console.log('[] !== false            returns:', [] !== false)
console.log('{} !== false            returns:', {} !== false)
console.log('function a(){return true} !== false     returns:', function
a(){return true} !== false)
console.log('"true" !== false         returns:', "true" !== false)

console.log('')
console.log('Truthies not-equal true:')
console.log('"a" !== true           returns:', "a" !== true)
console.log('1 !== true             returns:', 1 !== true)
console.log('"1" !== true           returns:', "1" !== true)
console.log('3 !== true             returns:', 3 !== true)
console.log('-1 !== true            returns:', -1 !== true)
console.log('[] !== true            returns:', [] !== true)
console.log('{} !== true            returns:', {} !== true)
console.log('function a(){return true} !== true     returns:', function
a(){return true} !== false)
console.log('"true" !== true         returns:', "true" !== true)

有一些棘手的事情。例如。 1 == true1 !== true 都是 true ?。

无论如何...为了安全起见,您最好使用!!

const { useState } = React

const MyForm = () => {
  const [state, setState] = useState({ username: '' })

  const handleChange = ({ target: { name, value } }) => {
    setState({ [name]: value })
  }
  
  return (
    <form>
      {!!state.username && (
        <h1>Hello {state.username}</h1>
      )}
      <p>Enter your name:</p>
      <input
        name="username"
        type="text"
        onChange={handleChange}
      />
    </form>
  )
}

ReactDOM.render(<MyForm />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>


<div id="root"></div>

为了简单起见,您可以使用钩子、函数式组件、内联 jsx 运算符和解构。

【讨论】:

    【解决方案4】:

    数据类型username不是布尔值而是字符串,字符串验证使用!== ''

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2016-04-22
      相关资源
      最近更新 更多