【问题标题】:have return statement and return nothing有return语句并且什么都不返回
【发布时间】:2020-07-27 20:45:57
【问题描述】:

我是 react(javascript) 的初学者,正在做 todo 应用程序,有一个与在 if 语句中返回但不返回任何内容相关的问题(如果用户什么都不写并按 Enter 则不算数),但是当我采取它离开它会影响 todo 应用程序的行为。我的问题是这部分代码是什么意思 if (!value) { return }
如果没有价值,它将返回什么?为什么拿走“回报”会改变 todo 应用程序的行为? 这是代码:

import React, { useState } from 'react';
import './App.css';

function Todo({ tod, index }) {
  return <div className="todo">{tod.text}</div>
}
function TodoForm({ addTodo }) {
  const [value, setValue] = useState('');
  console.log(value)

  const handleSubmit = e => {
    e.preventDefault();
    if (!value) {
      return
    }
    addTodo(value);
    setValue('');

  }

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        className="input"
        value={value}
        placeholder="Add Todo..."
        onChange={e => setValue(e.target.value)}

      />

    </form>
  )
}

function App() {
  const [todos, setTodos] = useState([
    {
      text: ' Learn by doing',
      isCompleted: false
    }
  ]);

  const addTodo = text => {
    const newTodos = [...todos, { text }];
    setTodos(newTodos);
  }

  return (
    <div className="app">
      <div className="todo-List">
        {todos.map((todo, index) =>
          <Todo key={index} index={index} tod={todo} />
        )}
        <TodoForm addTodo={addTodo} />
      </div>
    </div>
  )

}
export default App;

这里我有 javascript 代码,我试图使用与上面代码相​​同的语句 (if(!text){ return }) 在这里,我是否有“返回”都没有关系,两种方式都是一样的(为什么在前面的例子中它是不同的?) :

function myFunction(text) {
var text=document.getElementById('text').value

event.preventDefault();
console.log(text);

if(!text){
return 
}
else{
document.getElementById('demo').innerHTML = "Text typed: "+text; // if nothing
}}
<form onsubmit="myFunction()">
<input  type="text" id="text" >
</form>

<p id="demo"></p>

英语不是我的母语,如有错误请见谅。

【问题讨论】:

  • 为什么我的投票被否决了?我有代码和问题,并与同类其他代码进行了比较
  • 看起来这些反对票已被清除 - 可能是误会。
  • 反对票没有被“清理”;有两个人投了赞成票。见When is it justifiable to downvote a question?。对return 语句的少量研究将告诉您如果未指定值,将返回什么。投反对票的原因之一是“这个问题没有显示任何研究工作......”此外,您的两段代码并不相同;一种用途是if 块中没有elsereturn,另一种用途是else,这会改变流程。
  • 但这只是我的猜测;我不知道,投票是匿名的。
  • @HereticMonkey 我也试过没有 else 也没有写任何东西,只是按 enter 并从控制台检查它的工作,但是当我不写任何东西并按 enter 时,使用第一个代码(反应),控制台中没有任何显示

标签: javascript html reactjs function if-statement


【解决方案1】:

在此处复制有问题的代码:

const handleSubmit = e => {
    e.preventDefault();
    if (!value) {
      return
    }
    addTodo(value);
    setValue('');

  }

这被视为null 检查。您在该函数内部所说的实际上是“如果此变量为真,则不要继续执行该函数的其余部分并以未定义的形式返回”。如果您的 value 变量等于 Javascript 中的 null or undefined 值(附加链接转到关于 null 和 undefined 之间差异的 SO 答案),那么您的 !运算符将再次为 if 语句返回 true(如上所述)不运行函数的其余部分并返回 undefined。

在此处查看此代码笔,如果您在 true 和 false 之间切换变量“shouldRun”,您将在返回后获得控制台日志,或者返回未定义:https://codepen.io/kjscott27/pen/wvMbKJb?editors=1111

编辑:我觉得有必要为 null 和 undefined 之间的差异添加额外的来源。此外,此资源直接从 ECMA 脚本和进一步阅读中对这两个术语的定义提供了答案,here in this other SO answer

【讨论】:

  • "如果此变量为真,则不要继续执行函数的其余部分并返回未定义",但它仍在继续执行其余部分,addTodo(value); setValue('');
  • 您在此处检查该变量的倒数,这是有道理的,因为如果 value 为 true,则意味着它具有分配给它的值。如果 value 为空(或 false),则对 value 的反向检查将返回 true,并且您的函数将不会运行。我建议阅读什么是空检查(正如我在回答中提到的那样)。这里还有一个来自 SO 内部的关于一些 null checking in Javascript 的额外答案
【解决方案2】:

添加到 kjs0 的答案中,

在 Javascript 中,不返回任何值将是 undefined。示例:

function myFunc() {
  return;
}

myFunc() // the returned value is undefined

【讨论】:

  • 所以在 javascript 中不返回值和在 reactjs 中不返回值是不同的?
  • ReactJs 是一个 JavaScript 库。在这两个空间中,您的返回值都是undefined。请注意,这与return null 不同
  • 那么为什么在我的第一个代码中删除'return'很重要,但在第二个代码中却没有?
  • 在你的代码中,如果你不离开函数(返回),它会继续执行addTodosetValue。在其他代码中,这不会发生,因为它被 else 语句转义
  • 不,如果我离开它,它将继续执行 addTodo 和 setValue,如果我不离开它并且用户按下回车,它将在待办事项列表中添加一个白色。