- Apr 2024
-
www.patrickzhong.com www.patrickzhong.com
-
如果一个对象字面量存在任何“目标类型”不包含的属性时,你会得到一个错误
这有些麻烦
-
-
zh.javascript.info zh.javascript.info
-
它们的名字是大小写不敏感的(id 与 ID 相同)。 它们的值总是字符串类型的
其实也可以理解为dom对象有一个内置的map,每个特性都是入的这个map,而非直接成为对象的属性
-
-
zh.javascript.info zh.javascript.infoDOM 树1
-
标签内的文本也是一个对象
举个例子:
hello js
这里p标签是一个元素节点,而hello js字符串其实也是个节点叫文本节点
-
-
zh.javascript.info zh.javascript.info
-
.then/catch/finally 处理程序就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。
异步执行的,但js又是单线程,因此先执行完当前函数,才能再执行那些异步任务
-
-
zh.javascript.info zh.javascript.info
-
我们可以将 class User 声明的结果解释为
下面这个图很好
-
-
zh.javascript.info zh.javascript.info原生的原型1
-
一些方法在原型上可能会发生重叠,例如,Array.prototype 有自己的 toString 方法来列举出来数组的所有元素并用逗号分隔每一个元素
重写父类方法
-
-
zh.javascript.info zh.javascript.info原型继承3
-
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
-
答案很简单:this 根本不受原型的影响
很重要的一句话
-
从现在开始,rabbit.walk() 将立即在对象中找到该方法并执行,而无需使用原型
类似于重写父类有自己的实现
-
-
zh.javascript.info zh.javascript.info
-
第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor property)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性
let user = { get name(){ return "tom"; } } 这种叫访问器属性,调用user.name的时候,实际上调用的是getter let user = { name: "tom" } console.log(user.name) 这种叫数据属性,调用user.name的时候就是直接读取user中name属性的值
-
-
zh.javascript.info zh.javascript.info函数绑定1
-
bind 的结果是另一个对象
bind的返回是另一个函数,不再是源函数,源函数的属性不被复制
-
-
zh.javascript.info zh.javascript.info
-
也就是说,该函数被调度在当前脚本执行完成“之后”立即执行
类似于go中的defer
-
-
zh.javascript.info zh.javascript.info函数对象,NFE1
-
属性不是变量
函数内变量也即局部变量,它会在函数每次调用时都初始化一次,但属性不同,属性是在函数创建时初始化的,只初始化这一次,后续所有调用如果都是同一个函数,则对应的是同一份属性变量
-
-
zh.javascript.info zh.javascript.info变量作用域,闭包1
-
sum(a)(b) = a+b
高阶函数
-
-
zh.javascript.info zh.javascript.info
-
类数组对象
需要注意的是arguments参数不是数组
-
-
zh.javascript.info zh.javascript.info日期和时间1
-
let day = date.getDay(); if (day == 0) { // weekday 0 (sunday) is 7 in european day = 7; } return day;
return date.getDay() || 7
-
-
zh.javascript.info zh.javascript.info解构赋值1
-
= {}
对参数整体的默认值,套的太深了
-
-
zh.javascript.info zh.javascript.info
-
第二个区别是 Object.* 方法返回的是“真正的”数组对象,而不只是一个可迭代对象
map返回的是迭代对象,而非数组对象
-
-
zh.javascript.info zh.javascript.info
-
现在不可能同时在对象上运行两个 for..of 循环了:它们将共享迭代状态
也即按上面的例子,每次for of都会返回一个新的迭代器对象,但现在这个例子一直返回的是range本身,会存在状态互相影响问题
-
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++ }; 指的是这个要返回的匿名对象
-
-
zh.javascript.info zh.javascript.info
-
symbol 保证是唯一的
核心是唯一,由于唯一,比较适合做key值
-
-
zh.javascript.info zh.javascript.info
-
但还不止这些
无this 不继承执行上下文
-
-
zh.javascript.info zh.javascript.info函数1
-
参数(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。 参数(argument)是调用函数时传递给函数的值(它是函数调用时的术语)
形参和实参
-
- Dec 2023
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
.wait(timeout)
通过sync+wait实现阻塞,然后再通过notify唤醒阻塞
-
- Sep 2023
-
static1.squarespace.com static1.squarespace.comSlide 11
-
troduction to Statist
test
-