前端关于JavaScript的面试题(二)

这篇博客涵盖了JavaScript面试中的多个重点问题,包括实现add函数的不同调用方式、JavaScript中万物皆对象的理解、多页面间通信的方法、CSS与JS动画的差异、字符串空格的处理方式、new操作符的工作原理、bind、call、apply的区别、数据类型与typeof的返回值、null与undefined的区分、变量未定义判断、数组类型的检测、JSON的常用方法、严格等于与等于的区别、eval的用途及性能问题,以及高效率的jQuery代码示例。
摘要由CSDN通过智能技术生成
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动画的差异
  1. 代码复杂度,js 动画代码相对复杂一些
  2. 动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css动画不能添加事件
  3. 动画性能看,js 动画多了一个js 解析的过程,性能不如 css 动画好
20.请用js去除字符串空格

去除所有空格

str.replace(/\s/g, '')

去除字符串两边空格

str.replace(/^\s+|\s+$/g, '')
// 原生方法
str.trim()
21.new一个对象经历了什么
function Test(){}
const test = new Test()
  1. 创建一个新对象:
const obj = {}
  1. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象
obj.constructor = Test
obj.__proto__ = Test.prototype
  1. 使用新对象调用函数,函数中的this被指向新实例对象
Test.call(obj)
  1. 将初始化完毕的新对象地址,保存到等号左边的变量中
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”);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值