16.实现add函数,让add(a)(b)和add(a,b)两种调用结果相同
function add(a, b) {
if (b === undefined) {
return function(x) {
return a + x
}
}
return a + b
}
17.js中万物皆对象你认为对么
我认为是对的,在JS中有原生函数、基本数据类型,它们的原型最终还是对象。
可以看看本文的原生函数
18.多个页面之间如何进行通信
有如下几个方式:
- cookie
- web worker
- localeStorage和sessionStorage
- url传参
19.css动画和js动画的差异
- 代码复杂度,js 动画代码相对复杂一些
- 动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css动画不能添加事件
- 动画性能看,js 动画多了一个js 解析的过程,性能不如 css 动画好
20.请用js去除字符串空格
去除所有空格
str.replace(/\s/g, '')
去除字符串两边空格
str.replace(/^\s+|\s+$/g, '')
// 原生方法
str.trim()
21.new一个对象经历了什么
function Test(){}
const test = new Test()
- 创建一个新对象:
const obj = {}
- 设置新对象的constructor属性为构造函数的名称,设置新对象的
__proto__
属性指向构造函数的prototype对象
obj.constructor = Test
obj.__proto__ = Test.prototype
- 使用新对象调用函数,函数中的this被指向新实例对象
Test.call(obj)
- 将初始化完毕的新对象地址,保存到等号左边的变量中
22.bind、call、apply的区别
bind、call、apply可以改变被调用函数中的this指向。
call和apply其实是一样的,区别就在call需要一个个传参,而apply可以入参一个数组。
call和apply都是在调用时触发指定的方法,同时改变指定方法中的this指向。而bind是返回一个已经修改this指向后的新函数,如果要触发该方法,我们需要手动调用。
const newFunc = sayHi.bind(obj)
newFunc() // Hi! Tom
23.JS的数据类型有哪些?typeof运算符的执行结果都有哪些数据类型?
数据类型主要包括两部分:
1.基本数据类型: Undefined、Null、Boolean、Number和String
2.引用数据类型: Array 、Object
typeof运算符的结果类型:number,string,boolean,object,function,undefined
24.null,undefined 的区别?
null表示一个对象被定义了,值为“空值”;
undefined 表示不存在这个值(没有定义)。
ull和undefined分属不同的类型,未初始化定义的值用typeof检测出来是"undefined"(字符串),而null值用typeof检测出来是"object"(字符串)。
实际上,undefined值是派生自null值的,ECMAScript标准规定对二者进行相等性测试要返回true,即
alert(null == undefined); // true
25.怎么判断一个变量没有被定义
typeof bianliang ==”undefined”
26.怎么判断一个变量arr的话是否为数组(此题用typeof不行)
//1.通过instanceof来判断
//instanceof : 作用判断某一个变量是否是指定类型的变量,返回结果是true false
function isArray (obj) {
return obj instanceof Array;//返回true或者false
}
var obj1 = [1,2,3]
var obj2 = {
name:"zhangsan",
age:14
}
console.log(isArray (obj1))==>true
console.log(isArray (obj1))==>false
//2.通过构造函数来判断是否是数组
console.log(obj1.constructor==Array)
//3.通过原型的toString()方法阿来判断
function isArray(o){
return Object.prototype.toString.call(o)== '[object Array]';
}
console.log(isArray(ary));
27.描述下JSON对象的两个很重要的方法
JSON.parse() //JSON字符串转换为JSON对象
JSON.stringify() //JSON对象转化为字符串
28.“ ===”、“ ==”的区别?
1.对于基本数据类型而言
==,当且仅当两个运算数相等时,它返回 true,即不检查数据类型
===,只有在无需类型转换运算数就相等的情况下,才返回 true,需要检查数据类型
2.对应引用类型而言
== 判断内存地址是否一致
29.eval是做什么的?
它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval(’(’+ str +’)’);
30.简单jQuery:请写出代码,ul标签下面有1000个li,写一个性能最高的方式实现,在点击li后,输出li的内容
//使用事件委托的方式给ul绑定点击事件
$(“ul”).on(“click”,”li”,function(){
$(this).html(“hit”);
})