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