JS 有哪些数据类型
另外,object 包括:数组、函数、正则、日期等对象。NaN属于number类型。
注意,数据类型里,没有数组。因为数组属于object(一旦说数组、函数、正则、日期、NaN是数据类型,直接0分)。
Promise 怎么使用
then:
1
| $.ajax(...).then(成功函数, 失败函数)
|
链式 then:
1
| $.ajax(...).then(成功函数, 失败函数).then(成功函数2, 失败函数2)
|
如何自己生成 Promise 对象:
1 2 3 4 5 6 7 8
| function xxx(){ return new Promise(function(resolve, reject){ setTimeout(()=>{ resolve() 或者 reject() },3000) }) } xxx().then(...)
|
ajax手写
1 2 3 4 5 6 7 8
| let xhr = new XMLHttpRequest(); xhr.open('POST', '/xxxx'); xhr.onreadystatechange = function(){ if(xhr.readyState === 4 && xhr.status === 200){ console.log(xhr.responseText) } } xhr.send('a=1&b=2');
|
闭包是什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function fn1() { var a = 2
function fn2() { a++ console.log(a) } return fn2; }
var f = fn1(); f() f() console.log(a);
|
参考链接:
这段代码里的 this 是什么?
1、fn() 里面的 this 就是 window
2、fn() 是 strict mode,this 就是 undefined
3、a.b.c.fn() 里面的 this 就是 a.b.c
4、new F() 里面的 this 就是新生成的实例
5、() => console.log(this) ,这个this指的是外面的 this。
参考链接:
什么是立即执行函数?作用是?
立即执行函数:
(1)声明一个匿名函数,(2)马上调用这个匿名函数。如下:
1 2 3 4 5
| (function(a, b) { var name; console.log("a = " + a); console.log("b = " + b); })(123, 456);
|
作用:创建一个独立的作用域,防止污染全局变量。
因为我们只能通过函数的形式声明一个局部变量。当有了ES6之后,我们可以通过let来定义一个局部变量:
上面这段代码,就相当于立即执行函数。有了let,立即执行函数就毫无意义。
参考链接:
ES6 新特性
async/await 语法了解吗?目的是什么?
目的:把异步代码写成同步代码的形式。
我们知道,promise是这样写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| let promise = new Promise((resolve, reject) => { console.log('111'); if (异步的ajax请求成功) { console.log('333'); resolve(); } else { reject(); } }) console.log('222');
promise.then(() => { console.log('成功了'); } , () => { console.log('失败了');
} )
|
有了await之后,可以直接替换掉then。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function returnPromise(){ return new Promise( function(resolve, reject){ setTimeout(()=>{ resolve('success') },3000) }) }
returnPromise().then((result)=>{ result === 'success' })
var result = await returnPromise() result === 'success'
|
如何实现深拷贝
方式一:JSON 来深拷贝
1 2
| var a = {...}; var b = JSON.parse(JSON.stringify(a));
|
缺点:JSON 不支持函数、引用、undefined、RegExp、Date……
方式二:递归拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function clone(object){ var object2 if(! (object instanceof Object) ){ return object }else if(object instanceof Array){ object2 = [] }else if(object instanceof Function){ object2 = eval(object.toString()) }else if(object instanceof Object){ object2 = {} } 你也可以把 Array Function Object 都当做 Object 来看待,参考 https: for(let key in object){ object2[key] = clone(object[key]) } return object2 }
|
如何实现数组去重
方式1:计数排序的逻辑(只能针对正整数)
1 2 3 4 5 6 7 8 9 10 11
| var a = [4,2,5,6,3,4,5] var hashTab = {} for(let i=0; i<a.length;i++){ if(a[i] in hashTab){ }else{ hashTab[ a[i] ] = true } }
console.log(Object.keys(hashTab))
|
方式二:set
###方式三
如何用正则实现 string.trim()
1 2 3
| function trim(string) { return string.replace(/^\s+|\s+$/g, '') }
|
JS 原型是什么?
参考链接:
ES 6 中的 class 了解吗?
参考链接:
如何实现继承