「 JavaScript 篇 」
JavaScript 基础
1. JavaScript 里有哪些数据类型, 解释清楚 null 和 undefined, 解释清楚原始数据类型和引用数据类型. 比如讲一下 1 和 Number(1) 的区别
2. 将一下 prototype 是什么东西, 原型链的理解, 什么时候用 prototype
答: JS 中, prototype 是函数的原型. 每个函数都是一个对象, 并且拥有一个属性 prototype, 该属性也是一个对象, 是属性和方法的集合.
原型链: 实例对象的原型__proto__指向 new 出该实例对象的构造函数原型 prototype, 再指向原始的对象原型 Object.prototype, 再指向 null, 形成原型链.
使用 prototype 的好处是不会产生额外的内存, 所有实例化后的对象都会从原型上继承这个属性或方法. 当一个子类需要拥有父类的某些属性或方法,
该属性或方法可以覆 盖, 又可以添加自己的属性和方法, 这个操作不影响父类, 这个时候使用 prototype.
- fn.__proto__===Fn.prototype
- Fn.prototype.constructor===Fn
3. 函数里的 this 什么含义, 什么情况下, 怎么用.
答: 通常在构造函数中使用, 就是通过这个函数生成一个新对象 (object). 这时, this 就指这个新对象.
- function test(){
- this.x = 1;
- }
- var o = new test();
- alert(o.x); // 1
运行结果为 1. 为了表明这时 this 不是全局对象, 对代码做一些改变:
- var x = 2;
- function test(){
- this.x = 1;
- }
- var o = new test();
- alert(x); //2
运行结果为 2, 表明全局变量 x 的值没变.
4. apply 和 call 什么含义, 什么区别? 什么时候用.
答: function add(c,d){
- console.log(this.a + this.b + c + d);
- }
- var o ={a:1,b:3};
- add.call(o,5,7); //1+3+5+7=16
- // 传参的时候是扁平的把每个参数传进去
- add.apply(o,[10,20]); //1+3+10+20=34
- // 传参的时候是把参数作为一个数组传进去
- // 什么时候使用 call 或者 apply
- function bar(){
- console.log(Object.prototype.toString.call(this));
- // 用来调用一些无法直接调用的方法
- }
- bar.call(7); //"[object Number]"
5. 数组和对象有哪些原生方法, 列举一下, 分别是什么含义, 比如连接两个数组用哪个方法, 删除数组的指定项和重新组装数组 (操作数据的重点).
答: 数组:
length 设置或返回 数组中元素的数目.
push() : 向数组的末尾添加一个或多个元素, 并返回新的长度, 也就是添加元素后的数组长度.
shift(): 用于把数组的第一个元素从其中删除, 并返回第一个元素的值.
unshift(): 向数组的开头添加一个或更多元素, 并返回新的长度.
pop(): 用于删除并返回数组的最后一个元素.
splice(): 用于插入, 删除或替换数组的元素.
concat(): 方法用于连接两个或多个数组.
join(): 用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的.
toString(): 方法可把数组转换为字符串, 并返回结果.
reverse(): 方法用于颠倒数组中元素的顺序.
slice(): 方法可从已有的数组中返回选定的元素.
sort(): 方法用于对数组的元素进行排序 (从小到大).
indexOf(): 返回获取项在数组中的索引
lastIndexOf(): 返回获取项在数组中出现的最后一次索引
forEach(): 循环遍历数组 参数是一个匿名函数 默认返回为 undefined
map(): 循环遍历数组 参数是一个匿名函数
对象:
charAt(): 返回在指定位置的字符.
charCodeAt(): 返回在指定的位置的字符的 Unicode 编码.
concat(): 连接字符串.
indexOf(): 检索字符串.
match(): 找到一个或多个正则表达式的匹配.
replace(): 替换与正则表达式匹配的子串.
search(): 检索与正则表达式相匹配的值.
slice(): 提取字符串的片断, 并在新的字符串中返回被提取的部分.
split(): 把字符串分割为字符串数组.
toLocaleLowerCase(): 把字符串转换为小写.
toLocaleUpperCase(): 把字符串转换为大写.
toLowerCase(): 把字符串转换为小写.
toUpperCase(): 把字符串转换为大写.
substr(): 从起始索引号提取字符串中指定数目的字符.
substring(): 提取字符串中两个指定的索引号之间的字符.
6. 怎样避免全局变量污染? ES5 严格模式的作用, ES6 箭头函数和 ES5 普通函数一样吗?
答: 避免污染个人常用模块化解决
箭头函数和普通函数区别在于 this 的使用
由于箭头函数使得 this 从 "动态" 变成 "静态", 下面两个场合不应该使用箭头函数.
第一个场合是定义函数的方法, 且该方法内部包括 this
第二个场合是需要动态 this 的时候, 也不应使用箭头函数.
JavaScript 的面向对象
1. JS 模块包装格式都用过哪些, CommonJS,AMD,CMD. 定义一个 JS 模块代码, 最精简的格式是怎样.
2. JS 怎么实现一个类. 怎么实例化这个类.
3. 理解闭包吗? 请讲一讲闭包在实际开发中的作用; 闭包建议频繁使用吗?
4. 说一下了解的 JS 设计模式, 解释一下单例, 工厂, 观察者.
5. Ajax 跨域有哪些方法, JSONP 的原理是什么, 如果页面编码和被请求的资源编码不一致如何处理?
作者: 前端攻城小牛
链接: https://www.jianshu.com/p/eb0f269098d5
来源: http://www.bubuko.com/infodetail-3437913.html