Javascript面试题

本文深入探讨JavaScript的数据类型,包括基本类型与引用类型,详细解析变量声明提升、闭包、继承方式、内置对象及DOM操作。同时,文章还介绍了数组去重、事件处理、this对象的理解等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS 的基本数据类型和引用数据类型

基本数据类型:undefined、null、boolean、number、string、symbol

引用数据类型:object、array、function

JavaScript 有哪些数据类型

6种原始数据类型:

1.Boolean: 布尔表示一个逻辑实体,可以有两个值:true 和 false

2.Number: 用于表示数字类型

3.String: 用于表示文本数据

4.Null: Null 类型只有一个值: null,特指对象的值未设置

5.Undefined: 一个没有被赋值的变量会有个默认值 undefined

6.Symbol: 符号(Symbols)是ECMAScript第6版新定义的。符号类型是唯一的并且是不可修改的

怎么判断不同的JS数据类型

1.typeof 操作符:返回一个字符串,表示未经计算的操作数的类型
typeof 操作符对于简单数据类型,返回其本身的数据类型,函数对象返回 function ,其他对象均返回 Object

2.instanceof: 用来判断A 是否是 B的实例,表达式为 A instanceof B,返回一个Boolean类型的值

3.toString: Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。

undefined 和 null 有什么区别

1.null表示"没有对象",即该处不应该有值
表示现在没有,但是以后可能会有

2.undefined表示"缺少值",就是此处应该有一个值,但是还没有定义
现在没有,以后也不能有

浅拷贝和深拷贝

浅拷贝

// 第一层为深拷贝
Object.assign()
Array.prototype.slice()
扩展运算符 ...

深拷贝

JSON.parse(JSON.stringify())

数组去重的方法

1.ES6 的 Set

let arr = [1,1,2,3,4,5,5,6]
let arr2 = [...new Set(arr)]

2.reduce()

let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.reduce(function(ar,cur) {
  if(!ar.includes(cur)) {
    ar.push(cur)
  }

  return ar
},[])

3.filter()


// 这种方法会有一个问题:[1,'1']会被当做相同元素,最终输入[1]
let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.filter(function(item,index) {
  // indexOf() 方法可返回某个指定的 字符串值 
  在字符串中首次出现的位置
  return arr.indexOf(item) === index
})

变量声明提升

即所有声明变量或声明函数都会被提升到当前函数的顶部。

JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。

JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明

console.log('x' in window);//true
var x;
x = 0;

说明“==”和“===”之间的区别

==”仅检查值相等,而“===”是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。

javascript是面向对象的,怎么体现javascript的继承关系

使用prototype原型来实现。

js中的3种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令式什么?

alert
confirm
prompt

介绍JS有哪些内置对象

数据封装类对象:Object、Array、Boolean、Number、String
其他对象:Function、Arguments、Math、Date、RegExp、Error
ES6新增对象:Symbol、Map、Set、Promises、Proxy、Reflect

DOM 操作——怎样添加、移除、移动、复制、创建和查找节点?

(1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点

(2)添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子节点前插入一个新的子节点

(3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
getElementById() //通过元素Id,唯一性

闭包

闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)

闭包优缺点

优点
1.全局变量可能会造成命名冲突,使用闭包不用担心这个问题,因为它是私有化,加强了封装性,这样保护变量的安全

2.每个模块都可以调用,当程序越来越复杂之后,会带不可预测的危险

缺点
由于闭包是驻留在内存中,会增大内存使用量,使用不当很容易造成内存泄露,降低程序的性能,但是这并不是闭包本身的错误造成的,

如何区分数组和对象

(1)从原型入手,Array.prototype.isPrototypeOf(obj); 利用isPrototypeOf()方法,判定Array是不是在obj的原型链中,如果是,则返回true,否则false。Array.prototype.isPrototype([]) //true
(2)也可以从构造函数入手,利用对向的constructor属性
(3)根据对象的class属性(类属性),跨原型链调用toString()方法。Object.prototype.toString.call(Window);
(4)Array.isArray()方法。

split() join() 的区别

前者是将字符串切割成数组的形式,后者是将数组转换成字符串

数组方法pop() push() unshift() shift()

push()尾部添加

pop()尾部删除

unshift()头部添加

shift()头部删除

call和apply的区别

js数组方法有哪些

1.join() (数组转字符串)
2.push()和pop()(数组尾操作)
3.shift() 和 unshift()(数组首操作)
4.sort()(排序)
5.reverse() (反转数组)
6.concat() (连接两个或多个数组)
7.slice()(数组截取)
8.splice() (数组更新)

防止冒泡和捕获

w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble

默认事件

w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false;

let、var、const的区别

var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用。

let:声明块级变量,即局部变量。 在上面的例子中,跳出for循环,再使用sum变量就会报错

const:用于声明常量,也具有块级作用域 const PI=3.14;

Javascript 如何实现继承?

1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上

function Cat(name,color){
  Animal.apply(this, arguments);
  this.name = name;
  this.color = color;
}

2.实例继承:将子对象的 prototype 指向父对象的一个实例

Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象

function extend(Child, Parent) {
   var p = Parent.prototype;
   var c = Child.prototype;
   for (var i in p) {
      c[i] = p[i];
   }
   c.uber = p;
}

4.原型继承:将子对象的 prototype 指向父对象的 prototype

function extend(Child, Parent) {
    var F = function(){};
     F.prototype = Parent.prototype;
     Child.prototype = new F();
     Child.prototype.constructor = Child;
     Child.uber = Parent.prototype;
}

谈谈 this 对象的理解

1.this 总是指向函数的直接调用者

2.如果有 new 关键字,this 指向 new 出来的实例对象

3.在事件中,this 指向触发这个事件的对象

4.IE 下 attachEvent 中的 this 总是指向全局对象 Window

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值