杂记(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的类型相等

    1. 如果都是数值,比较值是否相等,(特殊:如果有NaN则直接返回false);

      // 这两个问题可以用Object.is解决
      -0 === +0;     // ture
      NaN === NaN;   // false
    2. 如果都是字符串,则比较每个位置的字符是否相同;

    3. 如果是布尔值,两个都是true或两边都是false则为相等;

    4. 如果都是unll或undefined则返回true;

    5. 如果是引用类型,则判断是否引用同一个对象(是否指向相同的地址内存);

非严格相等运算符== :

  • x和y类型相等,则进行和===一样的比较;

  • x和y类型不相等

    1. 如果一个是null,一个是undefined,返回true;

    2. 如果是null或undefined和其他任何类型比较,返回false;

    3. 如果原始类型(number、string、boolean)间的比较,先转换成数值再比较;

    4. 如果是原始类型(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
  • 两者都为数字:

    1. 都为+0或者都为-0

      Object.is(+0,+0);   // true      这个和===判断结果不同
      Object.is(-0,-0);   // true      这个和===判断结果不同
      Object.is(-0,+0);   // false     这个和===判断结果不同
      1. 都为NaN

        Object.is(NaN,NaN);   // true   这个和===判断结果不同  
      2. 不为零不为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函数执行时的作用域,第二个参数为函数调用的参数。

  • 区别:

    1. call()和apply()不同在于第二个参数的形式不同,call()第二个参数以参数列表形式展现,而apply()第二个参数以参数数组形式展现。

    2. bind()和以上两者(call()、apply())不同在于,bind()方法并不会立即调用,而是返回一个改变了this值的函数(绑定函数),等到需要时再调用。而apply()和call()在改变了this值后会立刻执行该函数。

  • 应用:

    1. 合并两个数组

      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]
    2. 获取数组的最大值和最小值

      这样用是因为数组没有Math对象的maxmin方法,但是可以通过call和apply绑定。

      let arr = [132,11,24,56,66,47,48];
      // 可以这么写:Math.max.apply(Math, arr);
      Math.max.call(Math, …arr); // …为ES6的扩展运算符

    3. 判断数据类型

      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" 转载请保留原文链接及作者。

目录