1.call()和apply()的含义和区别?
含义:
call() :调用一个对象的方法,用另一个对象替换当前对象。例如:B.call(A,args1,args2);就是A对象调用B对象的方法。
apply() :调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A,arguments);就是A对象应用B对象的方法。
相同点:
方法的含义是一样的,即方法功能是一样的。
第一个参数的作用是一样的
不同点:
传入的列表形式不一样。
call可以传入多个参数;
apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入。
2.求数组的最大值
var nums = [13,54,567,83,-1,-45];
//apply
var big = Math.max.apply(this,nums);
console.log(big);
//call
var big2 = Math.max.call(this,13,52,99);
console.log(big2)
3.split()和join()的区别
join() :用于把数组中的所有元素通过指定的分隔符进行分隔放入一个字符串
split() : 用于把一个字符串通过指定的分隔符进行分隔成数组
4.如何判断当前脚本运行在浏览器还是node环境?
通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中。
5.数组方法pop() push() unshift() shift()
pop():从后面删除一个元素,返回值为被删除的值;
arr.push():从后面添加元素,返回值为添加完后的数组长度。
arr.unshift():从前面添加元素,返回值为添加完后的数组长度。
arr.shift():从前面添加一个元素,返回值为被删除的元素。
6.foo=foo||bar,这行代码是什么意思?为什么要这样写?
这种写法称为短路表达式,相当于
var foo;
if(foo){
foo =foo;
}else{
foo =bar;
}
//常用于函数参数的空判断
7.javascript中的this指向问题
全局环境,普通函数(非严格模式) 执行 window
普通函数(严格模式)执行undefined
函数作为对象方法及原型链指向的就是上一级的对象
构造函数指向构造的对象
DOM事件中指向触发事件的元素
8.去除字符串里的重复字符
//去除字符串重复内容
var arr = [...new Set("abbacc")].join("");
console.log(arr);
9事件绑定的方式
//1.嵌入dom
<button onclick="func">点击</button>
//2.直接绑定
btn.onclick =function(){}
//3.事件监听
btn.addEventListener("click",function(){})
10.target和currentTarget的区别
event.target : 返回触发事件的元素
event.currentTarget :返回绑定事件的元素
11.请用代码写出(今天是星期 x)其中 x 表示当天是星期几,如果当天是星期一,输出应该是"今天是星期一"
var days = ['日','一','二','三','四','五','六'];
var date = new Date();
console.log('今天是星期' + days[date.getDay()]);
12.null 和 undefined 的区别?
首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。
undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null
主要用于赋值给一些可能会返回对象的变量,作为初始化。
undefined 在 js 中不是一个保留字,这意味着我们可以使用 undefined 来作为一个变量名,这样的做法是非常危险的,它
会影响我们对 undefined 值的判断。但是我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。
当我们对两种类型使用 typeof 进行判断的时候,Null 类型化会返回 “object”,这是一个历史遗留的问题。当我们使用双等
号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。
13.isNaN 和 Number.isNaN 函数的区别?
函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会
返回 true ,会影响 NaN 的判断。
函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,这种方法对于 NaN 的判断更为
准确。
14.Array 构造函数只有一个参数值时的表现?
Array 构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度(length),而非只充当数组中的一个元素。这样
创建出来的只是一个空数组,只不过它的 length 属性被设置成了指定的值。
构造函数 Array(…) 不要求必须带 new 关键字。不带时,它会被自动补上
15. 什么情况下会发生布尔值的隐式强制类型转换?
-
if (…) 语句中的条件判断表达式。
-
for ( … ; … ; … ) 语句中的条件判断表达式(第二个)。
-
while (…) 和 do…while(…) 循环中的条件判断表达式。
-
? : 中的条件判断表达式。
-
逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操作数(作为条件判断表达式)。
16.如何将字符串转化为数字,例如 ‘12.3b’?
1.使用 Number() 方法,前提是所包含的字符串不包含不合法字符。 -
使用 parseInt() 方法,parseInt() 函数可解析一个字符串,并返回一个整数。还可以设置要解析的数字的基数。当基数的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
-
使用 parseFloat() 方法,该函数解析一个字符串参数并返回一个浮点数。
4.使用 + 操作符的隐式转换。
17.什么是闭包,为什么要用它?
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以
访问到当前函数的局部变量。
闭包的第一个用途是使我们在函数外部能够访问到函数内部的变量。通过使用闭包,我们可以通过在外部调用闭包函数,从而在外
部访问到函数内部的变量,可以使用这种方法来创建私有变量。
函数的另一个用途是使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以
这个变量对象不会被回收。
其实闭包的本质就是作用域链的一个特殊的应用,只要了解了作用域链的创建过程,就能够理解闭包的实现原理。
18.documen.write 和 innerHTML 的区别?
document.write 的内容会代替整个文档内容,会重写整个页面。
innerHTML 的内容只是替代指定元素的内容,只会重写页面中的部分内容。
19.mouseover 和 mouseenter 的区别?
当鼠标移动到元素上时就会触发 mouseenter 事件,类似 mouseover,它们两者之间的差别是 mouseenter 不会冒泡。
由于 mouseenter 不支持事件冒泡,导致在一个元素的子元素上进入或离开的时候会触发其 mouseover 和 mouseout 事件,但是却不会触发 mouseenter 和 mouseleave 事件。
20.let 和 const 的注意点?
1.声明的变量只在声明时的代码块内有效
2.不存在声明提升
3.存在暂时性死区,如果在变量声明前使用,会报错
4.不允许重复声明,重复声明会报错