语言基础
1.null & Undefined 区别
javaScript变量声明没有确定类型 弱类型语言
let x;
console.log(x);//undefined
console.log(typeof x);//undefined
let y=null;
console.log(x==y);//true 都为无效的值 内容具有相似性
console.log(x===y); //false 严格比较 数据类型不同
console.log(Number(y)); //0
console.log(Number(x));//NAN
let z=undefined;
console.log(z);//undefined 创建变量可以赋值为 undefined
2,函数作用域 块级作用域
变量作用域:变量可用性范围 分为 全局变量 和局部变量.
全局变量的生命周期是跟着程序走,整个程序结束它才被销毁;局部变量的生命周期是跟着函数走,函数结束它就被销毁
全局变量的命名空间一个页面只有一个,而局部变量的命名空间一个作用域一个,用匿名函数可以解决命名空间问题。如果当局部变量为伪全局变量时,那么生命周期变长了,会造成一定的负面影响并且占据了全局命名空间会造成不可预知的错误。
块级作用域简言之就是使用一对大括号{}包裹的一段代码,通过单独的大括号、if块、while块、for块、try/catch/finallyd等都会产生块级作用域。
函数作用域在函数内部定义的变量或者函数,并且定义的变量或者函数只能在函数内部被访问。在函数执行结束之后,函数内部定义的变量会被销毁。
变量作用域为变量的可用性 范围,可见性和生命周期
function a(){
let x=5; //局部变量
}
function b(){ console.log(x);}
a();
b(); //x is not defined
let x=5; //全局变量
function a(){
x=x+1
}
function b(){ console.log(x);}
a();
b();
ES5 变量声明方式 var,function
var 具有变量提升效果,
console.log(x);//undefined
var x;
console.log(y); //Cannot access 'y' before initialization
let y;
变量提升是发生在代码编译时的行为,把定义的变量或函数提升到顶部 容易造成的问题 1,变量容易在不被察觉的情况下被覆盖掉,2本应该销毁的变量没有被销毁:
块级作用域就是使用大括号包裹一段代码,比如函数,判断语句 循环语句 单独一个{}可以被看做一个块级作用域,
它为该块中存在的声明创建一个单独的范围,在块级作用域中经常使用let/const 定义变量
//变量作用域
let x = 5;
function a() {
x = x + 1;
}
function b() {
console.log(x); //6
}
a();
b();
// 函数作用域:属于这个函数的全部变量都可以在整个函数范围内使用及复用(嵌套的作用域中也可以使用)
///变量提升
// a(); //定义前调用
// function a() {
// console.log('hello world');
// }
// a(); // 定义后调用
var x;
console.log(x); //undefined
x = 1;
// 块级作用域
// let x = 5;
// {
// let x = 6;
// console.log(x); //6
// }
console.log(x);//5
记得在以 “(“、”[“ 、”/“、”+”、”-“ 开头的语句前面都加上一个分号
如果在return、break、continue、throw yield等关键字后面换行,javascript会在换行处填补分号
剩余运算符和展开运算符展现形式一样 ...
箭头函数中不能使用 arguments 参数
剩余运算符将单独的数据值放在一个数组中 场景用于 获取传入参数列表
展开运算符 将数组扩展为单独的数据值 场景用于 数组合并 获取数组中最大最小值
function sum(...nums){ //剩余运算符 ES6 语法
console.log(nums);
}
sum(1,2);//[ 1, 2 ]
sum(1,2,3);//[ 1, 2, 3 ]
sum(1,2,3,4,5);//[ 1, 2, 3, 4, 5 ]
//arguments 伪数组 返回的是一个对象数组 并不是真实数组
function sums(){
console.log(arguments); //获取参数值
}
sums(1,2); //[Arguments] { '0': 1, '1': 2 }
展开运算符
let arr1=[1,2,3,4,5];
let arr2=[...arr1,6,7,8,9];
console.log(arr2);
//计算最大值
let arr=[43,56,3232,56,1,50];
//Math.max 括号当中只能接收Number类型 获取最大值 用展开运算符
console.log(Math.max(...arr));
3,infinity -lnfinity
infinity 是一个特殊的整数值,大于任何值,它是javaScript中可用的最高值
无穷大的两种情况:
正无穷大,用于存放表示正无穷大的数值 POSITIVE_INFINITY
负无穷大,用于存放表示负无穷大的数值 NEGATIVE_INFINITY
console.log(Number.POSITIVE_INFINITY); //Infinity
console.log(Number.NEGATIVE_INFINITY);//-Infinity
console.log(9e3);//9000 e表示1后面有多少个0 9*1000
console.log(-9e4);//-90000
//所得到的结果不符合64位的格式 输出
console.log(9e400); //Infinity
console.log(-9e400); //-Infinity
console.log(Number.MAX_VALUE); //返回JS最大值 //1.7976931348623157e+308
console.log(Number.MIN_VALUE); //返回JS最小值E_INFINITY); //-Infinity
console.log(1/0)//Infinity
4.NAN
NAN 是一个全局属性,表示NOT-A-Number
执行非数值操作时会得到此错误 每个NAN 不与自身相等
通常更推荐使用isFinite(),因为它不仅检查NaN,还检查正无穷大和负无穷大;
isFinite() 验证值的有效性
let a=5;
let b='vaule';
console.log(a*b);//NAN
console.log(isFinite(a*b)); //false
console.log(isFinite(5*2)); //true
console.log(isFinite(Number.MAX_VALUE*2));//false
if(isNaN(a*b)=== false){
//有效值..
}
if(!isNaN(a*b)){
//有效值..
console.log("valid");
}else{
console.log('Invalid');
}
console.log(a*b==NaN); //false
console.log(NaN==NaN); //false
isNaN() isFinite()区别: