25 Matching Annotations
  1. Apr 2024
    1. 如果一个对象字面量存在任何“目标类型”不包含的属性时,你会得到一个错误

      这有些麻烦

    1. 它们的名字是大小写不敏感的(id 与 ID 相同)。 它们的值总是字符串类型的

      其实也可以理解为dom对象有一个内置的map,每个特性都是入的这个map,而非直接成为对象的属性

  2. zh.javascript.info zh.javascript.info
    1. 标签内的文本也是一个对象

      举个例子:

      hello js

      这里p标签是一个元素节点,而hello js字符串其实也是个节点叫文本节点

    1. .then/catch/finally 处理程序就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。

      异步执行的,但js又是单线程,因此先执行完当前函数,才能再执行那些异步任务

    1. 我们可以将 class User 声明的结果解释为

      下面这个图很好

    1. 一些方法在原型上可能会发生重叠,例如,Array.prototype 有自己的 toString 方法来列举出来数组的所有元素并用逗号分隔每一个元素

      重写父类方法

    1. alert(user.fullName); // John Smith,user 的内容被保护了

      //JS中原型存在一个关键原则:写入时不使用原型,只有读取时才使用原型

      //写入操作(设置属性值)直接作用于源对象上,而读取操作(访问属性值)如果在源对象上找不到该属性,则会沿原型链向上查找。这确保了原型的属性不会因为某个继承对象的操作而被意外改变,同时允许继承对象通过原型链继承方法和属性。 let user = { firstName: "Tom", lastName: "Smith", get fullName() { return ${this.firstName} ${this.lastName}; }, set fullName(value) { [this.firstName, this.lastName] = value.split(" "); } }

      let admin = { isAdmin: true } Object.setPrototypeOf(admin, user) console.log(admin.fullName) //#1

      admin.fullName = "Machel Jordan"; //#2 console.log(admin.fullName) //#3 console.log(user.fullName) //#4

      //如上,首先我们在#1处调用admin.fullName,由于admin不具备fullName属性,因此沿原型查找,到user的getter,此时调用fullName的getter //但getter里的内容是 return ${this.firstName} ${this.lastName}; 当前的this是admin,admin并不具备firstName和lastName属性 //因此沿着原型链往上找,查到的是user的firstName和lastName,此时返回的就是Tom Smith

      //但对于#2,我们修改admin的fullName,需要铭记的是写操作不使用原型链 //首先如果fullName是数据属性,则admin新增一个fullName的属性,与user的fullName将独立。(不使用原型链!!!) //但如果fullName是访问器属性,访问器属性本身是函数的执行,因此会先沿着原型链找到setter然后执行,所以会先到达user的fullName setter //setter的内容是[this.firstName, this.lastName] = value.split(" "); 但此时this是admin,admin没firstName和lastName属性 //因此我们会在admin上创建firstName和lastName属性,并分别赋值为Machel和Jordan。 //这里admin就有了自己的firstName和lastName属性,与user区分开了。 //#3处 admin访问fullName,实际会先到达user的fullName getter,此时this是admin,因此返回的是Machel Jodan //#4 由于admin对fullName的修改并不影响user,因此user的firstName和lastName还是Tom Smith

    2. 答案很简单:this 根本不受原型的影响

      很重要的一句话

    3. 从现在开始,rabbit.walk() 将立即在对象中找到该方法并执行,而无需使用原型

      类似于重写父类有自己的实现

    1. 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor property)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性

      let user = { get name(){ return "tom"; } } 这种叫访问器属性,调用user.name的时候,实际上调用的是getter let user = { name: "tom" } console.log(user.name) 这种叫数据属性,调用user.name的时候就是直接读取user中name属性的值

    1. bind 的结果是另一个对象

      bind的返回是另一个函数,不再是源函数,源函数的属性不被复制

    1. 也就是说,该函数被调度在当前脚本执行完成“之后”立即执行

      类似于go中的defer

    1. 属性不是变量

      函数内变量也即局部变量,它会在函数每次调用时都初始化一次,但属性不同,属性是在函数创建时初始化的,只初始化这一次,后续所有调用如果都是同一个函数,则对应的是同一份属性变量

    1. let day = date.getDay(); if (day == 0) { // weekday 0 (sunday) is 7 in european day = 7; } return day;

      return date.getDay() || 7

    1. 第二个区别是 Object.* 方法返回的是“真正的”数组对象,而不只是一个可迭代对象

      map返回的是迭代对象,而非数组对象

    1. 现在不可能同时在对象上运行两个 for..of 循环了:它们将共享迭代状态

      也即按上面的例子,每次for of都会返回一个新的迭代器对象,但现在这个例子一直返回的是range本身,会存在状态互相影响问题

    2. return { current: this.from, last: this.to, // 3. next() 在 for..of 的每一轮循环迭代中被调用 next() { // 4. 它将会返回 {done:.., value :...} 格式的对象 if (this.current <= this.last) { return { done: false, value: this.current++ }; } else { return { done: true }; } } };

      需要注意的是,这个函数里的this指向并不一样 第一处this current: this.from, last: this.to, 这里的this指的是range对象 第二处的this if (this.current <= this.last) {return { done: false, value: this.current++ }; 指的是这个要返回的匿名对象

    1. symbol 保证是唯一的

      核心是唯一,由于唯一,比较适合做key值

  3. zh.javascript.info zh.javascript.info
    1. 参数(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。 参数(argument)是调用函数时传递给函数的值(它是函数调用时的术语)

      形参和实参

  4. Dec 2023
  5. Sep 2023