杂记(2019/12/2-8)
最近准备看三元同学的掘金和继续看大神学友的博客来复习巩固JavaScript基础。
突然决定写“杂记”也是想记录一些平时学习的零碎知识点,总结一下每天的收获,以及平凡生活里的温暖小事,这世间总是充满不期而遇的温暖,还有生生不息的希望!
突然好喜欢博客呀,有一个自己碎碎念的小地方,可以纵情享受当下。
前段时间因为面试而焦虑,现在已经好多了。什么时候开始都不算晚,虽然我走的很慢,但是我却好享受这样踏踏实实的感受啊。
“保持温柔,继续善良。”
2019/12/3 Tuseday
满课的周二,结束了这一学期的显示实验啦! 今天学习的时间有点少(哭了)。
今天学到的东西
函数传参传递的是内存地址
栗子:
function test(person) {
person.age = 26
person = {
name: 'hzj',
age: 18
}
return person
}
const p1 = {
name: 'fyq',
age: 19
}
const p2 = test(p1)
console.log(p1) // {name: 'fyq',age: 26}
console.log(p2) // {name: 'hzj',age: 18}
理解:
test(p1)传给test函数的其实是p1的内存地址(p1存放的是一个内存地址),而person.age改变了该内存地址存放的对象的age属性值,所以p1访问该对象时,对象已经变了。
而该函数之后又让person变成另一个内存地址,于是这个新的内存地址就被传递给p2变量,所以通过p2访问的其实是新的内存地址上的对象。
null不是对象,以及不是对象的原因
虽然typeof null
返回的结果是object,但null不是对象!会返回这个结果的原因是,JS引擎在最初版本使用32位系统,为了性能考虑选择用低位存储变量的类型信息,只要000开头便被typeof判断为object,而null表示全零,就这样被美丽地误会了。
0.1+0.2为什么不等于0.3
这是因为0.1和0.2转换成二进制后就无限循环了,而标准位数限制了后面多余位数,于是精度就出现了损失,当0.1+0.2后由于精度损失,转换成是十进制后当然不会等于0.3啦!
用代码实现instanceof的功能
之前总结数据类型的时候写的是instanceof的逻辑实现:
function instanceof(A,B) {
if(A.__proto__ === B.prototype) return true;
return false;
}
然后今天学到了完整的instanceof功能实现:
function myInstanceof(left,right) {
// 首先如果是基本类型及null直接返回false
if(typeof left !== 'object' || left == null) return false;
let proto = Object.getPrototypeOf(left);
while(true) {
// 如果把原型链找到底了都没有找到
if(proto == null) return false;
// 找到了
if(proto == right.prototype) return true;
// 在原型链上找原型的原型
proto = Object.getPrototyprOf(proto);
}
}
赶紧更新到那篇博客里嘻嘻嘻!(神气地叉会腰)~
今天学习遇到的需要进一步解决的问题
()类型包装 (《高程》118页),回答’1’.toString()为什么可以调用?
()如何理解BigInt?( 什么是BigInt?为什么使用BigInt?如何创建并使用BigInt?)
()复习总结一下Object常用方法
(√)总结”===”和”==”区别及适用情况
===是严格相等运算符,==为非严格相等运算符。
它们的区别在于:==检查值相等,允许类型转换;===检查类型和值相等,不允许类型转换。
严格相等运算符=== :
x和y的类型不相等,返回false;
x和y的类型相等
如果都是数值,比较值是否相等,(特殊:如果有NaN则直接返回false);
// 这两个问题可以用Object.is解决 -0 === +0; // ture NaN === NaN; // false
如果都是字符串,则比较每个位置的字符是否相同;
如果是布尔值,两个都是true或两边都是false则为相等;
如果都是unll或undefined则返回true;
如果是引用类型,则判断是否引用同一个对象(是否指向相同的地址内存);
非严格相等运算符== :
x和y类型相等,则进行和===一样的比较;
x和y类型不相等
如果一个是null,一个是undefined,返回true;
如果是null或undefined和其他任何类型比较,返回false;
如果原始类型(number、string、boolean)间的比较,先转换成数值再比较;
如果是原始类型(number、string、boolean)和引用类型比较,引用类型转化为原始值再比较;
// 我常错的 'true' == true; // false
2019/12/4 Wednesday
在《撒野》里看到一句话:“人就是这样的,想来想去,犹豫来犹豫去,觉得自己没有准备好,勇气没攒够。其实只要迈出去了那一步,就会发现所有的一切早已准备好了。”
这学期的模电实验完美谢幕!
…
(更完今天的博客后)
检讨:今晚好像有点浮躁,效率极低,决定先放一放,明天不弄新的,就巩固今天的知识。
今天学到的东西
总结if在什么情况下判断为false
- false
- null
- undefined
- 空字符串(’’)
- NAN
- 0
JS中的三种类型转换
- 转化为数字
- 转化为字符串
- 转化为布尔值
[] == ![]的结果是什么?
结果:true
原因:左边的[]会转变为数字0,而右边的[]是引用类型,转换为字符串为true,于是![]的结果为false,进而转化为数字0。
叨叨:咳,这个题目还需要再深入学习一下,涉及到的知识点(比较过程中的转换优先级,数组转布尔值,布尔值与任意值比较时两边转数值,空数组转数值),我都没考虑这么多!!!被学友吊着锤了…
今天学习遇到的需要进一步解决的问题
(√)复习Object.is方法,回答:Object.is和===的区别
Object.is()是ES6的方法,用来确定两个值是否相等。
满足下列条件,则判断值相等,返回true:
都为null或者都为Undefined
Object.is(null,null); // true Object.is(undefined,undefined); // true
都为true或false
Object.is(true,true); // true Object.is(false,false); // true
两者都为字符串,且长度相同,每个位置的字符相同
Object.is('hello','hello'); // true
引用同一个对象(指向同样的内存地址)
Object.is({},{}); // false let obj = { a: 1 }; Object.is(obj,obj); // true
两者都为数字:
都为+0或者都为-0
Object.is(+0,+0); // true 这个和===判断结果不同 Object.is(-0,-0); // true 这个和===判断结果不同 Object.is(-0,+0); // false 这个和===判断结果不同
都为NaN
Object.is(NaN,NaN); // true 这个和===判断结果不同
不为零不为NaN之外的相等数字
Object.is()和===区别就在于对-0,+0,NaN的判断上,看栗子说明:
Object.is(+0,+0); // true
+0 === +0; // true
Object.is(-0,-0); // true
-0 === -0; // true
Object.is(-0,+0); // false
-0 === +0; // true
Object.is(NaN,NaN); // true
NaN === NaN; // false
()对象转原始类型依据什么流程实现? 应用:让if(a == 1 && a ==2)成立
(√)apply、call和bind的区别和应用
call():
func.call(thisArg, arg1,arg2 ...)
call()接收两个参数,第一个参数thisArg为func函数在执行时的作用域(即指定的this值),第二个参数为函数接收的参数的列举。该注意的是,在非严格模式下,当this值为null或undefined时,函数执行的this指向全局对象,this值为原始值时,执行的this指向原始值的自动包装对象。
apply()
func.apply(thisArg, [argsArray])
apply()接收两个参数,第一个参数和call()的第一个参数一样,第二个参数则是函数接收的参数数组。该注意的是,在非严格模式下,当this值为null或undefined时,函数执行的this指向全局对象,this值为原始值时,执行的this指向原始值的自动包装对象。
bind()
func.bind(thisArg, arg1,arg2 ...)
bind()会创建一个函数,这个函数称为绑定函数(call和apply均不能改变绑定函数的this值)。它同样接收两个参数,第一个为func函数执行时的作用域,第二个参数为函数调用的参数。
区别:
call()和apply()不同在于第二个参数的形式不同,call()第二个参数以参数列表形式展现,而apply()第二个参数以参数数组形式展现。
bind()和以上两者(call()、apply())不同在于,bind()方法并不会立即调用,而是返回一个改变了this值的函数(绑定函数),等到需要时再调用。而apply()和call()在改变了this值后会立刻执行该函数。
应用:
合并两个数组
let arr1 = [1,2,3]; let arr2 = [4,5,6]; Array.prototype.push.apply(arr1,arr2); console.log(arr1); // [1,2,3,4,5,6] console.log(arr2); // [4,5,6]
获取数组的最大值和最小值
这样用是因为数组没有Math对象的
max
和min
方法,但是可以通过call和apply绑定。let arr = [132,11,24,56,66,47,48];
// 可以这么写:Math.max.apply(Math, arr);
Math.max.call(Math, …arr); // …为ES6的扩展运算符判断数据类型
Object.prototype.toString.call('hello'); // [object String]
call()、apply()、bind()方法太常用了,我没办法归纳出应用啊啊啊,就是写几个常见的栗子。
2019/12/4 Thursday
今天复习的内容比较少,主要总结了“===和==的区别”。
没有有趣的事,但是练了车,结束了光学综合实验,还煮了巨好吃的香菇牛肉饺子,吃上了心心念念的“黑店”夹馍…仔细想想,平凡生活还是闪闪发光的呀!
明天开始准备学校的期末考试,所以复习的内容会超级少。不过只要每天都有填补漏洞,我就心满意足啦,保证每天的github的小绿点!
(今天突然意识到可能真的见不了面了,还是偷偷哭了一把)
2019/12/5-6-7-8 Four days
- 整理这周残留的问题(越复习越发现自己菜得无法形容,之前学的真的太碎片化了)
- 复习模电期末考(我是谁?我在哪?我在干什么?模拟电路要我狗命)
- 狂补大量实验报告(手不是我的了)
- 打卡心心念念的焖锅(美食真的可以治愈被自己的菜打击的心!!!)
- 入手可可爱爱的发夹(足不出户也要可可爱爱,咳,发夹可爱,我不可爱,哭了)
前天和妈妈说,让她帮我在家附近租一间可以让我回去学习的小房间,虽然妈妈嘴上说麻烦,但是第二天就和我说找到了!妈妈好暖啊,跨越一千多公里的无声支持和关心。
又翻到了两年前的读书笔记:
“在最内在的精神生活中,我们每个人都是孤独的,爱并不能消除这种孤独,但正是由己及人地领悟到了别人的孤独,我们内心才会对别人充满诚挚的爱。我们在黑暗中并肩而行,走在各自的朝圣路上,无法知道是否走向同一个圣地,因为我们无法向别人甚至自己说清心中的圣地究竟是怎样的。然而,同样的朝圣热情使我们相信,也许存在着同一个圣地。” ——周国平
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 610193653@qq.com,谢谢啦!
文章标题:杂记(2019/12/2-8)
本文作者:zzzwyyy
发布时间:2019-12-03, 23:34:09
最后更新:2019-12-09, 11:16:20
原始链接:http://yoursite.com/2019/12/03/杂记(2019-12-2-8)/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。