红宝书问题汇总

吐槽君 分类:javascript

希望有有缘人回答

字符串

自定义标签函数

例 1:(摘自《JavaScript 高级程序设计》第四版 P43)

let a = 6;
let b = 9;
function zipTag(strings, ...expressions) {
  return (
    strings[0] + expressions.map((e, i) => `${e}${strings[i + 1]}`).join("")
  );
}
let taggedResult = zipTag`${a} + ${b} = ${a + b}`;
console.log(taggedResult); // "6 + 9 = 15"
 

strings 的值是[ '', ' + ', ' = ', '' ]。
strings[0]是空值。

例 2:

let a = 6;
let b = 9;
function zipTag(strings, ...expressions) {
  return strings[0];
}

let taggedResult = zipTag`${a} + ${b} = ${a + b}`;
console.log(taggedResult); // 什么都没有
 

那么例 1 中,添加 strings[0]的意义在哪里?

对象

Object.defineProperties()问题

let book = {};
Object.defineProperties(book, {
  year_: {
    value: 2017,
  },
  edition: {
    value: 1,
  },
  year: {
    get: function () {
      return this.year_;
    },
    set: function (newValue) {
      if (newValue > 2017) {
        this.year_ = newValue;
        this.edition += newValue - 2017;
      }
    },
  },
});

console.log(book.edition); // 1
console.log(book); // {}
 

为何添加属性后的 book 为{}?

两种添加属性的方法是否等价?

let person = {
  name: "Klaus",
};
console.log(person);
 
let person = {};
Object.defineProperties(person, {
  name: {
    value: "Klaus",
  },
});
console.log(person);
 

两种设置函数的定义方式是否等价?

dest = {
  set a(val) {
    console.log(`Invoked dest setter with param ${val}`);
  },
};

console.log(dest);
 
dest2 = {};
Object.defineProperties(dest2, {
  a: {
    set(val) {
      console.log(`Invoked dest setter with param ${val}`);
    },
  },
});

console.log(dest2);
 

回复

我来回复
  • 暂无回复内容