红宝石读书笔记--4.29

今天可能是放假第一天的缘故吧,一直在沉迷电视!!收心啦!!

1、谈一谈关于asycn、defer还有不加属性的三种情况


这个是网上截来的照片,总的来说没有两种属性的时候可以将其放在body标签的最后,这样可是使得窗口显示空白页面的时间大大缩短;当有defer的时候脚本的下载是可以和后面文档的渲染并行执行的但是脚本的执行是会放在整个页面接下哦完毕之后再运行(推荐使用);而async较为乱序,也就是下载的时候可以并行,但是下载完后一定要执行,并且脚本的执行顺序并不一定按照指定的先后顺序进行。


2、关于eval和arguments(仅为自己的理解)

关于eval,使用示例eval(“var age =30;”)

主要作用是:1,把字符串当成js代码来执行。2,可以将json格式的字符串转换成js对象(用法跟前面类似)

arguments,是JavaScript的对象,不能显示地创建,函数运行的时候能够自己创建!

arguments主要是一个伪数组,里面装的是传进来的参数。有length属性判断长度,还有我们可以借用arguments.callee来让匿名函数实现递归:

我们可以借用arguments.callee来让匿名函数实现递归(https://blog.csdn.net/u012860063/article/details/53871351):

  v plain  copy
  1. var sum = function(n) {  
  2.     if(n == 1) {  
  3.         return 1;  
  4.   } else {  
  5.     return n + arguments.callee(n-1);  
  6.  }  
  7. }  
  8. console.log("sum =", sum(5));


3、注意永远不要去测试某个特定的浮点数值,因为都是会有误差的!


4、js有特定地数值范围;NaN(表示一个本来要返回数值但是又没有返回地情况)特点:1、任何涉及NaN地操作都会返回NaN;2、NaN与任何值都不相等;3、任何值与NaN比较都是负值!。

5、js中valueof()返回最适合该对象的原始值;tostring()将该对象的原始值以字符串形式返回。

前者再数值运算中会优先调用,后者在字符串运算中会优先调用!

6、运算前如果有一个是对象,而另一个不是,那么调用valueof()方法,转换成基本类型值再进行比较。减号和等号字符串都会变成数值!

一般来说,对象到字符串的转换经过了如下步骤:

1.如果对象具有toString()方法,则调用这个方法。如果它返回一个原始值,js将这个值转换成字符串,并返还这个字符串结果。

2.如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么js将调用valueOf()方法。

3.否则,js无法从toString()或者valueOf()获得一个原始值,因此这时它将抛出一个类型错误异常。

 

一般来说,对象到数字的转换过程中,js做了同样类似的事情,但这里它会首先尝试使用valueOf()方法:

1.如果对象具有valueOf()方法,后者返回一个原始值,则js将这个原始值转换成数字,并返回这个数字。

2.否则,如果对象具有toString()方法,后者返回一个原始值,则js将转换并返回。

(首先js转换成相应的字符串原始值,再继续将这个原始值转换成相应的数字类型,再返回数字)

3.否则,js抛出一个类型错误异常。


7、ECMAScript中所有的参数传递的都是值,不可能通过引用传递参数!

8、看到最喜欢的群里面讨论的东西(我去看看闭包先)


9、检测类型:如果是基本数据类型那么typeof就能给你输出来,但是如果是引用数据类型的话,那就应该利用原型连instanceof来判断是否为此引用类型的实例了!

10、敲黑板!!执行环境和作用域!

执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象,所有的变量和函数都保存在这个对象中(但是我们编写的代码是无法访问到这个对象的)p73

全局执行环境被认为是window对象,因此所有变量和函数都是作为window对象的属性和方法创建的。

每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行之后,栈将其环境弹出!!


作用域链前端始终都是当前执行的代码所在环境的变量对象,作用域链中的下一个对象则来自下一个包含环境,这样一直持续到全局执行环境!

当然函数的参数也被当作变量来对待,因此其访问规则与执行环境中的其他变量是相同的

11、延长作用域链(需要更加深入的了解)

(方法里面this表示的是那个对象,是谁执行的,和在哪里定义是没有关系的,alert默认全局对象==window.alert)

可以利用try-catch语句的catch块、with语句延长作用域链。

12、js没有块级作用域:声明变量;查询标识符(我理解的是找变量)(回溯搜索变量对象,一直查询到全局环境的变量对象,找到最近的变量对象中有这个标识符即可);

13、垃圾收集:标记清楚;引用计数;性能问题;管理内存;

猜你喜欢

转载自blog.csdn.net/m_oman/article/details/80142945