1、=== 和 == 的区别?
简单来说 === 是严格等, ==是相等
== 比较两个运算数的数值看是否相等
=== 比较两个运算数的数值及 数据类型 看是否相等
比较原则:
值类型之间的比较:只有数据类型相同,且数值相等时才能够相同
值类型与引用类型比较:肯定不相同
引用类型间比较:比较他们的引用值(内存地址)
2、NaN 是什么 NaN == NaN ?
NaN:not a number
//demo1
let a = "abc";
let b = 3;
let c = a/b;
console.log(c); //NaN
console.log(typeof(c)); //number
//demo2
console.log(isNaN(a)); //true
console.log(isNaN(b)); //false
console.log(isNaN(c)); //true
NaN是由于运算的返回结果,不是一个有效的数字。返回的失败的结果
NaN不等于NaN:
NaN与所有的值都不想等,包括自己
3、冒泡排序与选择排序
冒泡:前后两两进行比较,如果符合比较的条件,就交换两个数的位置,直到所有的数据,都符合从小到大条件,结束排序。
// 冒泡排序
let arr = [10, 9, 8, 7, 6, 8];
// 外循环 循环趟数
for (let i = 0; i < arr.length - 1; i++) {
// i=0 4
// i=1 3
// i=2 2
// i=3 1
// 内循环 循环比较次数
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
选择排序:通过比较首先选出最小的数放在第一个位置上,然后在其余的数中选出次小数放在第二个位置上,依此类推,直到所有的数成为有序序列
//选择排序
function select(arr) {
let temp;
for (let i = 0; i < arr.length; i++) {
let k = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[k] > arr[j]) {
k = j;
}
}
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
return arr;
}
let arr1 = [5, 45, 69, 4, 21, 859, 258, 1024, 353];
select(arr1);
for (let i in arr1) {
document.write(arr1[i] + ",");
}
4、JS常用的兼容语法
//1、获取非行内样式
function getStyle(obj, attr) { //获取非行间样式,obj是对象,attr是值
if (obj.currentStyle) { //针对ie获取非行间样式
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, false)[attr]; //针对非ie
}
};
console.log(getStyle(oBox,"font-size"));
### 滚动事件
//2、兼容问题 获取滚动条移动的垂直距离
//let _top = document.body.scrollTop || document.documentElement.scrollTop;
window.onscroll = function(){
//console.log("heihei");
//兼容问题 获取滚动条移动的垂直距离
let _top = document.body.scrollTop || document.documentElement.scrollTop;
console.log(_top);
}
//3、事件对象的兼容
let e = evt||event;
//4、键盘检测兼容
let key = e.keyCode||e.which||e.charCode;
// 5、阻止事件冒泡
e.stopPropagation?e.stopPropagation():e.cancelBubble = true;
// 6、阻止浏览器默认事件
e.preventDefault?e.preventDefault():e.returnValue= false;
//7、事件监听兼容
function addEvent(obj,type,callBack){
if(obj.addEventListener){//非IE版本
obj.addEventListener(type,callBack);
}else{//IE版本
obj.attachEvent("on"+type,callBack);
}
}
addEvent(document,"click",function(){alert("document")});
5、递归函数
一个函数直接或者间接的调用自己本身
function fun(){
console.log("fun是递归函数。");
fun();
}
这个demo中 fun函数就是一个递归函数
但是这个递归函数是一个死循环,因为它没有停止运算的出口。
那如何使用递归
1、在每一次调用自己时,必须是(在某种意义上)更接近于解
2、必须有一个终止处理或计算的出口。就是要有一个标准让函数结束调用函数自身
function age(n){
let c;
if(n==1){
c = 10;
}else{
c = age(n-1)+2;
}
return c; //递归出口,返回一个数字
}