一、js内置的数据类型有哪些?
-
Number
即数字,包括整数、浮点数和0;(正数、负数); NaN是一个特殊的数字类型,即不是数字的数字,一般出现NaN可能是运算的数值类型有问题; let a = 100 console.log(undefine + 5)
-
String
字符串:字符串的值必须用引号(单双均可,必须成对)扩起来。 let a = 'abc'
-
Boolean
布尔值(真 / 假): true/false 是 JS 里的特殊关键字,无需引号。 let a = true console.log(true == 1); //true console.log(true === 1); //false console.log(false == 0); //true console.log(false === 0); //false
-
Array
数组,是一个容器,顺序表,有索引,有长度; let a = [1,3,5,2,4,6]
-
Object
JS中一切皆对象,对象拥有自己的属性、方法;一般分为内建对象和自定义对象; 自定义对象定义方式: obj = { a: 1, b: 'abc', c: function () { console.log('test'); }, d: [1, 2, 3] }
-
Symbol
-
undefine
变量声明未赋值的;对象未定义的属性 var a,b,c console.log(a,b,c)
-
null
类似于python中的none
二、箭头函数与普通函数有什么区别?
- this指针指向,普通函数this指针指向的是global,而箭头函数的指针指向取决于上层环境。
//普通函数this指针指向的是global,但是使用对象.方法调用的时候,有动态方法绑定;
//当调用这个函数,返回一个inner内层函数的时候,此时的内层函数为一个普通函数,无动态方法绑定,所以inner的this指针指向global;
//动态方法绑定
foo = function () {
console.log(this === global);
console.log(this)
}
let obj = {
a:1,
b:2,
foo
}
obj.foo()
foo = function () {
function inner(){
console.log(this === global);
console.log(this);
}
return inner
}
let obj = {
a:1,
b:2,
foo
}
obj.foo()() //foo()返回的是inner普通函数(无动态方法绑定),加()调用;
在箭头函数中,this取决于上层环境,所以在对象.方法调函数时,返回的内层普通函数的this,依然是这个对象;(因为上层的环境也就是外层函数有方法绑定)
foo = function () {
let inner = () => {
console.log(this === global);
console.log(this);
}
return inner
}
let obj = {
a:1,
b:2,
foo
}
obj.foo()()
- arguments:普通函数会将所有参数放入arguments键值对对象中,而箭头函数没有arguments,箭头函数如果需要过去全部参数,则需要使用剩余参数解构;
let foo = function(){
console.log(arguments);
}
foo(1,3,5,[2,4,6]) //返回arguments二元组对象
//箭头函数只能使用剩余参数解构,...args后面不能跟任何参数
let foo = (...args) => {
console.log(args);
}
foo(1,3,5,[2,4,6]) //返回一个大数组把元素都包起来
-
new构造时,普通函数可以作为一个类然后new进行实例的构造,而箭头函数不行;
-
return的使用,普通函数写了return,返回值就是return的值,没有就是return undefine;箭头函数如果只有一条语句且不写{},他的返回值就是执行语句的返回值;如果有{}的情况下return的值就是返回值;
三、列举可能影响this指向的情况
1、在对象.方法调用时,返回一个内层函数,这个函数的this指向的是global;
解决方式:
#、 手动传入需要的数据
#、使用apply或者super来修正this指针
#、内层函数使用箭头函数
四、写一个Promise的例子
var myPromise = new Promise(
(resolve, reject) => {
setTimeout(
() => {
console.log('sucuess')
let obj = {
name:'zhangzhongha',
age:27,
sex: 'manle'
}
resolve(obj)
}, 5000
)
}
)
async function getrespone(){
console.log('11111111111111111111')
var respone = await myPromise //类似于yield,函数等待myPromise,成功以后会返回数据;
console.log('22222222222222222222')
console.log(respone); //返回resolve中的值
console.log('33333333333333333333');
}
console.log('44444444444444444444444');
getrespone()
执行顺序:
4 (创建myPromise对象,等待5S以后返回成功;并创建异步函数,打印4然后调用)
1(执行getrespone函数,打印1,碰到await,函数停止执行;)
wait myPromise语句成功,myPromise中定义需要打印sucess
2(myPromise返回成功以后,打印2)
respone为resolve的返回值obj对象
3 继续打印3