标题
前要
最近投了一个c厂(cvte)的实习,笔试部分给我整麻了,一是很久没看js部分,二是有一些点没有掌握好,因此对js进行一个复习。
c厂笔试总结
就简单说一下笔试都考了什么。两道编程题和20道选择题
1.promise选择题和编程题需要使用promise.all,我当时没有搞懂该怎么做那个编程题,题目需要我将一个传入的函数(可能是同步函数也可能是异步函数)执行,然后延时给定时间,重复给定次数的执行,直到执行成功返回,失败则将失败结果全部返回。
2.webpack的的插件,打包,loader等小知识点
3.css常用布局,属性。
4.js类型等
5.es6的一些特性等
6.问了一个rpc协议,这是我从来没看过了,考完之后立马就去看了。
还有一些题目,http啊什么的,挺全面的。反而是没有框架内容,可能对于实习岗,要求没这么高吧。
数字类型
JavaScript 中的数字类型number包含整数和浮点数,另外还有 2 个特殊的数字值:Infinity
(比其他任何数字都大的数字)和 NaN
(表示“Not A Number”概念)。
object
Function有原型prototype,而实例化后的对象有__proto__属性,指向原型对象。
create方法是以传入对象作为原型创建新的对象。delete 可以删除对象上的attribute。
let a = { name: "syh" }
let c = Object.create(a)
console.log(c.name);
c.age = 13
console.log(c.age); //13
delete c.name
// delete
console.log(c);
// after delete
console.log(c.__proto__.sex = "男");
// 等降于a.sex="男" 因为c的__proto__指向a
console.log(a);
// 以上是以Object.create创建对象的情况
原型与原型链
上图是对象和函数各自有的的属性,通过下面代码验证
// create object by function
function Fun(name) {
this.name = name
// 构造函数写法
// class Fun {
// constructor(name) {
// this.name = name;
// // 构造函数写法
// }
// }
}
Fun.prototype.age = "12"
let fun = new Fun("syh")
// 生成实例,这是函数的一种特使的使用方法,用作构造函数,可以转换为es6的constructor写法
console.log(fun); // Fun { name: 'syh' }
console.log(fun.__proto__); //{ age: '12' }
// 他是指向构造它的原型对象,也就是Fun.prototype
console.log(Fun.prototype); //{ age: '12' }
// 获得函数的原型对象
console.log(Fun.__proto__); //{}
// 往prototype上添加属性
Fun.prototype.sex = "男"
console.log(fun); //Fun { name: 'syh' }
console.log(`fun.sex can get ${fun.sex}`); //fun.sex can get 男
// 各个对象的constructor
console.log(Fun.constructor); //[Function: Function]
console.log(fun.constructor); //[Function: Fun]
console.log(fun.constructor.constructor); //[Function: Function]
console.log(fun.__proto__.constructor); //[Function: Fun]
console.log(fun.__proto__.__proto__.constructor); //[Function: Object]
// 如果更改constructor的话,对象上有constructor属性
fun.constructor = "cons"
console.log(fun); //Fun { name: 'syh', constructor: 'cons' }
console.log(fun.constructor); //cons
console.log(fun.__proto__.constructor); //[Function: Fun]
结合constructor之后的图:
this
this指向调用它的那个对象,这句话就够了,因为js是万物皆对象。
let outThis = {
sex: "syh",
age: 18,
inThis: function () {
this.name = "tt"
console.log(this.age, this.sex);
console.log(this.name);
},
logName: function () {
console.log("outThis - name is :" + this.name);
}
}
outThis.inThis()
outThis.logName()
console.log(outThis);
// 输出
// 18 syh
// tt
// outThis - name is :tt
// {
// sex: 'syh',
// age: 18,
// inThis: [Function: inThis],
// logName: [Function: logName],
// name: 'tt'
// }
let obj = {
name: "syh",
outNmae: () => {
this.sex = 18;
console.log(this.name);
console.log(this.sex);
}
}
obj.outNmae()
// undefined
// 18
可以看到,普通函数内的this就是调用函数的作用域的对象,最上层是window。
而箭头函数的this就是指向这个箭头函数作用域。
call,apply,bind
他们是函数身上特有的方法,能够将函数的内部函数体放到一个新的上下文去执行,使用:Function.call(obj)。
下面写的实现call,看懂下面的代码,基本上就能彻底搞懂call了。
Function.prototype._call = function (param) {
var args = [...arguments].slice(1);
// 将除了第一个参数以外的所有参数取出来
param.fn = this;
// 将传入的param定义一个属性fn保存this,
// 根据this永远指向最后一次调用它的对象,可以知道这个this就是执行call方法的函数
// 也就是下面的myCall
console.log(param.age + param.sex);
// 直接输出param.age和param.sex可以的得到18男
const result = param.fn(...args);
// 再执行mycall函数,并将参数传给mycall,那么fn函数体内的this九指向的param,也就可以读到age和sex
delete param.fn;
// 删除fn
return result;
// 将结果返回
};
let obj = {
age: 18,
sex: "男",
};
function myCall(arg) {
console.log(this.age + " " + this.sex + [...arguments]);
}
myCall._call(obj, 2, 3, 4);
array的方法
1、push()是用来在数组末端添加项,shift()在移除数组的第一个项。
2、pop()在数组末端移除项,unshift()在数组前端添加项。
根据代码分析
let arr = [1, 3, "4"]
arr.push("5")
console.log(arr); //[ 1, 3, '4', '5' ]
// push压入,往数组末尾添加元素
arr.shift()
console.log(arr); //[ 3, '4', '5' ]
// shift 移除数组第一个元素
arr.unshift("7")
console.log(arr); //[ '7', 3, '4', '5' ]
// 与shift相反,则是往数组首部添加元素
arr.pop()
console.log(arr); //[ '7', 3, '4' ]
// 弹出数组的最后一个元素,和push相反
可以将pop和push分为一类,对数组尾部添加删除,shift和unshift分为一类,对数组首部进行操作。
总结
本次文章复习了一些js的小知识点
结语
本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥
每天一个知识点,每天都在进步!♥♥