标签:操作符 问题 ret 全局变量 name const var 修改 sorry
函数传参和默认参数的区别,传参如果传的是引用地址,则会对这个引用产生影响,但是如果是默认参数,则是创建了一个新对象,对原引用没有影响。
const person = { name: "Lydia", age: 21 } const changeAge = (x = { ...person }) => x.age += 1 const changeAgeAndName = (x = { ...person }) => { x.age += 1 x.name = "Sarah" } changeAge(person) changeAgeAndName() console.log(person)
result: name:‘Lydia‘, age:22
拓展运算符的熟悉程度,只有C选项是将数组变为了三个元素,其余选项均为一个数组
function sumValues(x, y, z) { return x + y + z; }
sumValues(...[1, 2, 3])
可选连操作符(?.)
作用是如果该操作符前面的属性对象存在,则打印该属性对应的内容,如果不存在则返回undefined
const person = { firstName: "Lydia", lastName: "Hallie", pet: { name: "Mara", breed: "Dutch Tulip Hound" }, getFullName() { return `${this.firstName} ${this.lastName}`; } }; console.log(person.pet?.name); console.log(person.pet?.family?.name); console.log(person.getFullName?.()); console.log(member.getLastName?.());
result:Mara undefined Lydia Hallie ReferenceError
indexOf返回的下标
const groceries = ["banana", "apple", "peanuts"]; if (groceries.indexOf("banana")) { console.log("We have to buy bananas!"); } else { console.log(`We don‘t have to buy bananas!`); }
result:We don‘t have to buy bananas!
indexOf返回的下标是0,这是一个假值,所以触发了else.
setter的认识
const config = { languages: [], set language(lang) { return this.languages.push(lang); } }; console.log(config.language);
修改对象的属性,如果调用的话返回的是undefined。
这个方法存在的意义是修改对象的属性,如果调用的话返回的是undefined。
对象的解构赋值
const myFunc = ({ x, y, z }) => {
console.log(x, y, z);
};
myFunc(1, 2, 3);
result:undefined undefined undefined
传入的应该是一个拥有x y z三个属性的对象,但是题目并未传入一个对象,所以打印的是3个undefined.
function sayHi(name) { return `Hi there, ${name}` } console.log(sayHi())
由于模板字符串中没有接收到name,所以返回的是undefined.
const person = { name: "Lydia", age: 21 } let city = person.city city = "Amsterdam" console.log(person)
仔细想想并未对person对象添加任何属性
function checkAge(age) { if (age < 18) { const message = "Sorry, you‘re too young." } else { const message = "Yay! You‘re old enough!" } return message } console.log(checkAge(21))
result:挺坑的,意在考查const、let引起的块级作用域,由于块级作用域的存在,我们无法在块级作用域之外访问到声明的变量,请记住这个题。
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1) } for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1) }
result:333 和 012,因为JS的事件循环机制,setTimeout属于宏任务,要等到同步代码执行完之后才能执行,var在此处定义的是全局变量,因此同步代码执行完之后i已经变成了3,所以打印3个3,
但是let定义的变量会形成一个块级作用域,因此是0 1 2
箭头函数作用域问题
const shape = { radius: 10, diameter() { return this.radius * 2 }, perimeter: () => 2 * Math.PI * this.radius } shape.diameter() shape.perimeter()
result:20和NaN,因为diameter中的this指的是shape中的radius,但是perimeter由于是箭头函数所以,当我们调用 perimeter 时,this 不是指向 shape 对象,而是它的周围作用域(在例子中是 window)。
2021-06-16 11:22:46
标签:操作符 问题 ret 全局变量 name const var 修改 sorry
原文地址:https://www.cnblogs.com/zhenggc99/p/14888672.html