js题目汇总

1. let、const、var的区别

  • let完全可以取代var,因为两者语义相同,而且let没有副作用。 let不会变量提升,只在块级作用域内有用

  • letconst之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量。

  • const优于let有几个原因。一个是const可以提醒阅读程序的人,这个变量不应该改变;另一个是const比较符合函数式编程思想,运算不改变值,只是新建值,而且这样也有利于将来的分布式运算;最后一个原因是 JavaScript 编译器会对const进行优化,所以多使用const,有利于提高程序的运行效率,也就是说letconst的本质区别,其实是编译器内部的处理不同

2. map与普通对象的区别

普通对象只能用字符串当作键,而es6中的map数据结构,类似于对象,也是键值对的集合,但是键的范围不限于字符串,各种类型的值(包括对象)都可以当作键

3. 常用es6语法

箭头函数,模板字符串、变量解构赋值、proxy、promise对象、class类的引入、set与map数据结构

4. 常见解决跨域方法

  • jsonp跨域

    通过script标签引入js文件,这个js文件又会返回一个js函数调用,也就是请求后通过callback方式回传结果
    优点:
    1.不受同源策略限制
    2.兼容性更好
    3.支持老版本浏览器

    缺点:只支持get请求

  • cors跨域

    使用自定义的http头部请求。让浏览器与服务器之间进行沟通,从而决定请求或相应是否成功

    优点:

    1. 支持所有类型的http请求
    2. 比jsonp有更好的错误处理机制
    3. 被大多数浏览器支持
  • h5的postMessage方法

    h5新特性,目前只支持窗口(iframe)之间交换数据, 不能和服务端交换

5. ajax了解

客户端发起请求,获取或发送服务端数据的一项技术

优势

  • 无刷新页面
  • 服务器端任务转到客户端处理
  • 减轻浏览器负担节约带宽
  • 彻底将页面与数据分离

缺点

  • 无法使用回退按钮
  • 不利于网页seo
  • 不能发送跨域请求

6. 闭包

嵌套函数引用了外部函数变量的函数叫做闭包。可能会造成变量污染

7. window.location对象包括哪些属性

hash、host、hostname、href、origin、pathname、search、protocol

8. 轮播图实现原理概述

一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量利用定时器实现自动播放,或通过手动点击事件切换图片

9. this的指向

this永远指向最后调用它的那个对象

Tips:改变this指向的方法:

  • 使用es6的箭头函数,箭头函数的this始终指向函数定义时的this、而非执行时
  • 函数内部使用_this=this
  • 使用apply、call、bind
  • new实例化一个对象

10. 严格模式理解

引自阮一峰老师博客详解严格模式

严格模式是ES5中提出的运行模式,其目的为下面几个

  • 消除js语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的不安全之处,保证代码运行安全
  • 提高编译器效率,增加运行速度
  • 为未来新版本的js做好铺垫

调用:

<script>
"use strict";  // 必须放在第一行
</script>

// 针对函数
function strict(){
  "use strict";
  return "这是严格模式"
}

规定:

  • 全局变量必须显示声明
  • 禁止使用with语句
  • 创设eval作用域。正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
   "use strict";
  var x = 2;
  console.info(eval("var x = 5; x")); // 5
  console.info(x); // 2
  • 禁止this关键字指向全局对象
  • 禁止在函数内部遍历调用栈
  • 禁止删除变量,只有configurable设置为true的对象属性,才能被删除
  "use strict";
  var x;
  delete x; // 语法错误
  var o = Object.create(null, {'x': {
      value: 1,
      configurable: true
  }});
  delete o.x; // 删除成功
  • 对一个对象只读属性赋值报错
  • 对一个getter方法读取的属性赋值报错
  • 对禁止扩展的对象添加新属性报错
  • 删除不可删除的属性报错
  • 对象不能有重名属性
  • 函数不能有重名参数
  • 禁止八进制表示法 如var n=0100;
  • 不允许对arguments赋值;
  • arguments不再追踪参数变化
  function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 严格模式为[2,1]
  • 禁止使用arguments.callee
  • 函数必须声明在顶层
  • 也就是说,不允许在非函数的代码块内声明函数

11. bind、call、apply区别

apply()方法调用一个函数,其具有一个指定this值,以及作为一个数组(或类似数组的对象)提供的参数

call()方法接受的是若干个参数列表,而apply接收的是一个包含多个参数的数组

bind()方法创建一个新的函数,然后传入this所绑定的值和参数

var a ={
        name : "Cherry",
        fn : function (a,b) {
            console.log( a + b)
        }
}

var b = a.fn;
b.apply(a,[1,2])    // 3
b.call(a,1,2)       // 3
b.bind(a,1,2)()     // 3

12. 创建对象的方法

直接赋值,new实例, 工厂函数

13. js基本数据类型

Undefined、Null、Boolean、Number、String、Symbol(ES6引入的表示独一无二的值)、BigInt

14. js引用数据类型

Array、Object、Function

15. 深拷贝的实现方案

  • jQuery的extend方法 $.extend(true, {}, obj)
  • lodash.cloneDeep()方法
  • 递归
发布了171 篇原创文章 · 获赞 246 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/weixin_42042680/article/details/102419740