小零识(1)

201 阅读5分钟

这是我参与更文挑战的第4天,活动详情查看: 更文挑战

1. for...of 可以自动遍历Generator函数,无需调用next

2. charCode返回onPress事件触发键值的字母代码,仅用于字符代码,which属性和keyCode类似,但不兼容IE8及其以下浏览器

3. 给script标签设置type="text/template"属性,标签里的内容不会被执行,也不会显示在页面上,但是可以在另外一个script里面通过获取插入到页面上。这样可以把大段的html和js进行分离。

4. 类数组转化为数组:

 Array.from    
 [...arguments]    
 [].slice.call(arguments)

5. 对象在转化为基本类型时,先调用valueof,再调用toString

6. 默认情况下,浏览器是同步加载js脚本,渲染引擎遇到script标签就会停下来,等到执行完脚本,再继续向下渲染,如果遇到外部引入脚本,还要加入脚本下载时间。

  • script标签中包含defer和async时,脚本会异步加载。渲染引擎遇到这行命令,会开始下载外部脚本,但不会等他下载和执行,而是直接进行后边的命令。
  • defer与async区别
    1. defer要等到整个页面再内存中正常渲染结束(DOM结构完全生成以及其他脚本全部执行完毕)才会 执行,即渲染完再执行。async则是脚本一旦下载完毕,渲染引擎会立刻终端渲染,执行这个脚本,即下载完就执行
    2. 如果有多个defer脚本,执行顺序是按照他们在页面出现的顺序执行,而多个async脚本则不能保证加载顺序
  • 浏览器加载ES6模块,也是异步加载。等整个页面渲染完毕才会加载,相当于打开了defer属性
     <script type="module" src="./es6.js"></script>
     <script type="module">
         import es6 from './test.js'
     </script>

7. forEach和map异同

相同点
  • ES5的API,都用来遍历数组
  • forEach和map,所传入的item都是原数组所对应的对象的地址值,修改item的某个属性值,指向这个item对应的地址的对象会改变;但如果直接给item重新赋值,那item和原始数组所对应的对象就没有关系了,此时的修改就不会影响到原数组了~ 即:
    1. item为基本类型,无法改变原数组
    2. item为引用类型,函数修改了item的引用地址,无法改变原数组;函数修改item的某个属性值,改变原数组
  • 无法中途退出循环
不同点
  1. forEach返回undefined,map返回一个新数组
  2. forEach回调函数不能使用await和yield

8. for...in和for...of异同

相同点
  1. 不能有return语句
  2. 都可以用来遍历数组
不同点
  1. for...of不能循环对象,用来循环数组。for...in可以循环对象,也可以循环数组
  2. for...in循环出的是key,for...of循环出的是value
  3. for...of是ES6中的特性,for...in是ES5中的特性

一般for...in遍历对象,for...of遍历数组。虽然for...in也可遍历数组,但是有以下问题:

  1. index索引为字符串型数字,不能直接进行几何计算
  2. 遍历顺序可能不是数组实际的内部顺序
  3. for...in会遍历数组所有的可枚举属性,包括原型上的。
  4. for...in和forEach会跳过空元素

9. new函数带括号和不带括号区别

function Parent () {
    this.num = 1;
}

new Parent() 与new Parent相同的场景

console.log(new Parent);  //Parent对象 Parent{num: 1}
console.log(new Parent());  //Parent对象 Parent{num: 1}

new Parent() 与new Parent不同的场景

console.log(new Parent().num);   //1
console.log(new Parent.num);    //报错

结果分析:

new的运算优先级小于.的运算优先级。new Parent.num会先执行Parent.num,此时返回undefined,然后执行new,因为new后边必须是构造函数,所以报错。

new后边的括号不是执行的意思,只是将这一块的优先级提升

10. JS小数取整的方式

  1. Math.ceil向上取整,不论小数部分是什么,整数部分都加1
Math.ceil(3/2)    // 2
Math.ceil(4/2)    // 2
  1. Math.floor向下取整,不论小数部分是什么,整数部分都不变
Math.floor(3/2)   // 1
Math.floor(4/2)   // 2
  1. Math.round四舍五入取整
Math.round(3/2)   // 2
Math.round(3/10)  // 0
  1. parseInt抛掉小数部分,返回整数部分
parseInt(3/2)    // 1
parseInt(3/10)   // 0

11. apply,call,bind区别

call和apply改变函数的this上下文以后便立即执行该函数;

bind返回一个改变了执行上下文的一个函数;

三个函数的第一个参数都是要改变的上下文对象,call和bind从第二个参数开始,是以列表形式展示。apply则只有两个参数,第二个参数是一个数组。

12. arguments

arguments对象是所有非箭头函数中都可用的局部变量,包含传递给函数的每个参数。

arguments对象是一个类数组对象,它类似于Array,但除了length属性和所云元素外没有其他数组的属性。

arguments.callee指向当前调用的函数。在严格模式下,arguments.callee被移除。

13. Array.prototype.includes与indexOf区别

includes可以查找NaN,indexOf不可以

image.png

14. 为何form表单提交不跨域,ajax会跨域

浏览器同源本质:一个域名的JS,在未经允许的情况下是不能读取另一个域名的内容的。但是浏览器并不会阻止你向另一个域名发请求。

form提交(submit函数)后是不会有任何数据返回的,当前JS脚本是没法读取到任何数据的,所以认为是无害的。但是ajax是可以读取另一个域名的响应内容的,因此浏览器的同源策略不允许这样的行为。