请问changeName方法return返回的值是一个对象,这个是什么语法


const p1 = {
    name:'lily',
    age:1,
    city:'北京'
}
function changeName(p){
    return{...p,name:'ford'}
}

想必题主不清楚三个点(...)代表着什么,在这里先介绍下:

  • 介绍:展开语法(叫做 扩展运算符),可以在函数调用/数组构造时,将数组表达式或者 string 在语法层面展开,还可以在构造字面量(字面量一般指 [1, 2, 3]或者 { name: 'rendong' } 这种简洁的构造方式)对象时,将对象表达式按 key-value 的方式展开(简洁些说,可用于将集合和数组中的元素扩展为单个单独的元素)。由三个点(...)表示,在ES6中引入,在 chrome 46 版本中开始支持

  • 作用:扩展运算符可用于创建和克隆数组和对象、将数组作为函数参数传递、从数组中删除重复项等等

  • 语法:扩展运算符只能用于可迭代对象,他必须在可第二代对象之前使用,没有任何分隔,例如:console.log(...arr)

使用场景

  • 找到数字数组中的最小值
    let arr = [10, 4, 6];
    Math.min(...arr); // 4
    
  • 将现有数组克隆到一个新数组中,并且对新数组所做的任何修改都不会影响原数组,注意只能实现浅拷贝
    let arr = [1,2,3,4]
    let arr2 = [...arr]
    arr2.push(5);
    console.log(arr)  // [1, 2, 3, 4]
    console.log(arr2) // [1, 2, 3, 4, 5]
    
  • 将多个数组连接为一个数组
    let arr = [4, 5, 6]
    let arr2 = [1, 2, 3]
    let arr3 = [...arr, ...arr2] // [4, 5, 6, 1, 2, 3]
    
  • 还可以在字符串上使用扩展运算符来创建一个数组,每个项都是字符串中的一个字符
    let str = 'rendong'
    let arr = [...str]; // ['r', 'e', 'n', 'd', 'o', 'n', 'g']
    
  • 浅拷贝另一个对象
    let person = {
      name: '忍冬',
      age: 18
    }
    let obj = { ...person }; // {name: '忍冬', age: 18}
    
  • 将多个对象合并为一个,注意:若对象共享相同的属性名称,将使用最后一个对象对应的值
    let person = {
      name: '忍冬',
      age: 18
    }
    let person2 = {
      name: '连翘',
      site: 'beijing'
    }
    let person3 = { ...person, ...person2}; // {name: '连翘', age: 18, site: 'beijing'}
    
  • 从数组创建对象,其中数组中的索引成为对象属性,数组索引处的值成为对象属性的值
    let arr = ['忍', '冬']
    let obj = { ...arr }; // {0: '忍', 1: '冬'}
    
  • 从字符串创建对象,其中字符串中的索引成为对象属性,字符串索引处的字符成为对象属性的值
    let str = '忍冬'
    let obj = {0: '忍', 1: '冬'}
    
  • 将 NodeList 节点集合转换为数组
    let nodeList = document.querySelectorAll('div'); // NodeList [div, div]
    let arr = [ ...nodeList ]; // Array [div, div]
    
  • 从数组中删除重复项:使用 Set对象,Set 对象是一个仅存储唯一值的集合,可以使用扩展运算符删除数组中的重复项
    let arr = [ 10, 10, 12, 2 ];
    let arr2 = [...net Set(arr)]; // [10, 12, 2]
    
  • 剩余参数:剩余参数语法允许将一个不定数量的参数表示为一个数组
    let arr = [2,3,1,2]
    function fnSum(...aParam) {
      let sum = 0;
      aParam.forEach(v=> sum+=v);
      return sum;
    }
    fnSum(...arr); // 8
    

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax

这个很正常啊,任何东西都可以返回,这个是一个匿名字典或者说一个对象。

简单点说 就是一个结果 在方法里 你可以return出一个结果 这个结果可以是任何东西 比如你return一个对象
调用该方法 最后就会得到return的值

js是弱类型的编程语言
既然一个变量里可以保存任何类型,包括对象
那么一个函数的返回值当然也可以是任何类型,包括对象
这跟先把一个对象赋值给一个变量,然后返回这个变量,不是一回事吗

changeName方法返回一个对象字面量:

function changeName(name) {
  return {
    firstName: name.split(' ')[0],
    lastName: name.split(' ')[1]
  };
}

const person = changeName('John Doe');
console.log(person.firstName); // 输出:John
console.log(person.lastName); // 输出:Doe


在这个例子中,changeName方法接收一个名字字符串,然后将其拆分成姓和名,并返回一个包含firstName和lastName属性的对象字面量。
另外,如果你使用ES6的类来创建对象,可以在return语句中实例化一个类,例如:

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}

function changeName(name) {
  return new Person(name.split(' ')[0], name.split(' ')[1]);
}

const person = changeName('John Doe');
console.log(person.firstName); // 输出:John
console.log(person.lastName); // 输出:Doe


在这个例子中,changeName方法返回一个Person类的实例,该实例的firstName和lastName属性根据传入的名字字符串进行初始化。