1.JavaScript基本类型:
基本数据类型:number,string,boolean,null,undefined
引用数据类型:function,object,array
2.null和undefined区别:
undefined:表示被定义了,但没赋值
null:表示空对象(表示赋值了,但内容为空)
3.如何判断JavaScript数据类型:
typeof:不能识别null 识别undefined时 返回undefined
instanceof:不能用于判断原始数据类型的数据 可以用来判断对象的类型
Symbol.hasInstance:
Symbol.toStringTag:Object.prototype.toString
Array.isArray:判断数组
4、简述创建函数的几种方式?
1.函数声明 function(){}
2.函数表达式 let a = function(){}
3.函数对象方式 let b = new Function()
5、Javascript 创建对象的几种方式?
1.简单对象的创建 使用对象字面量的方式{}
2.用 function 来模拟 class
2.1 创建一个对象 相当于 new 一个类的实例(无参构造函数)
2.2 也可使用有参构造函数来实现
3.使用工厂方式来创建(Object 关键字)
4.使用原型对象的方式 prototype 关键字
5.混合模式(原型和构造函数)
6.动态原型的方式(可以看作是混合模式的一种特例)
6、请指出 JavaScript 宿主对象和原生对象的区别?
原生对象:独立于宿主环境的 ECMAScript 实现 提供的对象
包含:Object ,Function ,Array ,String ,Boolean ,Number ,.....等
内置对象:开发者不必明确实例化内置对象,它已被内部实例化了
同样是 独立于宿主环境 ,而 ECMA-262 只定义了两个内置对象,即 Global 和 Math
宿主对象:B0M 和 DOM 都是宿主对象。因为其对于不同的 宿主 环境所展示的内容不同,其实说白了就是,ECMAScript 官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过 ECMAScript 程序创建的对象
7、JavaScript 内置的常用对象有哪些?并列举该对象常用的方法?
对象及方法:Arguments 函数参数集合
Arguments[] 函数参数的数组
Arguments 一个函数的参数和其他属性
Arguments.callee 当前正在运行的函数
Arguments.length 传递给函数的参数的个数
Array 数组: length 属性 动态获取数组长度
join() 将一个数组转成字符串,返回一个字符串
reverse() 将数组中各元素顺序颠倒
delete 运算符 只能删除数组元素的值,而所占空间还在,总长度没变(arr.length)
shift() 删除数组中的第一个元素,返回删除的那个值,并将长度减 1.
pop() 删除数组中的最后一个元素,返回删除的那个值,并将长度减 1.
unshift() 往数组前面添加一个或多个数组元素,长度要改变
push() 往数组结尾添加一个或多个数组元素,长度要改变
concat() 连接数组
slice() 返回数组的一部分
sort() 对数组元素进行排序
splice() 插入,删除或替换数组的元素
toString() 将数组转换成一个字符串
forEach 遍历所有元素
every 判断所有元素是否都符合条件
sort 排序
map 对元素重新组装,生成新数组
filter 过滤符合条件的元素
String 字符串对象
split() 将一个字符串转成数组
indexOf() 返回一个子字符串在原始字符串中的索引值(从左往右查找) 如没找到,则返回 -1
Boolean 布尔对象
Boolean.toString() 将布尔值转换成字符串
Date 日期时间
Error 异常对象
Function 函数构造器
Math 数学对象
Number 数值对象
Object 基础对象
8. === 和 == 的区别:
===:全等 判断等号两边的值和类型是否相等
==: 等值符 只判断值是否相等
9.JavaScript 中什么情况下会返回 undefined 值?
1.访问声明,但是没有初始化的变量
2.访问不存在的属性
3.访问函数的参数没有被显示的传递值
4.访问任何被设置为 undefined 值的变量
5.没有定义 return 的函数隐式返回
6.函数 return 没有显示的返回任何内容
10.如何区分数组和对象?
1.Array.isArray
2.instanceof
3.constructor
4.Object.prototype.toString.call
11.多维数组降维的几种方法
1.数组字符串化
2.递归
3.Array.prototype.flat()
4. 使用 stack 无限反嵌套多层嵌套数组
5.使用 reduce concat 和递归 无限反嵌套多层嵌套数组
12、怎么判断两个对象相等?
1.判断两个对象是否指向同一内存
2.使用 Object.getOwnPropertyNames 获取对象所有键名数组
3.判断两个对象的键名数组是否相等
4.遍历键名,判断键值是否都相等
13、列举三种强制类型转换和两种隐式类型转换?
强制:转化成字符串 toString() String()
转化成数字 Number() parseInt() parseFloat()
转化成布尔类型 Boolean()
隐式:拼接字符串 + - * / % ==
14、什么是类数组(伪数组),如何将其转化为真实的数组?
伪数组:有数组三要素(下标,元素,长度) 但是不能使用数组的方法
伪数组转为真数组方法:1.array.from()
15、如何遍历对象的属性?
1.遍历自身非继承属性 Object.keys() 方法
2.遍历自身的所有属性 Object.getOwnPropertyNames()
3.遍历自身可继承的属性 for in
16、如何使用原生 JavaScript 给一个按钮绑定两个 onclick 事件?
addEventListener
17、JavaScript 中的作用域、预解析与变量声明提升?
作用域:就是变量的有效范围。在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域
1.全局作用域:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的
2.局部作用域:一般在固定的代码片段可以访问,函数外无法访问
3.块级作用域:代码块可以划分变量的作用域
预解析:1.把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
2.把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
变量提升:定义变量的时候,变量的声明提升到当前作用域的最前面
函数提升:JavaScript 解析器首先会把当前作用域的函数声明提升到当前作用域的最前面
18、变量提升与函数提升的区别?
函数提升的优先级大于变量提升的优先级
19、什么是作用域链?
作用域链:当函数在一个环境中执行时,会创建变量对象的一个作用域链
由子级作用域返回父级作用域中寻找变量,就叫做作用域链
20、如何延长作用域链?
1.try-catch 语句的 catch块 会创建一个新的变量对象
2.with 语句 会将指定的对象添加到作用域链中
21、判断一个值是什么类型有哪些方法?
1.typeof (对于数组,null,对象来说,会统一返回 object)
2.instanceof
3.Object.prototype.toString
22、src 和 href 的区别是?
src:指向外部资源位置,指向的内容将会嵌入到文档中当前标签所在位置
href:指向网络资源所在位置