1.js中null和undefined区别
<都是代表没有值>
(1)null表示“没有对象”, 该处不应该有值
(2)undefined表示“缺少值”, 该处应该有值,但是还没有定义
<转为数值也不同>
null转为数值为e,undefined转为数值NaN(不是一个数字)
console.log(Number(null)); console.log(Number(undefined));
(1)什么时候会有null
作为函数的参数,表示该函数的参数不是对象
作为对象原型链的终点
(2)什么时候会出现undefined:
变量被声明了。但是没有赋值,就等于undefined. 调用函数时,应该提供的参数没有提供,该参数就等于undefined。
对象没有赋值的属性,该属性的值为undefined。 函数没有返回值时,默认返回undefined。
2. js八种数据类型
基本数据类型: string/number/boolean/null/undefined/BigInt/symbo1
引用数据类型: object
区别
1、声明变量时的存储分配 基本数据类型存储在栈中,var a=10 引用数据类型存储在堆中, var arr=[1,2,3,4,5,...]
2、不同的内存分配机制也带来了不同的访问机制 不可以直接访问堆内存空间的位置以及直接操作堆内存空间,只能操作对象在栈内存中引用地址基本数据类型直接访问到,引用数据类型访问引用地址,根据引用地址找到堆中实体 3、复制变量时的不同 基本数据类型:var a=1,var b=a,将原始值的副本赋值新的变量 引用数据类型:var obj={name:'张三"}, var obj1=obj,将引用地址赋值给新的变量
var a=[1,2,3,4,5];
var b=a;
var c=a[0];
console.log(b); //[1,2,3,4,5]
console.log(c); //改变数值 1
b[4]=6;
c=7;
console.log(a[4]); //[1,2,3,4,6]
console.log(a[0]); // 1
3.ES6中 let、 const 和 var 之问的用法以及区别
var
1、使用var声明的变量既是顶级交量(顶层对象(window对象)的属性)也是全局变量
2、使用var声明的变量存在变量提升的情况 3、使用var可以对一个变量进行多次声明,后面的声明会覆盖前面的变量声明
4、在函数中再次使用var声明这个变量的时候,这个变量就是局部的,如果不是用var,那就全局的
// 使用var声明的变量既是顶级交量(项层对象(window对象)的属性)也是全局变量 var a=10; console.log(window.a); // 10
console.log(b); // undefined
var b = 10; //声明并且赋值
// 运行过程
// var b;
// console.log(b); // undefined
// b=10;
// 使用var可以对一个变量进行多次声明,后面的声明会覆盖前面的变量声明
var c= 10;
var c= 40;
console.log(c); // 40
//在函数中再次使用var声明这个变量的时候,这个变量就是局部的,如果不是用var,那就全局的
var d=10;
function fun1((){
var d=20;
}
fun1()
console.log(d); //10
let:
1、 let 所声明交量只在let命令所在的代码块中生效let不存在变量提升
2、 let 不允许在相同的作用域下重复声明
let num=18
console.1og(num); // 18
}
// let不存在交量提升
let num1;
console.log(num1); // 报错
// let不允许在相同的作用域下重复声明
num1 = 20 // 报错
const
const声明一个只读的常量,一旦声明,常量的值就不能改变const一旦声明,就必须赋值
除了以上的其他的都和let一样的
// const声明一个只读的常量。一且声明,常量的值就不能改变
const sum =103;
sum = 200;
console.log(sum); // 报错,不能再次赋值
// const一旦声明,就必须赋值
const total;
console.log(total); // 报错,缺少初始值
4.es6 对 promise 的理解以及他的实例方法
promise是异步编程的一种解决方案
三种状态:pending(进行中),fulfi1led(已成功),rejected(已失败)
特点:状态不受外界的影响,只有异步操作的结果,决定当前是哪一种状态
一旦状态改变就不会再变(pending-->fufilled , pending-->rejected)
用法:Promise是一个构造函数,用来生成Promise实例
Promise构造函数接收一个函数作为参数,这个函数有两个参数
const p=new Promise(function(resolve,reject) { resolve函数:将Promise对象的状态从未完成变成成功,在异步操作成功的时候调用,resolve() 返回异步操作的结果,作为参数传递出去 reject函数:将Promise对象的状态从未完成变成失败,在异步操作失败的时候调用,reject()返回异步操作的结果,作为参数传递出去 })
Promise实例方法 const p = new Promise( function (resolve,reject) { setTimeout(O=>{ const time=new Date().getTime(
if( time%2 == 0){
resolve('成功的数据。 time = '+time)
}else{
reject(·失败的数据,time = '+time)
}
},1000)
}) p.then((value)=>{resolved(己成功)的状态 console.log( 成功的' + value); },(reason)=>{rejected(已失败)的状态 console.log( 失败的' + reason); }).catch((value) => {
console.log(value)
}).finally(() => {
console.log('最后的结果')
})
then():当实例状态发生改变的时候的回调函数,放回的是一个新的Promise 实例,也就是Promise 可以链式书写的原因。 catch() :用于指定发生错误的回调函数,一般来说通过 catch 替代 then 中第二个参数 finally() :用来指定不管Promise对象状态最后如何,都会执行的操作
setTimeout(() => { // 例如多个嵌套 // 多个串联嵌套的异步操作形成的回调地狱 console.log(111);
setTimeout(() => {
console.log(222);
setTimeout(() => {
console.log(333);
},3000)
},2000)
},1000)
function fun(ms, val,nextval) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(222) console.log(111);
},ms)
})
} fun(1000).then((value) => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(value);
resolve(333)
},2000);
})
}).then ((value) => { return new Promise((resolve, reject) => { setTimeout(() => { console.1og(value); },3000) })
})
5. ES6中使用Promise封装ajax
return new Promise((resolve, reject) =>{
//创建一个实例对象
let xhr = new XMALHttpRequest();
//新建一个http请求
xhr.open( 'GET", url, true);
//发送http请求
xhr.send(null)
//设置状态的监听函数
xhr.onreadystatechange = function(){
if(xhr.readyState !== 4) return//表示请求完成
//当请求成功或者失败,需要改变promise实例的状态
if (xhr.status >=200 && xhr.status < 300){
resolve(xhr.responseText)/请求结果
}else{
reject(new Error((xhr. statusText))
}
}
//设置错误的监听函资
xhr.onerror = function (){
reject(new Error(xhr.statusText))
}
//设置响应数据的类型
// xhr.responseType - 'json"”
})
}
getJSON( " http://localhost:3000/personalized?1imit-10').then((value)=> {
console.1og(as0w. parse(value));
}).catch((reason) =>{
console.log(reason);
})